启动流程

image-20190620181305956

我们将App启动分为三部分:

  1. 用户点击App到main函数开始执行。
  2. main函数开始执行到首屏数据加载完成。
  3. 首屏渲染完成后。

我们需要分析这两个阶段App分别作了什么操作,针对这些操作我们可以进行怎么的优化。

阶段一:用户点击App到main函数开始执行

App做了什么

  • 加载可执行文件(App的.o文件的集合)
  • 加载动态链接库,进行rebase指针调整和bind符号绑定。
  • Objc 运行时的初始处理,包括Objc相关类的注册,categoray注册,selector唯一性检查等。
  • 初始化,包括了执行+load()方法、attribute((constructor))修饰的函数的调用,创建C++静态全局变量。

做什么优化

总的来说,这个阶段可做的优化是少做些事情。具体如下:

  • 减少动态库加载。可将多个动态库合并成一个。
  • 减少加载启动后不会使用的类或者方法。
  • 尽量避免使用+load()方法,或使用+initlalize()方法替换掉。

阶段二: main函数开始执行到首屏渲染完成

这个阶段是指从main()函数执行开始,到appDelegate的didFinishLaunchingWithOptions方法里首屏渲染相关方法执行完成。

App做了什么

首页的业务代码都是要在这个阶段,也就是首屏渲染前执行的,主要有:

  • 首屏初始化所需配置文件的读写操作。
  • 首屏列表大数据的读取。
  • 首屏渲染的大量计算等。

做什么优化

在这个阶段,开发者需要从功能上梳理出那些是首屏渲染必要的初始化功能,那些是只需要在对应的功能开始使用时才需要初始化的。梳理完成之后,将这些初始化功能分别放到合适的阶段进行。

阶段三:首屏渲染完成后

这个阶段是指didFinishLaunchingWithOptions方法里首屏渲染相关方法后面的所有方法,主要是非首屏其他业务模块的初始化、监听的注册、配置文件的读取等。

App做了什么

  • 非首屏其他业务模块的初始化、监听的注册、配置文件的读取等。

做什么优化

  • 不要阻塞主线程。

参考资料

wwdc2016-406

美团外卖iOS App冷启动治理

通过otool快速Python脚本,以帮助发现Objective-C Mach-O可执行文件中可能未使用的方法