iOS客户端启动优化

2019-01-23  本文已影响6人  川少叶

App启动分成两部分

Pre-main

dyld:dynamic loader,它的作用是加载一个进程所需要的image,dyld是开源的

Pre-main的流程.png

Load Dylibs

dyld加载App的可执行文件,App内嵌的库,系统动态库。每个库,就是Mach-o文件,其头部都包含依赖库信息,dyld会递归加载这些库。

加载过程

  1. 分析所依赖的动态库
  2. 找到动态库的mach-o文件
  3. 打开文件
  4. 验证文件
  5. 在系统核心注册文件签名
  6. 对动态库的每一个segment调用mmap()

优化

Rebase && Binding

ASLR的全称是Address space layout randomization,翻译过来就是“地址空间布局随机化”。App被启动的时候,程序会被影射到逻辑的地址空间,这个逻辑的地址空间有一个起始地址,而ASLR技术使得这个起始地址是随机的。如果是固定的,那么黑客很容易就可以由起始地址+偏移量找到函数的地址。

优化

OBJC Runtime Setup

Initializers

以上三步属于静态调整,都是在修改__DATA segment中的内容,而这里则开始动态调整,开始在堆和栈中写入内容。 工作主要有:

优化

Pre-main 总结

  1. pre-main阶段耗时的影响因素:

    • 动态库加载越多,启动越慢。
    • ObjC类越多,函数越多,启动越慢。
    • 可执行文件越大启动越慢。
    • C的constructor函数越多,启动越慢。
    • C++静态对象越多,启动越慢。
    • ObjC的+load越多,启动越慢。
  2. 整体上pre-main阶段的优化有:

    • 减少依赖不必要的库,不管是动态库还是静态库;如果可以的话,把动态库改造成静态库;如果必须依赖动态库,则把多个非系统的动态库合并成一个动态库;
    • 检查下 framework应当设为optional和required,如果该framework在当前App支持的所有iOS系统版本都存在,那么就设为required,否则就设为optional,因为optional会有些额外的检查;
    • 合并或者删减一些OC类和函数;关于清理项目中没用到的类,使用工具AppCode代码检查功能,查到当前项目中没有用到的类(也可以用根据linkmap文件来分析,但是准确度不算很高);有一个叫做FUI的开源项目能很好的分析出不再使用的类,准确率非常高,唯一的问题是它处理不了动态库和静态库里提供的类,也处理不了C++的类模板。
    • 删减一些无用的静态变量,
    • 删减没有被调用到或者已经废弃的方法
    • 将不必须在+load方法中做的事情延迟到+initialize中,尽量不要用C++虚函数(创建虚函数表有开销)
    • 类和方法名不要太长:iOS每个类和方法名都在__cstring段里都存了相应的字符串值,所以类和方法名的长短也是对可执行文件大小是有影响的;因还是object-c的动态特性,因为需要通过类/方法名反射找到这个类/方法进行调用,object-c对象模型会把类/方法名字符串都保存下来;
    • 用dispatch_once()代替所有的 attribute((constructor)) 函数、C++静态对象初始化、ObjC的+load函数;
    • 在设计师可接受的范围内压缩图片的大小,会有意外收获。压缩图片为什么能加快启动速度呢?因为启动的时候大大小小的图片加载个十来二十个是很正常的,图片小了,IO操作量就小了,启动当然就会快了,比较靠谱的压缩算法是TinyPNG。

Main

总体原则无非就是减少启动的时候的步骤,以及每一步骤的时间消耗。
main阶段的优化大致有如下几个点:

其中遇到几个坑:

实际优化效果

由于只是去掉了几个静态库,而且本来pre-main阶段的耗时就不长,基本在200ms-500ms左右,所以pre-main阶段优化前后效果并不明显,有时候还没有前后测试的误差大。。。
main的阶段的优化效果还是很明显的:

可以看到,同样arm64架构的机器,main阶段是iPhone7比iPhoneX更快,说明就操作系统来说,iOS11.3要比iOS10.3慢不少;

参考文章

  1. 今日头条 http://www.cocoachina.com/ios/20170208/18651.html
  2. http://yulingtianxia.com/blog/2016/10/30/Optimizing-App-Startup-Time/
  3. 综合 https://mp.weixin.qq.com/s/zeWfmAi0YnoQowcPpFhHUA
  4. https://blog.csdn.net/hello_hwc/article/details/78317863,黄文臣
上一篇下一篇

猜你喜欢

热点阅读