Android热更新八:AndFix热更新原理

很早之前就想深入的研究和学习一下热修复,由于时间的原因一直拖着,现在才执笔弄起来。

Android而更新系列:
Android热更新一:JAVA的类加载机制
Android热更新二:理解Java反射
Android热更新三:Android类加载机制
Android热更新四:热修复机制
Android热更新五:四大热修复方案分析
Android热更新六:Qzone热更新原理
Android热更新七:Tinker热更新原理
Android热更新八:AndFix热更新原理
Android热更新九:Robust热更新原理
Android热更新十:自己写一个Android热修复

阿里百川推出的热修复HotFix服务,相对于QQ空间超级补丁技术和微信Tinker来说,定位于紧急BUG修复的场景下,能够最及时的修复BUG,下拉补丁立即生效无需等待。

《Android热更新八:AndFix热更新原理》

1、AndFix实现原理

AndFix不同于QQ空间超级补丁技术和微信Tinker通过增加或替换整个DEX的方案,提供了一种运行时在Native修改Filed指针的方式,实现方法的替换,达到即时生效无需重启,对应用无性能消耗的目的。

原理图如下:

《Android热更新八:AndFix热更新原理》

2、AndFix实现过程

对于实现方法的替换,需要在Native层操作,经过三个步骤:

《Android热更新八:AndFix热更新原理》 image

接下来以Dalvik设备为例,来分析具体的实现过程:

1、setup()

《Android热更新八:AndFix热更新原理》

对于Dalvik来说,遵循JIT即时编译机制,需要在运行时装载libdvm.so动态库,获取以下内部函数:

1) dvmThreadSelf( ):查询当前的线程;

2)dvmDecodeIndirectRef( ):根据当前线程获得ClassObject对象。

2、setFieldFlag

《Android热更新八:AndFix热更新原理》

该操作的目的:把 private、protected的方法和字段都改为public,这样才可被动态库看见并识别,因为动态库会忽略非public属性的字段和方法。

3、replaceMethod

《Android热更新八:AndFix热更新原理》

该步骤是方法替换的核心,替换的流程如下:

《Android热更新八:AndFix热更新原理》

AndFix对ART设备同样支持,具体的过程与Dalvik相似,这里不再赘述。

从技术原理,不难看出阿里百川HotFix的几个特点:

优势:
BUG修复的即时性
补丁包同样采用差量技术,生成的PATCH体积小
对应用无侵入,几乎无性能损耗

不足:
不支持新增字段,以及修改<init>方法,也不支持对资源的替换。
由于厂商的自定义ROM,对少数机型暂不支持。

    原文作者:雨纷纷__
    原文地址: https://www.jianshu.com/p/343fed808714
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞