深入探索android热修复技术原理_Android 热修复原理

code小生,一个专注 Android 领域的技术平台

公众号回复 Android 加入我的安卓技术群

作者:Android姿态
链接:https://www.jianshu.com/p/8f1ca1c21278
声明:本文已获Android姿态授权发表,转发等请联系原作者授权

一. AndFix

AndFix的原理就是方法的替换,把有bug的方法替换成补丁文件中的方法。

888d98d4ebefe3e5cde3812fbb459dc2.png
image.png

注:在Native层使用指针替换的方式替换bug方法,已达到修复bug的目的。

AndFix采用native hook的方式,这套方案直接使用dalvik_replaceMethod替换class中方法的实现。由于它并没有整体替换class, 而field在class中的相对地址在class加载时已确定,所以AndFix无法支持新增或者删除filed的情况(通过替换init与clinit只可以修改field的数值)。Andfix可以支持的补丁场景相对有限,仅仅可以使用它来修复特定问题。

二. QZone(插桩方式)

该方案基于的是android dex分包方案的, 简单的概括一下,就是把多个dex文件塞入到app的classloader之中,但是android dex拆包方案中的类是没有重复的,如果classes.dex和classes1.dex中有重复的类,当用到这个重复的类的时候,系统会选择哪个类进行加载呢?  让我们来看看类加载的代码:

924156360c5a8bd9d8d1a3d2395ee70d.png
image

一个ClassLoader可以包含多个dex文件,每个dex文件是一个Element,多个dex文件排列成一个有序的数组dexElements,当找类的时候,会按顺序遍历dex文件,然后从当前遍历的dex文件中找类,如果找类则返回,如果找不到从下一个dex文件继续查找。
理论上,如果在不同的dex中有相同的类存在,那么会优先选择排在前面的dex文件的类,如下图:

61c4433b5b9f4ac2627afaee5fb8d143.png
image

在此基础上,我们构想了热补丁的方案,把有问题的类打包到一个dex(patch.dex)中去,然后把这个dex插入到Elements的最前面,如下图:

7793861e51ef601c21555e3488344d94.png
image

三. 微信Tinker(差量包)

Instant Run的冷插拔与buck的exopackage或许能给我们灵感,它们的思想都是全量替换新的Dex。

我们可以将新旧两个Dex的差异放到补丁包中,最简单我们可以采用BsDiff算法。

59d8c8469cd35b38b216c3d9d7b6d51a.png
image.png

简单来说,在编译时通过新旧两个Dex生成差异path.dex。在运行时,将差异patch.dex重新跟原始安装包的旧Dex还原为新的Dex。这个过程可能比较耗费时间与内存,所以我们是单独放在一个后台进程:patch中。为了补丁包尽量的小,微信自研了DexDiff算法,它深度利用Dex的格式来减少差异的大小。

四、阿里Sophix

原理(双剑合璧):

ea81831ecdb73c10dba260196c8bcbe0.png
image
1.优化Andfix(突破底层结构差异,解决稳定性问题):

Andfix底层ArtMethod结构时采用内部变量一一替换,倒是这个各个厂商是会修改的,所以兼容性不好。

9d165e8cb5b92c9e6815528bedd85388.png
image

Sophix改变了一下思路,采用整体替换方法结构,忽略底层实现,从而解决兼容稳定性问题。

04f6a6acea4f5a231afd3a9a2e0a412f.png
image
2.突破QQ和Tinker的缺陷

QQ和Tinker的缺陷

b057f2b8c4227922859746109834b8da.png
image

Sophix对dex的解决方案

  • Dalvik下采用阿里自研的全量dex方案:不是考虑把补丁包的dex插到所有dex前面(dex插桩),而是想办法在原理的dex中删除(只是删除了类的定义)补丁dex中存在的类,这样让系统查找类的时候在原来的dex中找不到,那么只有补丁中的dex加载到系统中,系统自然就会从补丁包中找到对应的类。

  • Art下本质上虚拟机以及支持多dex的加载,Sophix的做法仅仅是把补丁dex作为主dex(classes.dex)而已,相当于重新组织了所有的dex文件:把补丁包的dex改名为classes.dex,以前apk的所有dex依次改为classes2.dex、classes3.dex … classesx.dex,如下图所示。

8b21e7a3a2ca70f1cbe87c08641e226c.png
image
3.资源修复另辟蹊径

常用方案(Instant Run技术):这种方案的兼容问题在于替换AssetManager的地方

71d6879608749caa7015a30a7375590b.png
image

Sophix资源修复方案

e075b661b19f3fff2b1602538879e77f.png
image
4.SO修复另辟蹊径
17d596e8cd4619ff0ec83dfb925bc6a2.png
image

推荐阅读

热修复技术的实践之旅——微信TinkerPatch热修复结合Walle多渠道打包的详解

热修复——Bugly 让热修复变得如此简单

热修复——Tinker 的集成与使用

210c52c7a616bc473ba9f912ebb2144d.png

支持,「在看」b5acf7722e479e6d5514a8b5de10f11d.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值