App启动速度优化
App 冷启动主要分为三个阶段
main() 函数执行前
main() 函数执行后
首屏渲染完成后
main() 函数执行前
系统主要做以下几件事:
- 加载可执行文件(App 的.o 文件集合)
- 加载动态链接库,进行 rebase 指针调整和 bind 符号绑定
- Objc 运行时的初始化处理,包括 Objc 相关累的注册,category 注册,selector 唯一性检查
- 初始化,包括了执行 +load() 方法,attribute((constructor)) 修饰的函数的调用,创建 C++ 静态局部变量
响应优化的方向有:
- 减少动态库加载,每个库本身都有依赖关系,在使用动态库数量将多时,尽量将多个动态库进行合并。
- 减少加载启动后不会去使用的类或者方法
- +load() 方法里的内容可以放到首屏渲染完成后再执行,或使用 +initlalize() 方法替换掉。因为,在一个 +load() 方法里,进行运行时方法替换操作会带来 4 毫秒的消耗
- 控制 C++ 全局变量的数量
main() 函数执行后
指的是从 main() 函数执行开始,到 appDelegate 的 didFinishLaunchingWithOptions 方法里首屏渲染相关方法的执行完成。
首页的业务代码都在这个阶段,包括:
- 首屏初始化所需的配置文件的读写操作
- 首屏列表大数据的读取
- 首屏渲染的大量计算等
优化:各类SDK的初始化工作,应该放在合理的位置,而不是全都在 didFinishLaunchingWithOptions 中。只有那些 App 启动必要的初始化功能,才应该在 didFinishLaunchingWithOptions 中被执行。