App的启动分为冷启动和热启动。如果启动时间过长,首先引起的用户体验直线下降,再者是可能会激发苹果的watch dog机制kill掉App。
APP的启动流程
APP的启动可以分为两个阶段,即main()执行之前和main()执行之后。总结如下:
t(App 总启动时间) = t1(main()之前的加载时间 ) + t2(main()之后的加载时间 )。
t1 = pre-main 系统的 dylib (动态链接库)和 App 可执行文件的加载时间;
t2 = main() 函数执行之后到AppDelegate类中的applicationDidFinishLaunching:withOptions:方法执行结束前这段时间。
1.pre-main阶段
对于pre-main阶段,Xcode9之后,Apple提供了一种测量方法,在 Xcode 中 Edit scheme -> Run -> Auguments 将环境变量DYLD_PRINT_STATISTICS 设为1 :
程序运行起来之后 log
如下图所示,包含 main 函数执行之前各项的加载时间,我们可以多次运行取一下平均值,苹果推荐这个时间应在 400ms 以内
2.main
CFAbsoluteTime StartTime;
int main(int argc, char * argv[]) {
@autoreleasepool {
StartTime = CFAbsoluteTimeGetCurrent();
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}}
extern CFAbsoluteTime StartTime;
...
// 在 applicationDidFinishLaunching:withOptions: 方法的最后统计
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"Launched in %f sec", CFAbsoluteTimeGetCurrent() - StartTime);
});
3. 优化的目标
由于每个App的情况有所不同,需要加载的数据量也有所不同,事实上我们无法使用一种统一的标准来衡量不同的App。苹果。
应该在400ms内完成main()函数之前的加载
整体过程耗时不能超过20秒,否则系统会kill掉进程,App启动失败
400ms内完成main()函数前的加载的建议值是怎样定出来的呢?其实我也没有太深究过这个问题,但是,当用户点击了一个App的图标时,iOS做动画到闪屏图出现的时长正好是这个数字,我想也许跟这个有关。