如果要對(duì)load函數(shù)進(jìn)行hook,需要做到下面兩點(diǎn):
1,在系統(tǒng)調(diào)用load方法之前對(duì)load進(jìn)行hook
2,對(duì)load進(jìn)行hook
研究:
1,經(jīng)過(guò)runtime源碼分析,在程序啟動(dòng)的時(shí)候先調(diào)用mapImages(加載所有mach-0文件),for循環(huán)調(diào)用所有mach-o文件的loadImage函數(shù)(該函數(shù)第一次調(diào)用會(huì)加載所有mach-o分類(lèi)信息,并調(diào)用改mach-o文件的load函數(shù)),
2,根據(jù)Cocopods的源碼,動(dòng)態(tài)庫(kù)的優(yōu)先級(jí)比靜態(tài)庫(kù)高,庫(kù)名字的ascall碼小的先加載,
實(shí)現(xiàn)方案:
編寫(xiě)一個(gè)動(dòng)態(tài)庫(kù)字庫(kù),庫(kù)的名字首字母要保證是所有動(dòng)態(tài)庫(kù)最小的,
在該庫(kù)中通過(guò)attribute(constructor)函數(shù)(該函數(shù)會(huì)在該庫(kù)的load函數(shù)后調(diào)用),在這個(gè)時(shí)候已經(jīng)加載了所有的分類(lèi)信息,并且還沒(méi)有調(diào)用業(yè)務(wù)中的其他load函數(shù),這個(gè)時(shí)候可以拿到所有unlazy類(lèi),然后進(jìn)行hook攔截
load方法過(guò)多到時(shí)啟動(dòng)慢的原因是類(lèi)的release這個(gè)操作很耗時(shí)
參考:
https://triplecc.github.io/2019/05/27/%E8%AE%A1%E7%AE%97load%E8%80%97%E6%97%B6/