很早之前就想深入的研究和学习一下热修复,由于时间的原因一直拖着,现在才执笔弄起来。
Android而更新系列:
Android热更新一:JAVA的类加载机制
Android热更新二:理解Java反射
Android热更新三:Android类加载机制
Android热更新四:热修复机制
Android热更新五:四大热修复方案分析
Android热更新六:Qzone热更新原理
Android热更新七:Tinker热更新原理
Android热更新八:AndFix热更新原理
Android热更新九:Robust热更新原理
Android热更新十:自己写一个Android热修复
阿里百川推出的热修复HotFix服务,相对于QQ空间超级补丁技术和微信Tinker来说,定位于紧急BUG修复的场景下,能够最及时的修复BUG,下拉补丁立即生效无需等待。
1、AndFix实现原理
AndFix不同于QQ空间超级补丁技术和微信Tinker通过增加或替换整个DEX的方案,提供了一种运行时在Native修改Filed指针的方式,实现方法的替换,达到即时生效无需重启,对应用无性能消耗的目的。
原理图如下:
2、AndFix实现过程
对于实现方法的替换,需要在Native层操作,经过三个步骤:
接下来以Dalvik设备为例,来分析具体的实现过程:
1、setup()
对于Dalvik来说,遵循JIT即时编译机制,需要在运行时装载libdvm.so动态库,获取以下内部函数:
1) dvmThreadSelf( ):查询当前的线程;
2)dvmDecodeIndirectRef( ):根据当前线程获得ClassObject对象。
2、setFieldFlag
该操作的目的:把 private、protected的方法和字段都改为public,这样才可被动态库看见并识别,因为动态库会忽略非public属性的字段和方法。
3、replaceMethod
该步骤是方法替换的核心,替换的流程如下:
AndFix对ART设备同样支持,具体的过程与Dalvik相似,这里不再赘述。
从技术原理,不难看出阿里百川HotFix的几个特点:
优势:
BUG修复的即时性
补丁包同样采用差量技术,生成的PATCH体积小
对应用无侵入,几乎无性能损耗
不足:
不支持新增字段,以及修改<init>方法,也不支持对资源的替换。
由于厂商的自定义ROM,对少数机型暂不支持。