iOS启动速度缓慢问题

4

我有一个Swift项目,在使用DYLD_PRINT_STATISTICS进行测量时,我发现有1.0秒的预初始化时间,其中70%是动态库链接。

有没有处理这个问题的干净且安全的方法?


Cocoapods,我觉得,你用过吗? - J. Doe
很可能是相关的框架。没有更详细的信息,我就不能给出更具体的答案。话虽如此,WWDC 2017 Session 对此问题的解释相当详尽。 - Brandon Bradley
@J.Doe 的确是Cocoapods。但如果我手动添加库,问题也无法解决,因为动态链接总会以某种方式存在。我已经找到了将所有pods转换为静态库的解决方案。但在我看来,这并不是一个很好的解决方案。 - Roma
@BrandonBradley 谢谢你提供的链接,我会去查看的。有哪些信息可能会有帮助?我会提供的。 - Roma
@Roma 我突然想到,你很可能没有运行macOS High Sierra beta版本,这也是本次会话的主题(我的错)。相反,我建议你观看去年WWDC的优化应用程序启动时间。这个讲座最有用的部分可能从27:30开始。该会话演示了一个启动过慢的应用程序,并将其速度显著提高。至于具体细节,我指的是库的数量、原始启动时间、是否使用ObjC / C++以及是否可以访问库源代码。 - Brandon Bradley
@BrandonBradley 谢谢你提供的第二个链接。我明白我的问题在于cocoapods和dylib。所以,需要解决的问题是如何更好地让它们协同工作。 - Roma
1个回答

2
根据苹果公司在2016年WWDC会议上有关优化应用程序启动时间的讲座,无论其大小如何,具有大量动态链接库会严重减慢应用程序启动时间。
为了解决这个问题,可以将几个动态库合并成一个单独的库。如果它们已经是静态库,则可以使用libtool将它们组合,使用this SO answer中的命令。但是,如果它们不是静态的,则必须能够访问它们的源代码才能将它们组合起来。如果源代码可访问,则只需将代码从一个库复制到另一个库,并使用生成的库即可。
当然,将不同的库合并为一个库对于开发人员来说肯定是很不方便的。为了解决这个问题,Xcode允许在设置不同标志(即RELEASE和DEBUG)时链接不同的库,如在这个论坛中所描述的那样
如果可能的话,最好合并静态库,因为合并过程的错误率要低得多。 CocoaPods 允许用户在其项目中使用静态库

1
请注意,自那时以来,加载时间已经得到了改善。延迟加载dylibs而不是从您的appdelegate引用整个应用程序可以减少应用程序变得响应所需的时间。 - Jano
Jane,虽然它可能已经得到了改进,但如果您正在引入AWS和其他几个库,动态库的数量可能会激增,并导致非常长的启动时间。当然,没有办法自己将它们编译成静态库。这绝对又成为了一个问题... - rcw3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接