iOS App啟動(dòng)優(yōu)化二進(jìn)制重排

步驟一:添加 Build Setting 設(shè)置

Target -> Build Setting -> Custom Complier Flags ->

Other C Flags?添加

-fsanitize-coverage=func,trace-pc-guard

Other Swift Flags?添加

-sanitize-coverage=func

-sanitize=undefined

步驟二:添加代碼

添加到啟動(dòng)最早的那個(gè)?ViewController?即可洒缀。

#import "dlfcn.h"

#import <libkern/OSAtomic.h>


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;? // Guards should start from 1.

}

//初始化原子隊(duì)列

static OSQueueHead list = OS_ATOMIC_QUEUE_INIT;

//定義節(jié)點(diǎn)結(jié)構(gòu)體

typedef struct {

? ? void *pc;? //存下獲取到的PC

? ? void *next; //指向下一個(gè)節(jié)點(diǎn)

} Node;

void __sanitizer_cov_trace_pc_guard(uint32_t *guard) {

? ? void *PC = __builtin_return_address(0);

? ? Node *node = malloc(sizeof(Node));

? ? *node = (Node){PC, NULL};

? ? // offsetof() 計(jì)算出列尾坦敌,OSAtomicEnqueue() 把 node 加入 list 尾巴

? ? OSAtomicEnqueue(&list, node, offsetof(Node, next));

}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

? ? NSMutableArray *arr = [NSMutableArray array];

? ? while(1){

? ? ? ? //有進(jìn)就有出隘擎,這個(gè)方法和 OSAtomicEnqueue() 類比使用

? ? ? ? Node *node = OSAtomicDequeue(&list, offsetof(Node, next));

? ? ? ? //退出機(jī)制

? ? ? ? if (node == NULL) {

? ? ? ? ? ? break;

? ? ? ? }

? ? ? ? //獲取函數(shù)信息

? ? ? ? Dl_info info;

? ? ? ? dladdr(node->pc, &info);

? ? ? ? NSString *sname = [NSString stringWithCString:info.dli_sname encoding:NSUTF8StringEncoding];

? ? ? ? printf("%s \n", info.dli_sname);

? ? ? ? //處理c函數(shù)及block前綴

? ? ? ? BOOL isObjc = [sname hasPrefix:@"+["] || [sname hasPrefix:@"-["];

? ? ? ? //c函數(shù)及block需要在開頭添加下劃線

? ? ? ? sname = isObjc ? sname: [@"_" stringByAppendingString:sname];


? ? ? ? //去重

? ? ? ? if (![arr containsObject:sname]) {

? ? ? ? ? ? //因?yàn)槿霔5臅r(shí)候是從上至下,取出的時(shí)候方向是從下至上柴钻,那么就需要倒序淮韭,直接插在數(shù)組頭部即可

? ? ? ? ? ? [arr insertObject:sname atIndex:0];

? ? ? ? }

? ? }


? ? //去掉 touchesBegan 方法 啟動(dòng)的時(shí)候不會(huì)用到這個(gè)

? ? [arr removeObject:[NSString stringWithFormat:@"%s",__FUNCTION__]];

? ? //數(shù)組合成字符串

? ? NSString * funcStr = [arr? componentsJoinedByString:@"\n"];

? ? //寫入文件

? ? NSString * filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"link.order"];

? ? NSData * fileContents = [funcStr dataUsingEncoding:NSUTF8StringEncoding];

? ? NSLog(@"%@", filePath);

? ? [[NSFileManager defaultManager] createFileAtPath:filePath contents:fileContents attributes:nil];

}

步驟三:取出 order file

在步驟二的代碼NSLog(@"%@", filePath);?斷點(diǎn)

如果頁(yè)面無法觸發(fā)點(diǎn)擊,viewDidLoad里面調(diào)用touchesBegan:withEvent:也可以

運(yùn)行代碼后記錄?link.order?的路徑

Finder?前往路徑取出?order file

步驟四:設(shè)置 order file

把?link.order?的路徑放到工程根目錄

Target -> Build Setting -> Linking -> Order File?設(shè)置路徑


步驟五:編譯代碼

把步驟一?order file?的設(shè)置還原

把步驟二添加代碼刪除

clean?以后編譯代碼


參考鏈接:

https://juejin.im/post/6844904165773328392

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末贴届,一起剝皮案震驚了整個(gè)濱河市靠粪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌毫蚓,老刑警劉巖占键,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異元潘,居然都是意外死亡畔乙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門柬批,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人袖订,你說我怎么就攤上這事氮帐。” “怎么了洛姑?”我有些...
    開封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵上沐,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我楞艾,道長(zhǎng)参咙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任硫眯,我火速辦了婚禮蕴侧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘两入。我一直安慰自己净宵,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著择葡,像睡著了一般紧武。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上敏储,一...
    開封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天阻星,我揣著相機(jī)與錄音,去河邊找鬼已添。 笑死妥箕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的酝碳。 我是一名探鬼主播矾踱,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼疏哗!你這毒婦竟也來了呛讲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤返奉,失蹤者是張志新(化名)和其女友劉穎贝搁,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芽偏,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡雷逆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了污尉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膀哲。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖被碗,靈堂內(nèi)的尸體忽然破棺而出某宪,到底是詐尸還是另有隱情,我是刑警寧澤锐朴,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布兴喂,位于F島的核電站,受9級(jí)特大地震影響焚志,放射性物質(zhì)發(fā)生泄漏衣迷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一酱酬、第九天 我趴在偏房一處隱蔽的房頂上張望壶谒。 院中可真熱鬧,春花似錦膳沽、人聲如沸佃迄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)呵俏。三九已至堆缘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間普碎,已是汗流浹背吼肥。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留麻车,地道東北人缀皱。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像动猬,于是被迫代替她去往敵國(guó)和親啤斗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350