Pong- iOS启动优化

本次优化从三个方面去实现:二进制重排,删除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%左右)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容