在蔚来的时候,启动了解决半年的APP系统优化项目。每个月累进一点点,日积月累,还是有些效果的。回到两鲜,重新梳理了下项目,项目的启动速度也得到了很大的提升。权且记录下操作经验。
996期间,忙中做了很多系统优化的事情。iPhone 6sp,安装包从90M下降到50M;热启动pre-main/ total time 从448ms/1.35s降到397ms/1.25s左右; 冷启动 pre-main/ total time 500ms/1.65s变化到505ms/1.7s左右。
一、通过xcode 开启APP启动时间打印,Edit Scheme>Envirement Variables新增DYLD_PRINT_STATISTICS
二、APP启动包括冷启动和热启动,我们以冷启动为例。启动时间优化包括main()之前和main()之后
1.main()之前
1.1 load dylibs:这一阶段dyld会分析应用依赖的dylib
,找到其mach-o
文件,打开和读取这些文件并验证其有效性,接着会找到代码签名注册到内核,最后对dylib
的每一个segment
调用mmap()。
1.2 rebase/bind:进行rebase
指针调整和bind
符号绑定。
1.3 ObjC setup:runtime运行时初始化。包括ObjC
相关Class
的注册、category
注册、selector
唯一性检查等。
1.4Initializers:调用每个ObjC
类与分类的+load
方法,调用attribute((constructor))
修饰的函数、创建C++
静态全局变量。
作者:QiShare
链接:https://www.jianshu.com/p/024b3d847fe0
2.两鲜在main()之前的优化:
2.1减少非必要的动态库加载,移除APP废弃lib
2.2减少部分+(void)load() 方法,尽量合并实现
3.其他的一些建议:
2.1:二进制文件重排,据说效果很明显
APP 二进制文件重排已经被玩坏了 http://yulingtianxia.com/blog/2019/09/01/App-Order-Files/
2main()之后,主要是didFinishLaunchingWithOptions到首页屏幕内容展示
1.1Time Profiler 工具查看main线程的方法耗时,针对性优化启动时间。主要考虑UI绘制的逻辑,两鲜的首页结构比较复杂,需要简化请求,预加载UI结构,后渲染图片等耗时操作。
1.2常规的iOS常见的图片i/O耗时、NSString 占位计算、NSDateFormatter
1.3全部图片通过Images.xcassets,通过字典方式寻址,[UIImage imageNamed:]遍历寻址效率低
1.4didFinishLaunchingWithOptions的部分lib延迟加载或者再实际使用时候初始化