iOS 专项测试--启动时长

App的启动分为冷启动和热启动。如果启动时间过长,首先引起的用户体验直线下降,再者是可能会激发苹果的watch dog机制kill掉App。

APP的启动流程


iOS 专项测试--启动时长_第1张图片

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 :

iOS 专项测试--启动时长_第2张图片

程序运行起来之后 log

如下图所示,包含 main 函数执行之前各项的加载时间,我们可以多次运行取一下平均值,苹果推荐这个时间应在 400ms 以内

iOS 专项测试--启动时长_第3张图片

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做动画到闪屏图出现的时长正好是这个数字,我想也许跟这个有关。

你可能感兴趣的:(iOS 专项测试--启动时长)