[关闭]
@946898963 2020-07-15T09:58:51.000000Z 字数 778 阅读 691

Android热修复主流方案

Android热修复


Native hook

AndFix最著名。原理如下图:

此处输入图片的描述

其修复过程如图:

此处输入图片的描述

这套方案直接使用dalvik_replaceMethod替换class中方法的实现。由于它并没有整体替换class,而field在class中的相对地址在class加载时已确定,所以AndFix无法支持新增或者删除field的情况(通过替换init与clinit只可以修改field的数值)。

基于android dex分包

详细原理介绍传送

我用自己的话总结一下:

  1. 分包方案中,把修改的补丁dex,插入dexElements数组的最前面,这样根据classLoader找寻一个类的机制,理论上会优先找寻补丁dex里的修改类,从而完成修复;
  2. 如果修复好的类和引用该类的类不在同一个dex中则会引发错误,需要防止dexopt给修改后的类增加CLASS_ISPREVERIFIED标志,具体的说明可以参考上述文章;需要注意,dexopt是优化dex的,如果给所有的类都做非preverify,势必会引起一些性能上的损耗。
  3. 上述问题发生在dalvik虚拟机,如果是art上,插桩对代码的执行效率没什么影响,因为art直接执行本地机器码。但是如果补丁中的类出现修改类变量或者方法,可能会导致内存地址错乱,为了解决该问题,需要将修改类的父类、引用类、都加入补丁包中,补丁包会急剧变大。

基于Instant Run的冷插拔原理的Dex替换

Tinker的思路,使用差异dex文件和旧的dex文件,生成修复后的,新的dex文件,从而达到完全使用新的dex的修复效果。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注