iOS 冷启动优化——干掉 +load() 函数
Contents
iOS 冷启动优化
App 被用户触摸到启动完成有很多优化的地方
- main 函数之前的优化,包含动态链接、注册 objc 相关方法、load 函数调用等
- main 函数之后的优化,didFinishLaunchingWithOptions 瘦身、首页加载等
组件化
成熟企业喜欢做组件化,组件化的结果之一就是各个业务被拆分成若干模块以 pod 为粒度。业务方只在自己的 pod 内部进行开发,不会对 AppDelegate.m 这样的公共部分进行改动。
针对一个 pod 的生命周期而言,最早的一个函数是需要等到用户进入到该业务模块中才能被触发。如果必须有什么事情需要更早的时机,大部分时候会选择使用 +load() 函数。这个函数触发时机很早,早于用户的特定触摸事件发生以前。使用这个函数可以同时达到组件化解耦、时机很早两个要求。但是有个弊端:一个 app +load 函数过多会显著拖慢冷启动的速度。
取代 +load
有什么办法同时达到三个要求呢?
- 解耦
- 时机早
- 不影响启动性能
美团很早上线了一种功能,可以达到这种效果。去年外卖团队的一篇技术博客披露了这个方法的部分面貌,差不多也可以写出来了,具体可以看 美团外卖iOS App冷启动治理 启动项自注册 这一节。
文章提供了一种思路:把要注册的逻辑函数指针写到 __data
段,等 函数之后的优化,didFinishLaunchingWithOptions 完成之后批量从 __data
段读取出来调用或者等用户的触摸事件来的时候再调用。背后运用的 api 是 __attribute((used,section("__DATA,key")))
,category 也用这个能力进行 runtime 绑定。
空间换时间,万变不离其宗.
贴两篇网友根据这个原理写的 Demo
https://www.jianshu.com/p/33663906f7a2
https://www.jianshu.com/p/d0e614c945bf
其他
除了这个方法之外还有一个方法,等将来公司主动揭露了再说吧。