关键词:APP启动优化、 APP Launch、 Instrument
Q1. APP启动有哪几种?
- 冷启动;
- 热启动;
- 继续执行(resume);
我们主要关注的是冷启动,也就是我们在手机桌面上点击了icon那一刻起 —> APP呈现首屏画面 这个过程所消耗的时间;
Q2.APP的启动过程分为几个阶段?
从instrument
的APP launch
面板来看:分为3个阶段
阶段一:初始化(紫色线条部分)
1.1 创建进程 — create process
;
1.2 接口初始化 — system interface initialization
动态库的加载;
1.3 runtime
初始化 — static runtime initialization
类的初始化;
阶段二:启动阶段(绿色线条部分)
2.1 UIKit
初始化;
2.2 APP Delegate的
执行;
2.3 首屏渲染 — initial first frame
;
阶段三:APP前台活跃(蓝色线条部分)
Q3.APP启动的时间,合格时间是多少?
- 初始化阶段:
0-100ms
之间; - 启动阶段:
100-400ms
之间,也就是300毫秒
以内;
Q4.APP启动优化可以从哪些方面入手?
1.1 创建进程
- 创建进程阶段由系统处理,此阶段可以忽略;
1.2 接口初始化阶段:
- 随着项目发展定期清理无用的动态库;
- 链接的动态库数量控制在8个以内;
- 当依赖的三方库太多尝试合并依赖库;
1.3 runtime
初始化阶段;
- 针对
load
方法的代码,能写在init
方法内的代码,尽量写在init
方法内(搭配dispatch_once_token
); - 定期清理项目中一些无用的类和方法;
2.2 APP delegate
阶段,当 willFInishLaunch
和 didiFinishLaunch
这两个方法执行完毕才算执行完毕,因此可做的操作如下:
- 以上两个方法内的业务代码可根据情况适当
defer
; - 比如:友盟的社会化分享,并不是首页所需要的,可以适当延迟注册;
2.3 首屏渲染阶段 viewDidLoad
和 viewWillAppear
方法执行完毕之后才会呈现首屏内容,因此:
- 我们可以将首页要展示但是不是首屏所要展示的内容放在
viewDidApper
方法内部; - 一些
APP delegate
阶段需要做的工作也可以放在viewDidApper
方法内部;
Instrument的AppLaunch工作面板图.jpg
参考文档:Optimizing App Launch
《end》