1.启动时间的计算
一个app的启动时间可以划分为两部分:main执行之前的时间+mian执行之后的时间(main函数到第一个界面渲染完的时间)。
完整的启动时间的划分:
t1:main函数执行之前 冷启动
t2:main函数执行到applicationDidFinishLaunching执行完成
t3:app完成所有本地数据的加载并显示在界面上
t4:app发送网络请求并将数据显示在界面上
t1+t2决定了用户需要多长时间能看到主视图
t1+t2+t3决定了用户需要多长时间能看到有用的信息
t1+t2+t3+t4决定了用户用多长时间能看到所有想要的信息
我们这里主要讨论的是t1和t2的优化!
2.为什么要优化t1
冷启动就是在app被kill掉以后,从头开始启动消耗的时间,对于一些小型的app来说,优化冷启动时间是没有必要的,冷启动时间的优化对于大的app(动态库很多,类很多)来说是非常重要的。main函数执行之前消耗的时间与下面几个因素有关:
动态库的数量,动态库加载的越多启动越慢。
objc类的数量,数量越多启动越慢。
构造函数数量,数量越多,启动越慢。
静态对象越多加载越慢。
load越多,启动越慢。
cocoapods 里引用的第三方框架数量
3.冷启动的过程和优化
冷启动时间的长度是可以在Xcode里打印出来的,设置环境变量DYLD_PRINT_STATISTICS为yes,勾选“Dynamic Library Loads”,这样在程序运行的时候就可以看到冷启动时间。
冷启动大体可以分为以下几个过程:Load dylibs => Rebase/Binding => ObjC => Initializers
翻译成汉语就是:动态库的加载->指针重定位->ObjC类的初始化->其他的初始化
针对这几个过程能做的优化其实是有限的,主要还是要根据系统自身的特点,去制定优化的目标,如果说系统对程序启动时间要求很高,要求很快就启动起来,那可以适当的减少动态库的数量,减少类的数量。
扫描不再使用的类,动态库,函数,把他们删除。
系统级的动态库的加载是不需要优化的,因为他们已经高度优化了。重点是开发者自己继承到程序的动态库,对此Apple建议减少在App里开发者的动态库集成或者有可能地将其多个动态库最终集成一个动态库后进行导入, 尽量保证将App现有的非系统级的动态库个数保证在6个以内。
尽量不要使用load方法,用initializer方法去代替,因为所有类和分类的load方法都在main函数执行之前执行,增加了t1部分的时长。那些需要在整个程序执行过程中只做一次的操作都放到dispatch_once方法里去做。
4.t2部分的优化
t2部分的时间是main函数开始执行到applicationDidFinishLaunching方法执行结束,执行完之后用户就可以看到第一个主界面了。
这部分的优化核心在于优化applicationDidFinishLaunchingWithOptions方法,这个方法里一般做什么事呢,一般都是一些第三发sdk的配置,rootViewController的设置。
⚠️:在applicationDidFinishLaunchingWithOptions这个方法里,方法的执行顺序很重要,因为在这个方法里面要先执行控制器的viewDidLoad方法,这个方法才能执行完,执行完了才能去渲染界面。所以如果viewDidLoad方法里做了很多的事,那么app的启动到渲染第一个界面的时间间隔非常长。
对于这个方法的优化思路:把要处理的时间分类,那些必须在app一打开就初始化的内容放到applicationDidFinishLaunchingWithOptions方法里初始化。
参考:将初始化分为三个类型:
日志、统计等必须在 APP 一起动就最先配置的事件
项目配置、环境配置、用户信息的初始化 、推送、IM等事件
其他 SDK 和配置事件
对于第一类,由于这类事件的特殊性,所以必须第一时间启动,仍然把它留在 didFinishLaunchingWithOptions 里启动。第二类事件,这些功能在用户进入 APP 主体的之前是必须要加载完的,所以我们可以把它放在第二批,也就是用户已经看到广告页面,再进行广告倒计时的时候再启动。第三类事件,由于不是必须的,所以我们可以放在第一个界面渲染完成以后的 viewDidAppear 方法里,这里完全不会影响到启动时间。
5.对于第一个界面渲染的优化
渲染第一个界面的时候,先显示一个空壳的界面,用户不会觉得界面卡住了,然后把请求数据,加载数据,解析等操作放到viewDidAppear方法来做,因为如果都放到viewDidLoad方法里那就会一直执行didFinishLaunchingWithOptions方法不会去渲染第一个界面,用户可能觉得应用卡住了。
这一部分参考了网上很多优秀的文章,记录一下
参考文章:
优化 App 的启动时间 这个是杨萧玉讲的,讲了很多的底层知识不太好理解
[iOS]一次立竿见影的启动时间优化 这个里讲的t2的优化很详细
iOS App 启动性能优化 这个都讲了,又具体又全面
WWDC 之优化 App 启动速度 这个主要讲t1的优化,比较泛泛
Optimize App Startup Time 自己发现的一个iOS独立开发者的博客,很开心