要想知道 如何优化 就要知道 App 启动的时候都做了什么事情.
一般情况下, App 启动 分为 冷启动和热启动
· 冷启动是指, App 点击启动前, 他的进程不在系统里面. 需要 系统新创建一个进程 分配给他, 启动的过程. 这是一次完整的启动过程.
· 热启动是指, App 在冷启动后用户将App 退到侯丹, 但是 App 的进程还在系统里的情况下, 用户重新启动进入App的过程, 这个过程做的事情非常少.
用户能感知到的启动慢,其实都发生在主线程上。而主线程慢的原因有很多,比如在主线程上执行了大文件读写操作、在渲染周期中执行了大量计算等。但是,有时你会发现即使你把首屏显示之前的这些主线程的耗时问题都解决了,还是比竞品启动得慢。
那么 究竟如何才能把启动时的所有耗时的事都找出来呢? 解决这个问题, 你首先需要弄清楚App 在启动时候都做了那些事儿.
一般而言, app的启动时间 , 指的是 从用户 点击App 图标开始. 到用户看到第一个界面之间的时间. 总结来说 , app的启动主要包括三个阶段:
1. main() 函数执行之前;
2. main()函数执行之后;
3. 首屏渲染完成后;
main() 函数执行之前;
在main()函数执行之前吖 , 系统会做下面几件事情.
* 加载可执行文件(App 的 .o文件的集合)(其实 部分.a文件 也是 .o文件集合成的.a文件)
* 加载动态链接库. 进行 rebase指针调整和bind 符号绑定;
*Objc 运行时的初始处理,包括 Objc 相关类的注册、category 注册、selector 唯一性检查等;
*初始化,包括了执行 +load() 方法、attribute((constructor)) 修饰的函数的调用、创建 C++ 静态全局变量。
相对应的 这里的优化 可以做的事情 也不是很多 主要如下.
*减少动态库加载。每个库本身都有依赖关系,苹果公司建议使用更少的动态库,并且建议在使用动态库的数量较多时,尽量将多个动态库进行合并。尽量将多个动态库进行合并。数量上,苹果公司最多可以支持 6个非系统动态库合并为一个.
*减少加载启动后不会去使用的类或者方法。
*+load() 方法里的内容可以放到首屏渲染完成后再执行,或使用 +initialize() 方法替换掉。因为,在一个 +load() 方法里,进行运行时方法替换操作会带来 4 毫秒的消耗。不要小看这 4毫秒,积少成多,执行 +load() 方法对启动速度的影响会越来越大。
* 控制 C++ 全局变量的数量.