App启动时间分析

当前APP启动时间过长,于是学习并检测了APP启动流程中各个步骤的耗时,记录如下

1,梳理优化方案

APP的启动时间,直接影响用户对你的APP的第一体验和判断。如果启动时间过长,不单单体验直线下降,而且可能会激发苹果的watch dog机制kill掉你的APP(Xcode在debug模式下是没有开启watch dog的,所以我们一定要连接真机测试我们的APP)
APP的启动可以分为两个阶段
衡量main()函数执行之前的耗时
 
对于衡量main()之前也就是time1的耗时,苹果官方提供了一种方法,即在真机调试的时候,勾选DYLD_PRINT_STATISTICS选项(如果想获取更详细的信息可以使用DYLD_PRINT_STATISTICS_DETAILS),如下图:
系统级别的动态链接库,因为苹果做了优化,所以耗时并不多,而大多数时候,t1的时间大部分会消耗在我们自身App中的代码上和链接第三方库上。
优化方案:
main()执行之后
 
第二阶段的耗时统计,我们认为是从main ()执行之后到applicationDidFinishLaunching:withOptions:方法最后,那么我们可以通过打点的方式进行统计。
 
Objective-C项目因为有main文件,所以我么直接可以通过添加代码获取:
 
main()函数中记录当前时间didFinishLaunchingWithOptions用当前时间减去记录时间
优化方案:
尽量使用纯代码编写,减少xib的使用;
 
启动阶段的网络请求,是否都放到异步请求;
 
一些耗时的操作是否可以放到后面去执行,或异步执行等。
 
2,分步骤测试优化
测量当前启动时间
main函数后的启动时间
App main 函数后的启动时间0.236194
App main 函数后的启动时间0.263245
App main 函数后的启动时间0.314452
 
启动时间没有那么长,问题应该出在【APP启动后到首页显示】的时间上
测试三组数据如下:
 
App 启动后到首页展示出来后的时间 --- 15.250344
 
App main函数到首页展示出来后的时间  15.486538
 
App 启动后到首页展示出来后的时间 --- 16.896826
 
App main函数到首页展示出来后的时间  17.160071
 
App 启动后到首页展示出来后的时间 --- 16.505710
 
App main函数到首页展示出来后的时间  16.820162
 
 
发现的问题
 
1,启动后警告
Main Thread Checker: UI API called on a background thread: -[UIApplication canOpenURL:]
 
解决方案:查找后发现初始化三方库的函数放到子线程,移到主线程后,该UI警告消失,启动后卡顿的问题解决。
 
 
2,启动前警告,JPush存在问题 
=================================================================
Main Thread Checker: UI API called on a background thread: -[UIApplication currentUserNotificationSettings]
PID: 15459, TID: 3156238, Thread name: org.hxhg.jpush.thread, Queue name: com.apple.root.default-qos.overcommit, QoS: 0
Backtrace:
4   MengZhu                             0x00000001048196fc -[JPUSHAPNSStateReport init] + 236
5   MengZhu                             0x000000010484a408 -[JPUSHClientController UDPReportAPNSState] + 44
6   MengZhu                             0x0000000104849f14 -[JPUSHClientController setup] + 868
7   Foundation                          0x00000001c084b894 <redacted> + 336
8   CoreFoundation                      0x00000001bfd57018 <redacted> + 24
9   CoreFoundation                      0x00000001bfd56f98 <redacted> + 88
10  CoreFoundation                      0x00000001bfd56880 <redacted> + 176
11  CoreFoundation                      0x00000001bfd517bc <redacted> + 1004
12  CoreFoundation                      0x00000001bfd510b0 CFRunLoopRunSpecific + 436
13  CoreFoundation                      0x00000001bfd51e0c CFRunLoopRun + 80
14  MengZhu                             0x00000001048517b0 -[JPUSHThread clientThreadMain] + 100
15  Foundation                          0x00000001c084b6a4 <redacted> + 984
16  libsystem_pthread.dylib             0x00000001bf9e42c0 <redacted> + 128
17  libsystem_pthread.dylib             0x00000001bf9e4220 _pthread_start + 44
18  libsystem_pthread.dylib             0x00000001bf9e7cdc thread_start + 4
 
原JPush版本为2.1.8 升级到3.2.1之后,线程问题解决
 
最新启动时间为
App 启动后到首页展示出来后的时间 — 5.318915
App main函数到首页展示出来后的时间 --- 5.599773
 
 继续优化中···
 
 
posted @ 2019-06-03 21:28  怀达  阅读(1038)  评论(0编辑  收藏  举报