iOS 启动优化&clang插桩

二进制重排可以 优化启动时间, 把APP启动要执行方法先排序,减少缺页异常

查看APP启动时间

Edit scheme -> run -> Environment variables -> 添加DYLD_PRINT_STATISTICS字段

APP启动

dylib loading:系统库加载

binding: 内部文件访问外部函数,内部符号绑定(懒加载绑定,使用时才用)

rebase: 虚拟内存,Mach-o文件 ASLR 随机起始位置 + 虚拟内存地址偏移

ObjC setup:类注册

initializer: 初始化

查看虚拟内存表Page加载到物理内存的数量(PageEnable)

command + I -> system trace -> 选择项目并运行 

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

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);

}


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容