iOS App启动优化(三):二进制重排
2020/5/26 23:25:51
本文主要是介绍iOS App启动优化(三):二进制重排,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
iOS App启动优化(一):检测启动时间
iOS App启动优化(二):物理内存和虚拟内存
iOS App启动优化(三):二进制重排
iOS App启动优化(四):编译期插桩
重排目的
二进制重排就是为了减少启动时的缺页异常Page Fault
从而减少启动时间
查看 Page Falut
我们可以看到图中项目的Page Fault
数量并不多,这是因为当前项目是一个demo,代码和文件都极少。当代码多起来的话,Page Fault的
数量和加载耗时都会随着代码增加而增加。
二进制重排 可以很好优化这个问题,其中心思想是重新排列 方法符号的顺序, 使启动的相关方法排在最前面从而减少启动Page Falut
的数量。
我们先来看看原来的符号顺序,这需要用到 链接映射文件 Link Map File
。
Link Map File
- Link Map File 是什么?
- Link Map File 怎么获取?
- Link Map File 有什么用?
请移步 Link Map File 文件说明
Link Map File
里可以看到方法符号的排序。知道了原来符号排序,开发者怎么去设置自己想要的顺序呢?
order_file
Xcode
提供了排列符号的设置给开发者,设置 order_file
即可。苹果也一直身体力行,objc
源码就采用了二进制重排优化。
设置order_file
在根目录生成link.order
文件,这里面就是方法符号的排序
Target -> Build Setting -> Linking -> Order File
设置 order file
的路径
编写order_file
虽然知道了可以通过设置 .order
文件调整符号的位置,但是并不知道怎么编写 order_file
。下载objc-750源码
(源码下载地址),查看其 order_file
。
打开 libobjc.order
,原来只需要填写符号即可。
Link Map File
现实原来是先加载 AppDelegate application:didFinishLaunchingWithOptions:
后加载 [ViewController viewDidLoad]
编写一下link.order
试试
command + K
后 command + B
再查看一下 Link Map File
,顺序已经换过来了
一个个方法写进去很容易出现笔误,那么当这个文件里面出现异常的时候编译会出问题吗?
再编译一下查看一下 Link Map File
,编译没有出现问题,不存在的方法直接被忽略掉了,没有出现在文件中。
自动生成order_file
全手写一定是不可取的,想实现自动化就要解决下列问题:
- 保证不遗漏方法
- 保证不方法符号正确
- 保证方法符号顺序正确
解决方案可见 《抖音研发实践:基于二进制文件重排的解决方案 APP启动速度提升超15%》
抖音团队使用的是 静态扫描+运行时trace的方案, 能够覆盖到80%~90%的符号。但是上述的方法也存在性能瓶颈
- initialize hook不到
- 部分block hook不到
- C++通过寄存器的间接函数调用静态扫描不出来
为了解决这个瓶颈,我打算尝试一下在文末提到的 编译期插桩
编译期插桩
顾名思义,编译插桩就是在代码编译期间修改已有的代码或者生成新代码。
具体可见 iOS App启动优化(四):编译期插桩
这篇关于iOS App启动优化(三):二进制重排的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-10-05Swift语法学习--基于协议进行网络请求
- 2022-08-17Apple开发_Swift语言地标注释
- 2022-07-24Swift 初见
- 2022-05-22SwiftUI App 支持多语种 All In One
- 2022-05-10SwiftUI 组件参数简写 All In One
- 2022-04-14SwiftUI 学习笔记
- 2022-02-23Swift 文件夹和文件操作
- 2022-02-17Swift中使用KVO
- 2022-02-08Swift 汇编 String array
- 2022-01-30SwiftUI3.0页面反向传值