使用Xcode 10.2 + iOS 12.2的iOS应用缓慢启动

Luk*_*cka 5 ios swift ios12 swift5 xcode10.2

我有一个非常奇怪的问题,似乎是由最新的Xcode 10.2编译引起的。

我注意到我的应用启动时间变得非常糟糕(慢了3倍),这仅是由于使用Xcode 10.2(.x)构建并在iOS 12.2上运行而引起的。当在较旧的iOS(12.0)上运行或使用针对iOS 12.2的Xcode 10.1编译时,相同的代码修订版可以正常运行。

延迟甚至发生在main()被调用之前。从根本上说Bootstrapping com.myapp.something with intent foreground-interactive,控制台说出与main()被叫之间的延迟是所测量的时间开始增加的地方。

应用设置(快速):

  • 混合目标Swift + Obj-C
  • 使用内部框架进行代码分离
  • 在框架上使用CocoaPods(1.5.3)
  • 在运行时加载了约35个内部框架(内部+主要是CocoaPods)

这是发生了什么

旧代码修订版(Swift 4.2)-较旧的版本之一,可以正常工作,然后使用Xcode 10.1进行编译

该表显示了使用Xcode 10.2进行编译对应用启动时间(开始出现状态栏的第一帧的那一刻)的影响。

|            | iOS 12.0 | iOS 12.2 |
|------------|----------|----------|
| Xcode 10.1 |       1x |    1.25x |
| Xcode 10.2 |       1x |       3x | <-- 
Run Code Online (Sandbox Code Playgroud)

上次OK发行版(iOS 12.0 / Xcode 10.1)的启动时间被认为是1倍,其余时间是相对于它的。我们在这里谈论秒(减去3s->接近9s)。

仅在全新安装时才会发生此重大延迟。随后的每次启动都很快。

最新代码(Swift 5) -所有代码均已迁移到Swift 5,所有CocoaPods已更新为最新的Swift 5兼容版本,项目已更新为Xcode 10.2设置

与Swift 5之前的情况非常相似。因此,Swift 5本身似乎不是问题。


编辑1:

时间分析器发现初始化时间大大变慢了。

事实证明_dyld_start(动态框架的加载)慢了约35倍

|            | _dyld_start time |
|------------|------------------|
| Xcode 10.1 |             0.2s |
| Xcode 10.2 |             7.0s |
Run Code Online (Sandbox Code Playgroud)

这意味着与Xcode 10.2 + iOS 12.2有关的问题会导致动态框架的加载速度大大降低。

在将约35个动态框架(大多数是CocoaPods)加载到运行时的情况下,性能下降似乎很大。不知道为什么改变了...


由于此问题仅发生在iOS 12.2 + Xcode 10.2(已支持Swift 5)上,我想知道此问题是否可能与ABI稳定性有关。对我来说没有意义的是,即使在使用Xcode 10.2进行编译的Swift 5迁移之前的代码中,也会发生这种情况。

到目前为止我尝试过的是:

  • 更新到最新的CocoaPods 1.7.0.rc.2-没有影响
  • 使用时间分析器进行测量

编辑2:

似乎是由动态链接器引起的。我们进行了一些调查,并发现在加载框架时,链接似乎在iOS 12.2上使用了不同的实现。

从iOS 12.2开始,在载入(中的ImageLoader::)时,在Instruments中有很多“递归” 的提法,看来递归在那儿出错了。堆栈跟踪似乎非常错误(请参见下面的屏幕截图)。

Profiler stacktrace屏幕截图

我猜这里唯一的解决方法是删除框架并直接编译或使用静态库。

任何有关如何继续使用框架的帮助/想法都值得赞赏!谢谢!


编辑3:

在第一个iOS 13 Public beta上似乎不再发生此问题。

测量(下面的设置)告诉我,在iOS 12.3.1上启动相同的代码修订所需的时间是在iOS 13上的大约三倍。

在我看来,这确实是iOS 12.x上的错误。鉴于iOS 13即将发布的事实,我认为iOS 12.x不会再有任何修复(导致诸如iPhone 6之类的设备掉落……)。

测试设置:

  • 运行完全相同的代码(Swift 5,Xcode 11 beta 2)
  • 在相同的iPhone型号上运行(iPhone 6S 16GB)
  • 设备重启后冷启动应用
  • 装有iOS 12.3.1(最新稳定版)和iOS 13(首次公开测试版)的设备