在iOS系统中,APP的启动分为两种,我将其称之为全加载启动和缓存启动
1.全加载启动,即在iOS系统中没有该APP进程存在,一切都需要重新开始
2.缓存启动,即在iOS系统中存在改APP进程,需要唤醒APP进入前台工作
程序启动耗时获取
在 Xcode 导航栏中 Edit scheme -> Run -> Auguments 将环境变量 DYLD_PRINT_STATISTICS设为 YES即可
启动时间图dylib loading time 动态库加载时间
rebase/binding time 重定向地址绑定外部指针时间
ObjC setup time OC等类设置时间
initializer time 初始化时间
slowest intializers 最慢初始化模块
这里我们只介绍全加载启动
全加载启动分为两个部分预加载和初始化
预加载:
1.获取APP plist配置文件,读取配置信息
2.创建运行沙盒,每次启动,沙盒内存位置都不相同(地址空间布局随机化机制 ASLR)
3.检查plist文件申请的权限信息
4.加载可执行文件Mach-O
5.读取动态链接器路径,运行动态链接器
6.使用动态链接器加载直接或者间接依赖的动态库
6.1 验证动态库有效性和代码签名,读取到内核,链接动态库
6.2 重定向动态库地址(ASLR), 查询符号表绑定外部指针(I/O 与CPU计算耗时)
6.3 启动运行时runtime,维护类和方法表,注册类、分类、结构体,指定每个方法名的唯一性
6.4 初始化OC、C++,调用+load方法,构造器函数(attribute((constructor))修饰),创建非基本类型的C++静态全局变量
初始化:
1.main 函数
2.执行UIApplicationMain
2.1 创建UIApplication对象
2.2 创建UIApplication的delegate对象
2.3 创建MainRunloop主循环
2.4 delegate监听处理系统事件
3.程序启动完毕,调用App生命周期启动回调方法
3.1 配置需要用到的第三方库
3.2 创建展示UIWindow
3.3 创建和设置UIWindow的根视图控制器rootViewController
4.最终显示UI
启动优化:
经过以上APP启动分析,可以优化的着手点如下
1.删减无用的类、资源文件,减少资源文件大小
2.删减不必要的依赖库,减少动态库的引用
3.确定库的引用方式,减少额外的检查
4.减少项目文件中分类、类别的使用以及静态变量的使用数量
5.初始化库和工具,如非必要,异步执行
6.UI实现尽量使用纯代码,减少xib等文件的使用(xib等文件需要转换为纯代码,耗费时间)。
网友评论