美文网首页
iOS 启动优化-二进制重排

iOS 启动优化-二进制重排

作者: 起床赚钱了 | 来源:发表于2021-12-14 15:32 被阅读0次

一、重排目的

二进制重排就是为了减少启动时的缺页异常Page Fault从而减少启动时间 二进制重排前.png 二进制重排后.png

二、查看Page Fault

(1)打开Instruments:

image.png

(2)选择System Trace image.png

(3)启动检测 image.png

(4)停止检测 image.png

(5)查看输出结果 image.png image.png

1.当代码多起来的话,Page Fault的数量和加载耗时都会随着代码增加而增加。并且双击还能看到Page Fault堆栈
2.二进制重排可以很好优化这个问题,其中心思想是重新排列 方法符号的顺序, 使启动的相关方法排在最前面从而减少启动Page Fault的数量。
我们先来看看原来的符号顺序,这需要用到 链接映射文件 Link Map File。

我们先来看看原来的符号顺序,这需要用到 链接映射文件 Link Map File。
Link Map File 里可以看到方法符号的排序。知道了原来的符号排序,开发者怎么去设置自己想要的顺序呢?

二、order_file

Xcode提供了排列符号的设置给开发者,设置 order_file即可。苹果也一直身体力行,objc 源码就采用了二进制重排优化。

(1)复制.order文件

首先把 objc源码 下载好,把源码根目录的libobjc.order复制到项目根目录改名为link.order文件,这里面就是方法符号的排序。

image.png

(2)设置xcode中order file的路径

Target -> Build Setting -> Linking -> Order File设置 order file的路径:$(SRCROOT)/link.order

image.png

(3)编写order_file

下载好源码得到的libobjc.order文件内容

image.png
复制到项目后内容全部删除掉,根据自己需要来编写

(4)生成 Link Map File image.png

访问Link Map File路径方式:

a.方式一:
$ open ~/Library/Developer/Xcode/DerivedData/项目名-drvxyokcnmitfbabaqkqkssshdai/Build/Intermediates.noindex/项目名.build/Release-iphoneos/项目名.build/项目名-LinkMap-normal-arm64.txt
b.方式二:
快速访问: 图片1.png

进入路径后选择:


图片2.png 图片3.png 图片4.png

三、使用二进制重排

1.首先将复制过来的link.order文件内容全部删除。(看(1)中的图一)
2.根据下图二(看(1)中的图二)最初的方法符号加载顺序来进行排序。
3.将相关符号方法排到前面,修改的顺序写到link.order文件中。(看(2)中的图二)

(1)二进制重排前

重排前link.order文件.png 重排前testFramework- LinkMaprpormal-arm64.txt.png
可以看到Link Map File现实原来是先加载-[ViewController viewDidLoad]等方法后加载 ]-[AppDelegate application:didFinishLaunchingWithOptions:]等方法

(2)二进制重排后

编写一下link.order,设置符号方法的顺序。

编写后link.order.png
然后保存编写后的link.order,再command+B重新编译一下工程,再查看一下 Link Map File,顺序已经换过来了。
testframework- LinkMap-normal-armg 4.tal.png
手填两个不存在的方法,也一样编译通过,并且Link Map File并不会添加这两个不存在错误的方法。

自动生成order_file

全手写一定是不可取的,想实现自动化就要解决下列问题:
1.保证不遗漏方法
2.保证方法符号正确
3.保证方法符号顺序正确

解决方案可见抖音团队分享
使用的是 静态扫描+运行时trace的方案, 能够覆盖到80%~90%的符号。但是上述的方法也存在性能瓶颈
1.initialize hook不到
2.部分block hook不到
3.C++通过寄存器的间接函数调用静态扫描不出来

解决以上问题:编译期插桩

相关文章

网友评论

      本文标题:iOS 启动优化-二进制重排

      本文链接:https://www.haomeiwen.com/subject/noojfrtx.html