美文网首页
二进制重排

二进制重排

作者: 凯歌948 | 来源:发表于2021-06-17 18:18 被阅读0次

clang插装

先查看需要优化项目的排列
1、Xcode:【Build Settings 】-> 【Write Link Map File】 -> YES;
2、然后Clean项目,运行,选择Products 中的项目-> Show in Finder;
3、然后上上层,就是找到【Intermediates.noindex】->【FlashRider.build】->【Debug-iphonesimulator】(选择对应运行模式的)
->【FlashRider.build】->【FlashRider-LinkMap-normal-arm64.txt】

/**
 Build Settings -> Other C Flags -> -fsanitize-coverage=func,trace-pc-guard
 Build Settings -> Other Swift Flags -> -sanitize-coverage=func -sanitize=undefined
 Build Settings -> Write Link Map File -> Yes
 Build Settings -> Order File -> ./my.order
 */

#import "OrderFileTool.h"
#include <stdint.h>
#include <stdio.h>
#include <sanitizer/coverage_interface.h>
#import <dlfcn.h>
#import <libkern/OSAtomic.h>

@implementation OrderFileTool

//定义原子队列
static OSQueueHead symbolList = OS_ATOMIC_QUEUE_INIT;

//定义符号结构体
typedef struct{
    void *pc;
    void *next;
} SYNode;

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("INIT: %p %p\n", start, stop);
  for (uint32_t *x = start; x < stop; x++)
    *x = ++N;
}


void __sanitizer_cov_trace_pc_guard(uint32_t *guard) {
//  if (!*guard) return;
  //当前函数返回到上一个调用的地址!!
    
    void *PC = __builtin_return_address(0);
    //创建结构体!
   SYNode * node = malloc(sizeof(SYNode));
    *node = (SYNode){PC,NULL};
    
    //加入结构!
    OSAtomicEnqueue(&symbolList, node, offsetof(SYNode, next));
}


- (void)createOrderFile {
    //定义数组
    NSMutableArray<NSString *> * symbolNames = [NSMutableArray array];
    
    while (YES) {//一次循环!也会被HOOK一次!!
       SYNode * node = OSAtomicDequeue(&symbolList, offsetof(SYNode, next));
        
        if (node == NULL) {
            break;
        }
        Dl_info info = {0};
        dladdr(node->pc, &info);
//        printf("%s \n",info.dli_sname);
        NSString * name = @(info.dli_sname);
        free(node);
        
        BOOL isObjc = [name hasPrefix:@"+["]||[name hasPrefix:@"-["];
        NSString * symbolName = isObjc ? name : [@"_" stringByAppendingString:name];
        //是否去重??
        [symbolNames addObject:symbolName];
        /*
        if ([name hasPrefix:@"+["]||[name hasPrefix:@"-["]) {
            //如果是OC方法名称直接存!
            [symbolNames addObject:name];
            continue;
        }
        //如果不是OC直接加个_存!
        [symbolNames addObject:[@"_" stringByAppendingString:name]];
         */
    }
    //反向数组
//    symbolNames = (NSMutableArray<NSString *>*)[[symbolNames reverseObjectEnumerator] allObjects];
    NSEnumerator * enumerator = [symbolNames reverseObjectEnumerator];
    
    //创建一个新数组
    NSMutableArray * funcs = [NSMutableArray arrayWithCapacity:symbolNames.count];
    NSString * name;
    //去重!
    while (name = [enumerator nextObject]) {
        if (![funcs containsObject:name]) {//数组中不包含name
            [funcs addObject:name];
        }
    }
    [funcs removeObject:[NSString stringWithFormat:@"%s",__FUNCTION__]];
    //数组转成字符串
    NSString * funcStr = [funcs componentsJoinedByString:@"\n"];
    NSLog(@"OrderFile###%@",funcStr);
    //字符串写入文件
    //文件路径
    NSString * filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"my.order"];
    //文件内容
    NSData * fileContents = [funcStr dataUsingEncoding:NSUTF8StringEncoding];
    [[NSFileManager defaultManager] createFileAtPath:filePath contents:fileContents attributes:nil];
    
}
@end

相关文章

  • 简谈二进制重排

    二进制重排 二进制重排其实并不是什么特别新颖的技术。 目的 二进制重排(layout)的目的在于将hot code...

  • iOS 优化-二进制重排

    基于二进制文件重排的解决方案 APP启动速度提升超15%启动优化之Clang插桩实现二进制重排iOS启动优化之二进制重排

  • 二进制重排,clang插桩

    二进制重排,clang插桩

  • iOS 启动优化之二进制重排

    首先需要了解什么是二进制重排, 二进制重排为什么能减少启动时间. 编译器把源文件编译成Mach-O可执行文件时,...

  • iOS 启动优化-二进制重排

    一、重排目的 二进制重排就是为了减少启动时的缺页异常Page Fault从而减少启动时间 二、查看Page Fau...

  • 二进制重排

    一、首先获取 重排后方法执行顺序.h 文件 import NS...

  • 二进制重排

    http://yulingtianxia.com/blog/2019/09/01/App-Order-Files/...

  • 二进制重排

    clang插装[https://clang.llvm.org/docs/SanitizerCoverage.htm...

  • 二进制重排

    具体参考: https://www.jianshu.com/p/07bb4c99252c

  • iOS进阶笔记

    1、《iOS开发--应用启动优化/二进制重排》[https://www.bilibili.com/video/BV...

网友评论

      本文标题:二进制重排

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