内容概要:
- APP启动过程的内容
- APP冷启动过程的优化【功能级别优化、方法级别优化】
- 总结
APP启动过程的内容
app的启动分为冷启动和热启动。所谓的冷启动,就是一次完整的启动,即从系统分配一个进程给APP到APP启动的到首屏的一个过程;热启动,就是指在APP使用过程中,用户返回到桌面之后,从桌面再返回回来APP的一次启动,即中途启动的一个过程。
冷启动:完整的一次启动
热启动:使用过程中返回后台,然后从后台进入APP的一次启动
冷启动的过程包括三个部分:
- main()执行前
- main()执行后
- 首屏渲染完成后
main()执行前执行哪些:
a. 加载可执行文件
b. 加载动态链接库
c. objc运行时的初始处理
d. 初始化(包括执行+load()方法,attribute((constructor))修饰的函数的调用、创建C++静态全局变量等)
main()执行后执行哪些:(从main() 到didFinishLaunchingWithOptions方法)
a. 首屏初始化所需配置文件的读写操作
b. 首屏列表大数据的读取
c. 首屏渲染的大量计算等
首屏渲染完成后执行哪些:
非首屏其他业务服务模块的初始化、监听的注册、配置信息的读取等
APP启动过程的优化
【功能级别优化】
-
main()执行前优化
a. 减少动态库加载 b. 减少加载启动后不会去使用的类或者方法 c. 减少C++全局变量的数量 d. +load()方法里的内容可以放到首屏渲染完成后再执行,或用+initialize()方法替换。
-
main()执行后(从main() 到didFinishLaunchingWithOptions方法)
只处理首屏相关业务,其他非首屏业务的初始化、监听注册、配置文件读取等都放到首屏渲染完成后再做。
-
首屏渲染完成后
1. 其他业务基础功能初始化 2. 其他服务初始化 3. 监听注册
【方法级别优化】
-
监控耗手段
a.定时抓取主线程上的方法调用堆栈,计算一段时间里各个方法的耗时 b.对objc_msgSend进行hook,掌握所有方法的执行耗时。
-
检查首屏有哪些耗时的方法,对其进行优化
耗时情况1:如加载、编辑、存储图片、文件等资源
耗时情况2:进行运行时方法替换操作会带来时间消耗,如+load()执行有4毫秒的延迟。
总结
首先了解了启动的概念。然后根据启动的特性,我们划分为三个阶段。通过三个阶段的分析,了解三个阶段的特性。最后根据我们的业务需求,在功能上对其进行梳理,梳理出哪些是APP启动时必要的初始化功能,哪些是首屏渲染必要的初始化功能,哪些是对应功能开始使用时才需要初始化的功能。将其对应滞后处理,完成启动的优化。