背景
在iOS开发过程中,是否经常遇到这样的场景:简单修改几行代码,想要立刻看到效果,却需要重新增量编译,苦苦等待编译、链接、安装、运行这个漫长的过程;特别是在中大型项目(如手Q)中,增量编译耗时也要60s甚至更多,非常影响开发效率。
为了解决增量编译,业界上也有IPAPatch及InjectionIII方案:
IPAPatch 是基于编译子工程,链接为动态库打包到宿主工程,需要改变代码依赖逻辑,使用局限性大且效果并不理想。
InjectionIII 也是基于dylib注入原理实现的iOS热重载能力,但是不支持真机以及dylib注入时仅简单处理函数替换,热重载的能力存在比较大的局限性,如存在对release版本静态库或动态库依赖的代码文件或存在被hook的类的实现代码文件进行热重载,要么无法支持,要么可能出现循环调用而导致应用出现Crash,且对Swift、C++代码的热重载支持也非常有限。如果基于InjectionIII的基础上进行开发,后续如果InjectionIII更新则不利于迭代。
上述两个方案均不能满足我们的需求,因此我们决定在基于dylib注入的原理基础上对热重载实现进行探索实现。