内容概要:

  1. APP启动过程的内容
  2. APP冷启动过程的优化【功能级别优化、方法级别优化】
  3. 总结

APP启动过程的内容


app的启动分为冷启动和热启动。所谓的冷启动,就是一次完整的启动,即从系统分配一个进程给APP到APP启动的到首屏的一个过程;热启动,就是指在APP使用过程中,用户返回到桌面之后,从桌面再返回回来APP的一次启动,即中途启动的一个过程。

冷启动:完整的一次启动
热启动:使用过程中返回后台,然后从后台进入APP的一次启动


冷启动的过程包括三个部分:

  1. main()执行前
  2. main()执行后
  3. 首屏渲染完成后

main()执行前执行哪些:

a. 加载可执行文件
b. 加载动态链接库
c. objc运行时的初始处理
d. 初始化(包括执行+load()方法,attribute((constructor))修饰的函数的调用、创建C++静态全局变量等)

main()执行后执行哪些:(从main() 到didFinishLaunchingWithOptions方法)

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

首屏渲染完成后执行哪些:

非首屏其他业务服务模块的初始化、监听的注册、配置信息的读取等

APP启动过程的优化


【功能级别优化】

  1. main()执行前优化
a.  减少动态库加载
 b.  减少加载启动后不会去使用的类或者方法
 c.  减少C++全局变量的数量
 d.  +load()方法里的内容可以放到首屏渲染完成后再执行,或用+initialize()方法替换。
  1. main()执行后(从main() 到didFinishLaunchingWithOptions方法)
只处理首屏相关业务,其他非首屏业务的初始化、监听注册、配置文件读取等都放到首屏渲染完成后再做。
  1. 首屏渲染完成后
1. 其他业务基础功能初始化
 2. 其他服务初始化
 3. 监听注册

【方法级别优化】

  1. 监控耗手段
a.定时抓取主线程上的方法调用堆栈,计算一段时间里各个方法的耗时
 b.对objc_msgSend进行hook,掌握所有方法的执行耗时。
  1. 检查首屏有哪些耗时的方法,对其进行优化
    耗时情况1:如加载、编辑、存储图片、文件等资源
    耗时情况2:进行运行时方法替换操作会带来时间消耗,如+load()执行有4毫秒的延迟。

总结


首先了解了启动的概念。然后根据启动的特性,我们划分为三个阶段。通过三个阶段的分析,了解三个阶段的特性。最后根据我们的业务需求,在功能上对其进行梳理,梳理出哪些是APP启动时必要的初始化功能,哪些是首屏渲染必要的初始化功能,哪些是对应功能开始使用时才需要初始化的功能。将其对应滞后处理,完成启动的优化。