关于ios:启动优化二进制重排操作篇
1. 优化前 缺页中断耗时 (第一次装置)如果有, 请先删除 -fsanitize-coverage=func,trace-pc-guard 配置. 删除app, 革除Xcode缓存 ; Xcode菜单栏 > Product > Profile (快捷键command+I) , 期待 running 实现; 呈现 Instruments 界面, 抉择System Trace ; 启动我的项目, 到第一个界面呈现后进行, 期待剖析, 搜寻Main Thread, 抉择 Virtu Memory, 查看缺页中断File Backed Page in 次数与工夫; 2. 获取启动时加载的所有函数符号删除app, 在 Xcode Build Settings > Apple Clang - Custom Compiler Flags > Other C Flags 中 增加 -fsanitize-coverage=func,trace-pc-guard , 在启动后会呈现的第一个界面中增加如下代码: #import <dlfcn.h>#import <libkern/OSAtomic.h>//原子队列static OSQueueHead symboList = OS_ATOMIC_QUEUE_INIT;//定义符号构造体typedef struct { void * pc; void * next;} SymbolNode;void __sanitizer_cov_trace_pc_guard_init(uint32_t *start, uint32_t *stop) { static uint64_t N; // Counter for the guards. if (start == stop || *start) return; // Initialize only once. printf("[clang] INIT: %p %p\n", start, stop); for (uint32_t *x = start; x < stop; x++) *x = ++N; // Guards should start from 1.}void __sanitizer_cov_trace_pc_guard(uint32_t *guard) { //if (!*guard) return; // Duplicate the guard check. void *PC = __builtin_return_address(0); SymbolNode * node = malloc(sizeof(SymbolNode)); *node = (SymbolNode){PC,NULL}; //入队 // offsetof 用在这里是为了入队增加下一个节点找到 前一个节点next指针的地位 OSAtomicEnqueue(&symboList, node, offsetof(SymbolNode, next));}void tmpOrderFile() { NSMutableArray<NSString *> * symbolNames = [NSMutableArray array]; while (true) { //offsetof 就是针对某个构造体找到某个属性绝对这个构造体的偏移量 SymbolNode * node = OSAtomicDequeue(&symboList, offsetof(SymbolNode, next)); if (node == NULL) break; Dl_info info; dladdr(node->pc, &info); NSString * name = @(info.dli_sname); // 增加 _ BOOL isObjc = [name hasPrefix:@"+["] || [name hasPrefix:@"-["]; NSString * symbolName = isObjc ? name : [@"_" stringByAppendingString:name]; //去重 if (![symbolNames containsObject:symbolName]) { [symbolNames addObject:symbolName]; } } //干掉本人 NSString * thisFunc = [NSString stringWithFormat:@"_%s",__FUNCTION__]; if ([symbolNames containsObject:thisFunc]) { [symbolNames removeObject:thisFunc]; } //取反 NSMutableArray * symbolAry = [NSMutableArray arrayWithArray:[[symbolNames reverseObjectEnumerator] allObjects]]; NSLog(@"[clang] %@",symbolAry); //将后果写入到文件 NSString * funcString = [symbolAry componentsJoinedByString:@"\n"]; NSString * filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"lb.order"]; NSData * fileContents = [funcString dataUsingEncoding:NSUTF8StringEncoding]; BOOL result = [[NSFileManager defaultManager] createFileAtPath:filePath contents:fileContents attributes:nil]; if (result) { NSLog(@"[clang] %@",filePath); }else{ NSLog(@"[clang] 文件写入出错"); }}而后在viewDidAppear中调用tmpOrderFile(), (或者在其余事件办法里调用也能够). ...