苹果在WWDC2019专题单元讨论了APP启动----- Optimizing App Launch
https://developer.apple.com/videos/play/wwdc2019/423/
苹果将app启动分为三类:冷(Cold)启动、热(Warm)启动、恢复(Resume)启动。其具体判定规则如下:
前两者比较容易理解:新装app启动属于cold,杀死app然后重新启动属于warm。Resume比较难理解,这里APP的状态是suspended。我们来看这是一种什么状态?
Suspended更接近于background,但最大的区别是background是APP在后台执行代码,而 Suspended在后台未执行代码,可以将Suspended看成是进入后台时间较长但还未被系统kill的状态。
以上是苹果对APP启动过程的划分,我们来逐个看看:
最令人期待的事情莫过于从iOS13开始Dyld3可以使用了,关于Dyld3,其与Dyld2的区别,苹果在WWDC2017大会上做了分享:
其最大的特点是Dyld3是部分进程外的,即操作系统在当前app进程之外完成了一部分dyld2在进程内的工作。以达到提升app启动性能和增强安全的目的。
而WWDC2019 苹果宣布针对Dyld3做了以下优化:
dyld3读取启动闭包,然后进行验证,再进行mach-o文件的映射、bind、rebase等一系列工作,最后进行libSystem初始化,这里主要是初始化一些系统的底层组件,其耗时相对固定。
这里可以需要注意以下事项,以减小对启动时间的影响:
以上均是main函数执行前的操作
UIKit Initallization
实例化UIApplication和UIApplicationDelegate
开始事件处理并与系统交互
这里需要注意以下事项,以减小对启动时间的影响:
这一部分主要是生命周期回调,包括UIApplicationDelegate app 生命周期回调
和UIApplicationDelegate UI 的生命周期回调
以及UISceneDelegate UI的生命周期回调-------------此回调是iOS13新增,用来代替UIApplicationDelegate的部分功能
app生命周期内需要注意的是:
首帧渲染,其流程为创建View,进行布局,绘制views,提交绘制指令并渲染第一帧,相关的系统方法为:
这里需要注意:
这一步有如下特征
它的影响可以利用os_signpost来测量
测试APP启动需要测试环境的一致性,可以参考以下建议:
Reboot系统,然后让系统静止2-3分钟
飞行模式可用或者mock网络
使用未付费或者没有iCloud的账号
使用release版本的app进行测试
另外,在设备选取时,可以使用比较老旧的机器进行测试
Xcode11 开始 XCTest也支持了App launch的测试API
测量热启动
Xcode11 的Instruments提供的App launch功能可以很详尽的测量app启动的各个环节的耗时,这里先混个脸熟吧!
此工具的使用后续单独成文,这里不再赘述
iOS13带来了一个很好的工具类MetricKit,此类的作用是可以周期性的生成当前App的启动、耗电、性能各方面的指标报告,开发者可以据此来构建自己的性能监控系统。我们来先睹为快:
class MXCellularConditionMetric
用于测量蜂窝网络质量.
class MXCPUMetric
用于测量CPU
class MXDisplayMetric
用于测量展示时间
class MXGPUMetric
用于测量GPU
class MXLocationActivityMetric
用户测量定位
class MXNetworkTransferMetric
用于测量网络切换
class MXAppLaunchMetric
用于测量App启动
class MXAppResponsivenessMetric
用于测量App响应
class MXAppRunTimeMetric
用于测量App运行时间
class MXMemoryMetric
用于测量内存
class MXDiskIOMetric
用于测试磁盘IO
class MXSignpostMetric
用于测量自定义的os_signpost
可以看出,苹果据此完成了app整体监控的大一统!也为开发者优化APP提供了更直接、更准确的依据。