如果要对load函数进行hook,需要做到下面两点:
1,在系统调用load方法之前对load进行hook
2,对load进行hook
研究:
1,经过runtime源码分析,在程序启动的时候先调用mapImages(加载所有mach-0文件),for循环调用所有mach-o文件的loadImage函数(该函数第一次调用会加载所有mach-o分类信息,并调用改mach-o文件的load函数),
2,根据Cocopods的源码,动态库的优先级比静态库高,库名字的ascall码小的先加载,
实现方案:
编写一个动态库字库,库的名字首字母要保证是所有动态库最小的,
在该库中通过attribute(constructor)函数(该函数会在该库的load函数后调用),在这个时候已经加载了所有的分类信息,并且还没有调用业务中的其他load函数,这个时候可以拿到所有unlazy类,然后进行hook拦截
load方法过多到时启动慢的原因是类的release这个操作很耗时
参考:
https://triplecc.github.io/2019/05/27/%E8%AE%A1%E7%AE%97load%E8%80%97%E6%97%B6/