APP的启动可以分为两种:
- 冷启动:从0开始启动APP
- 热启动:APP已经在内存中,在后台存活着,再次点图片
APP的启动优化主要是针对冷启动进行优化
-通过环境变量可以打印出APP的启动时间分析(Edit scheme -> Run -> Arguments
)
- DYLD_PRINT_STATISTICS设置为1
-
DYLD_PRINT_STATISTICS_DETAILS设置为1可以看到更详细的时间分析
如图:
设置环境变量来监测启动时间
一般这些时间在400ms是正常的;
App冷启动3大阶段:
- dyld(dynamic link editor,Apple的动态链接器,可用来装载Mach-O文件(可执行文件、动态库等))
它来主导,将可执行文件加载到内存顺便加载所有依赖的动态库 - runTime 负责加载成 objc 定义的结构
1、map_images解析和处理
2、load_images中调用call_load_methods,调用所有Class和Category的+load方法
3、进行各种objc结构的初始化(注册Objc类、初始化类对象等)
4、调用C++静态初始化器和attribute((constructor))修饰的函数 - main 初始化完成后,dyld就会调用 main函数
- UIApplicationMain方法,进入 Delegate
优化:
- 减少动态库,合并一些动态库
- 减少Objc类、分类的数量,减少Selector数量
- 减少C++虚函数数量
- Swift尽量使用 struct
runTime:
- 用
+initialize
方法和dispatch_once
取代所有的__attribute__((contructor))
、C++静态构造器、Objc的+load
main:
- 不要全放在
finishLaunching
方法里,尽可能将一些操作延迟加载 - 按需加载
网友评论