Contents
  1. 1. iOS 冷启动优化
  2. 2. 组件化
  3. 3. 取代 +load
  4. 4. 其他

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

其他

除了这个方法之外还有一个方法,等将来公司主动揭露了再说吧。

Contents
  1. 1. iOS 冷启动优化
  2. 2. 组件化
  3. 3. 取代 +load
  4. 4. 其他