启动分为:热启动和冷启动
1热启动:就是按下home键的时候,app还存在一段时间,这时点击app马上就能恢复到原状态,这种启动我们称为热启动。
2.冷启动:app被kill掉也不一定代表冷启动。当app被kill掉依然存在在物理内存中,只有当物理内存中的数据被替换掉。
此文讲了app冷启动各个阶段所做的事情,以及优化方案,本文着重讲Clang插桩优化启动速度。
Clang 插桩
抖音研发实践:基于二进制文件重排的解决方案 APP启动速度提升超15%,抖音团队验证了二进制文件重排方案在iOS APP开发中可行性和稳定性。
二进制重排方案,通过减少Page Fault缺页中断次数,达到对启动速度的优化。
文中也解决了通过使用System Trace获取启动阶段的page fault次数,通过开启Write Link Map File查看二进制文件的布局,以及通过order_file让链接器ld按照指定顺序生成mach-o文件。
我们知道OC的方法调用会转化成msg_send函数,所以通过hook Objc_msgSend是不是就能获取到启动时所有的函数呢?但是很遗憾,例如load方法因为是直接通过查找函数的内存进行调用,并不是通过消息机制,因此没办法hook,像block 以及C++间接函数们也是没办法通过静态扫描的方式没办法达到100%覆盖。
因此本文主要谈谈怎么通过编译器插桩来hook所有的函数符号。
Clang 插桩:
在编译器就在每一个函数内部二进制数据添加hook代码来实现全局的方法。
Clang插桩具体实践可以参考此文。
热启动优化:
1、数据优化,将耗时操作做异步处理。
2、检查NSUserDefaults的存储,NSUserDefaults实际上是在Library文件夹下会生产一个plist文件,加载的时候是整个plist配置文件全部load到内存中。所以非常频繁的存取大量数据也是有可能导致APP启动卡顿的
参考