二进制重排可以 优化启动时间, 把APP启动要执行方法先排序,减少缺页异常
查看APP启动时间
Edit scheme -> run -> Environment variables -> 添加DYLD_PRINT_STATISTICS字段
dylib loading:系统库加载
binding: 内部文件访问外部函数,内部符号绑定(懒加载绑定,使用时才用)
rebase: 虚拟内存,Mach-o文件 ASLR 随机起始位置 + 虚拟内存地址偏移
ObjC setup:类注册
initializer: 初始化
查看虚拟内存表Page加载到物理内存的数量(PageEnable)
command + I -> system trace -> 选择项目并运行
找到File backed Page in 字段
查看虚拟内存Page储存的方法
Building setting -> write link map file -> Yes
Products -> xxx.app show in finder -> Intermediates.noindex -> Demo-LinkMap-normal-x86_64
Build Phases -> Complie Source 改变文件的顺序 -> 方法加载顺序
自定义order文件 -> 方法加载顺序
Building setting -> order file -> ./xxx.order
二进制重排 启动时间优化, 把APP启动要执行方法先排序,减少缺页异常
获取 APP启动要执行的方法 -> 写入到 order文件中 ,使用clang插桩完成
clang官方文档
https://clang.llvm.org/docs/SanitizerCoverage.html#tracing-pcs
clang插桩 获取自己写的代码的 方法,c函数,block,
原理:编译时,打上一个clang插桩标记,编译发现标记,在代码添加void __sanitizer_cov_trace_pc_guard(uint32_t *guard)回调
oc 语言 clang编译器
Building setting -> other c Flags -> -fsanitize-coverage=func,trace-pc-guard
swift 语言编译
Building setting -> other swift Flags -> -sanitize-coverage=func,-sanitize=undefined
添加__sanitizer_cov_trace_pc_guard_init 和 __sanitizer_cov_trace_pc_guard
里面反应了项目中符号的个数!!
void __sanitizer_cov_trace_pc_guard_init(uint32_t *start,
uint32_t*stop) {
static uint64_t N;
if(start == stop || *start)return;
// printf("INIT: %p %p\n", start, stop);
for(uint32_t*x = start; x < stop; x++)
*x = ++N;
}
HOOK一切的回调函数!!
void __sanitizer_cov_trace_pc_guard(uint32_t *guard) {
void *PC = __builtin_return_address(0);
Dl_info info;
dladdr(PC, &info);
// 输出方法的名称
NSString* name =@(info.dli_sname);
}