App 启动时
一般app分为冷启动和热启动
- 冷启动: app点击启动前,它的进程不在系统里,需要系统新创建一个进程分配给它启动
- 热启动,app在冷启动后用户将app退到后台,app的进程还在系统中的情况下,用户重新启动进入app的过程,当然这个过程做的事情非常少
因此一般app启动速度都是指冷启动的优化
用户能感知到启动慢,其实都是发生在主线程上。而主线程慢的原因有很多,比如在主线程上执行大文件读写操作,在渲染周期中执行大量计算等。
app启动时的过程(用户点击app开始,到用户看到第一个界面之间的时间):
- main()函数执行之前;
- main()函数执行之后;
- 首屏渲染完成后。
main()函数执行之前
在main()函数执行前,系统主要会做以下几件事:
- 加载可执行文件(app的.o文件的集合)
- 加载动态链接库,进行rebase指针调整和bind符号绑定
- Objc 运行时的初始处理,包括Objc相关类的注册,category注册,selector唯一性检查
- 初始化,包括了执行 +load()方法,attribute((constructor)) 修饰的函数的调用,创建c++静态全局变量
因此在这个阶段,对于优化启动速度如下: - 减少动态库加载
- 加少加载启动后不会去使用的类或方法
- +load() 方法里的内容可以放到首屏渲染完成后在执行,或使用 +initialize() 方法替换掉。
- 控制 C++ 全局变量的数量
main() 函数执行后:
main() 函数执行后的阶段,是指从main() 函数执行开始,到AppDelegate 的 didFinishLaunchingWithOptions 方法里首屏渲染相关方法执行完成。
首页的业务代码都是要在这个阶段(渲染前执行) - 首屏初始化所需配置文件的读写操作
- 首屏列表大数据的读取
- 首批渲染的大量计算
因此梳理出哪些时首屏渲染必要的初始化功能,哪些是app启动必要的初始化功能,哪些是只需要在对应功能开始使用时才需要初始化的
首屏渲染完成后
首屏渲染后的阶段,主要完成的是,非首屏其他业务服务模块的初始化,监听的注册,配置文件的读取等,也就是 didFinishLaunchingWithOptions 作用域内执行首屏渲染之后所有方法执行完成
这个阶段用户已经能够看到app的首页信息
总结
- main() 函数开始执行后渲染完成前只处理首屏相关的业务,其他无关的业务放在首屏渲染完成后去做
- 在首屏渲染完成前主线程中一个耗时的操作滞后或者通过异步执行
网友评论