本次优化从三个方面去实现:二进制重排,删除app中未使用的类,优化App底部Tab动画加载
经过测试app优化后冷启动时长大概在1.75s左右,优化前大概在2.0s左右。优化时长0.25,占总时长的10%左右
测试环境:6s机型,iOS14.6版本,冷启动(手机重启,再重启PongPong)
测试方法:将手机重启后,开始录屏,然后点优化前与优化后的app,当app首页加载完成截止录屏;将保存的视频执行ffmpeg -i xxxx.mp4 -r 30 -t 100 %d.jpeg命令(将app启动视频以每秒30张分割成图片)启动耗时=启动过程图片总数/30
优化前启动时长2.1s左右
优化后启动时长:1.75s左右
一.app启动涉及函数的二进制重排
缺页中断(Page Fault)次数减少200多次(优化8%左右)时间减少60多ms,通过Clang静态插桩代码覆盖工具,获取app启动到rootVC的viewDidAppear函数截止执行的所有函数列表,生成orderFile,设置Pong项目的order File编译参数;
注意点:设置主工程的插桩编译参数后,只能得到主工程的执行函数列表,项目中关联的cocoaspod库也需要插桩的话,需要将项目中编译成静态库的cocoapod展开成源码后链接到项目中,并在podFile中设置插桩参数
(以pong为例,主工程生成的orderFile只有大概400个函数,但是通过将大部分的cocoapods展开后插桩,大概在8000个左右)
参考文档
1)二进制重排:https://www.jianshu.com/p/3f9ed86a45cb
2)生成orderFile文件工具:https://github.com/yulingtianxia/AppOrderFiles
二.项目中未使用的类移除
人工二次确认删除项目中200多个无用的类(占项目中类总数的4%左右),通过otools工具分析Mach-o文件中__DATA __objc_classrefs段记录的项目中用到类的地址,__DATA __objc_classlist段记录的所有类的地址,取差集可以得到未使用的类的地址,然后进行符号化,就可以得到未被引用的类信息。因为是静态分析,不能包括动态调用的情况,对于需要删除的类需要人工二次确认。
(以上是项目生成的linkmap文件对比图)
参考文档:https://github.com/xuezhulian/classunref
三.app底部Tab动画加载至于子线程,加载完回调主线程播放
PCAppTaskDoingUI启动任务减少90ms左右(占app 启动后执行的一系列任务总时长的10%左右)