点击下方公众号卡片,关注我,每天分享一个关于 iOS 的新知识
前言
昨天的文章讲了苹果在 iOS 15 出的预热启动,感兴趣的可以去读一下,今天来讲一讲启动速度优化的一些小技巧。
启动时间是衡量 App 性能的一个重要指标,苹果建议冷启动时间不要超过 400ms 为佳。
一般我们说的启动时间是指从应用进程启动到第一帧渲染之间的总时间,首先我们先弄清楚启动主要分为几个阶段:
-
Pre Runtime Init: 从 App 进程启动到第一个 +load() 函数调用
-
Pre Main: 从第一个 +load() 函数调用到 main() 函数调用
-
UIKit and Application Init: main() 函数调用 didFinishLaunching 方法调用
-
Initial Frame Render: didFinishLaunching 方法调用到第一帧渲染
详细启动过程可以看苹果文档给的这张图:

优化技巧
1、多使用静态库,少使用动态库
动态加载器 ( dyld ) 加载应用程序的可执行文件,并检查可执行文件中的 Mach 加载命令以查找应用程序所需的框架和动态库。然后,它将每个框架加载到内存中,并解析可执行文件中的动态符号以指向动态库中的适当地址。
因为这个阶段是在启动时完成的,也就意味着动态库越多,启动时间越慢。
可以挨个检查所有的动态库,然后认真想一下,真的需要这个库吗?如果可以删掉或者有别的方案可以代替,就把这个动态库删掉吧 。如果真的无法删除,也可以考虑能否从动态库转成静态库。
系统的动态库不需要替换。
2、Cocoapods 中的源码库转为静态库
默认情况下,通过 CocoaPods
添加的第三方源码库都为动态库,因为在 Xcode 9 之前,不支持 Swift
静态库编译,CocoaPods
的 Profile
中会默认添加 use_frameworks!
标记,要转成静态库,只需要把 use_frameworks!
改成 use_frameworks! :linkage => :static
。
修改完之后重新 pod install
一下,所有的第三方源码库编程了静态库,如果你使用的库够多,这将为启动速度带来非常大的提升。
3、删除 +load 方法
可以在项目全局搜索 + (void)load
,看看都有哪些地方用到了这个方法,因为这个方法是在启动阶段运行的,因此要优化启动速度,必须要把这里的代码干掉,考虑把相关代码移动到启动成功之后。
4、耗时操作移后执行
这一步主要是优化 AppDelegate
的 didFinishLaunching
方法到首帧渲染成功之间的逻辑。
首先要认认真真整理一下,在这期间都有哪些逻辑,1、2、3、4 全都列出来,然后排列一下哪一些必须在这期间完成,哪一些可以推迟到启动成功之后。这些任务可以大致分为三种:
-
必须在
didFinishLaunching
中完成 -
启动期间不依赖,可以在启动成功后加载
-
可以在使用到的时候再加载(懒加载)
然后就可以在 didFinishLaunching
中完成 1,在首帧加载成功后(可以认为是第一个控制器的 viewDidAppear)完成 2,剩下的任务在业务使用到的时候再去加载。
5、能放子线程的放子线程
所有在主线程执行的任务都可以考虑是否能放在一个单独的子线程去完成,这样就可以把主线程腾出来高效的去做其他任务。
总结
以上几个步骤的优化都是启动耗时的大头,如果你的项目没有做过相关的优化,按照我的步骤优化完之后应该能减少不少的启动时间。
这里每天分享一个 iOS 的新知识,快来关注我吧
本文同步自微信公众号 "iOS新知",每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!