本文记录下二进制重排的常见操作手法
本文采集函数调用的方法是 clang 插桩
clang 插桩可以搞定:
Obj - C 的匿名函数 Block
Swift 代码方法
自定义的 C 函数 / 系统的 C 函数
我们的 / 系统的 Obj - C 方法
因为 clang 编译我们的代码,生成 IR 的过程中,
会有 AST 抽象语法树,方便处理调用相关
本文例子是 MJRefresh 的 demo, 针对的是 Obj - C 项目
背景简述
( 网上资料很多 )
操作系统存在 page fault, 一次 page fault ,约 4 ms, 用户无感知
app 启动的时候,发生了大量的 page fault, 用户易感知
感觉启动方法的默认编译顺序
使用 link map
- 看下面的符号
这个是默认的链接顺序,可看出于调用顺序无关
Address Size File Name
0x100005B5C 0x0000008C [ 1] -[MJRefreshBackFooter willMoveToSuperview:]
0x100005BE8 0x00000340 [ 1] -[MJRefreshBackFooter scrollViewContentOffsetDidChange:]
…
- 获取 link map
Xcode 内设置


本文探讨了二进制重排在启动优化中的作用,通过Clang插桩收集函数调用栈,处理Obj-C项目中的匿名函数、Block、Swift代码等。以MJRefresh为例,详细介绍了如何避免循环搜集、实现线程安全,以及如何进行符号处理和性能优化。最终,文章展示了如何在真机沙盒中获取和分析数据,得出可能存在的微弱启动时间提升。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



