热修复技术沉思:jspatch
硬修复:
直接修改工程源码,重新发版;
冷修复:
打补丁包,使用动态库和hook技术,在程序启动时完成问题代码修复;案例:iOS逆向工程;
特征:不修改原始代码、补丁发布、目前不支持动态发布;
热修复:
可执行文件内直接继承热修复启动机制;
程序启动后热修复引擎动态检查家在补丁包,完成动态hook;
原理:
1、修复引擎包含更新检查;
2、消息重定向;将需要修改的功能和新添加的功能重定向到JPForwardInvocation;
在JPForwardInvocation中区别对待无修改和修改过的函数;
修改过的函数最终会调用js进行解释执行;
3、js包含的修改过的功能最终会解释为oc执行;
这个方法成功调用会经历哪些流程呢?
基本上这就是一个Patch方法调用的流程。
首先点击按钮调用handlebtn方法,其IMP未找到跑到消息转发流程,经过resolveInstanceMethod->forwardingTargetForSelector->forwardInvocation等方法,因为最后的forwardInvocation方法被用method swizzling 转换成了JPForwardInvocation,所以JPForwardInvocation被调用。
首先查找方法对应的JPSelector是否存在,如果不存在调用原forward方法,如果存在调用JPSelector对应的IMP。
记得上一篇我们在patch(即demo.js)加载时说过,会将Patch方法以JSValue的形式存储在OC的列表__JSOverrideMethods里面。
这个JPSelector的IMP的功能就是找到以JSValue形式存储的Patch方法,然后调用它。
https://www.mobilezhao.com/?tag=jspatch