App启动耗时优化

2020-04-28  本文已影响0人  格雷s

1.App启动流程分析

iOS App启动时,系统会调用fork和execve,fork功能创建app进程,execve加载和运行程序,然后进入Pre-main阶段,然后进入applicationDidFinishLaunching:,下面我们梳理下app启动到展示的过程:
启动app->初始化空间,创建进程->加载解析执行文件exec_activate_image->载入动态链接器load_dylinker->配置用户栈等环境->设置线程入口->加载依赖的共享库->查找并绑定符号->恢复app的入口->mian()->UIapplicationMain()—>UIapplication->appdelegate->loads info.plist->creates and manages runloop->sends applications:didFinishLaunchingWithOptions:->creates and displays

2.Pre-main优化

通过配置Environment Variables参数DYLD_PRINT_STATISTICS:1,可以查看Pre-main时间,我们先查看下优化之前的数据

Total pre-main time: 2.2 seconds (100.0%)
         dylib loading time: 1.1 seconds (51.2%)
        rebase/binding time: 101.93 milliseconds (4.4%)
            ObjC setup time:  31.59 milliseconds (1.3%)
           initializer time: 981.14 milliseconds (42.8%)
           slowest intializers :
          libglInterpose.dylib : 422.59 milliseconds (18.4%)
                  AFNetworking : 236.77 milliseconds (10.3%)
...

可以看到时间主要花在dylib loadingrebase/bindingObjC setupinitializer
下面我们分析下怎样去优化这几个阶段的时间消耗

经过以上几个步骤的初步优化,比如移除冗余文件、冗余方法、load优化、分类优化,我们再看看pre-main消耗

Total pre-main time: 1.5 seconds (100.0%)
         dylib loading time: 733.71 milliseconds (46.0%)
        rebase/binding time:  91.76 milliseconds (5.7%)
            ObjC setup time:  28.08 milliseconds (1.7%)
           initializer time: 738.51 milliseconds (46.3%)
           slowest intializers :
          libglInterpose.dylib : 375.18 milliseconds (23.5%)
                  AFNetworking :  57.57 milliseconds (3.6%)
...

可以看到pre-main减少0.7s,效果还是比较不错的

3. applicationDidFinishLaunching优化

本片文章并不是讲冷启动的耗时优化,而是在进入applicationDidFinishLaunching方法到rootViewController展示的过程,为了尽快让用户能看到app首页,我们需要尽量缩短applicationDidFinishLaunching方法的耗时,尽快加载出rootViewController数据,为此,我们从Demo中来看看,applicationDidFinishLaunching耗时到底能否影响rootViewController的展示

首先在app入口处我们获取启动时间


image.png

在rootViewController中获取appear时间


image.png
查看结果:
image.png

然后我们在applicationDidFinishLaunching中插入一个耗时操作


image.png

查看结果


image.png
可以看到,applicationDidFinishLaunching在主线程中耗时越多,rootViewController出现的就越慢

为了提升用户体验,缩短app启动白屏等待的时间,我们可以尽量将耗时操作延迟执行、异步子线程执行、优化耗时时间等

4.结合Runloop管理启动项

5.Instruments之App Launch

image.png

在xcode11之后,Instruments中多了一个App Launch,这个在优化分析app启动过程有非常直观的作用

image.png 优化前 优化后
上一篇 下一篇

猜你喜欢

热点阅读