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