主流的热修复方案

  • 主流的热修复方案

主要可以分为两类:一类是基于multidex的热更新框架,包括Nuwa、Tinker等;

另一类就是native hook方案,如阿里开源的Andfix和Dexposed。

有一些问题,基于native hook的方案:需要针对dalvik虚拟机和art虚拟机做适配,需要考虑指令集的兼容问题,需要native代码支持,hook方案都是直接依赖修改虚拟机方法实体的具体字段如果Android厂家对代码进行改造兼容性上会有一定的影响

基于Multidex的方案,需要反射更改DexElements,改变Dex的加载顺序,这使得patch需要在下次启动时才能生效,实时性就受到了影响

Android内部使用的是BaseDexClassLoader、PathClassLoader、DexClassLoader三个类加载器实现从DEX文件中读取类数据,其中PathClassLoader和DexClassLoader都是继承自BaseDexClassLoader实现。dex文件转换成dexFile对象,存入Element[]数组,findclass顺序遍历Element数组获取DexFile,然后执行DexFile的findclass。此方案的原理是Hook了ClassLoader.pathList.dexElements[],将补丁的dex插入到数组的最前端。因为ClassLoader的findClass是通过遍历dexElements[]中的dex来寻找类的。所以会优先查找到修复的类。从而达到修复的效果。

  1. 阿里

开源的AndFix https://github.com/alibaba/AndFix

问题是在16年就停止更新,支持到7.0版本,未来对新版本系统兼容性未知

目前阿里只有稳定的收费的移动热修复(Mobile Hotfix)https://www.aliyun.com/product/hotfix?spm=a2c4g.11174283.2.1.710c30c3m7uF73

收费定价

https://help.aliyun.com/document_detail/57064.html?spm=a2c4g.11186623.6.551.4cff781b4lMJ5P

  1. 腾讯

微信Tinker  https://github.com/Tencent/tinker

微信Tinker采用的方案为了避免dex插桩带来的性能损耗,dex替换采取另外的方式。原理是提供dex差量包,整体替换dex的方案。差量的方式给出patch.dex,然后将patch.dex与应用的classes.dex合并成一个完整的dex,完整dex加载得到dexFile对象作为参数构建一个Element对象然后整体替换掉旧的dex-Elements数组,服务端做dex差量,将差量包下发到客户端,在ART模式的机型上本地跟原apk中的classes.dex做merge,merge成为一个新的merge.dex后将merge.dex插入pathClassLoader的dexElement,为了实现差量包的最小化,Tinker自研了DexDiff/DexMerge算法。Tinker还支持资源和So包的更新,So补丁包使用BsDiff来生成,资源补丁包直接使用文件md5对比来生成,针对资源比较大的(默认大于100KB属于大文件)会使用BsDiff来对文件生成差量补丁。

优点

兼容性高、补丁小、开发透明,代码非侵入式

缺点

冷启动修复,下次启动修复

Dex合并内存消耗在vm head上,容易OOM,最后导致合并失败

官方的tinkerpatch生成补丁已经停止服务

  1. 美团Robust

https://github.com/Meituan-Dianping/Robust/blob/master/README-zh.md

原理可以简单描述为:1、Instant run:打基础包时插桩,在每个方法前插入一段类型为 ChangeQuickRedirect 静态变量的逻辑,插入过程对业务开发是完全透明2、加载补丁时,从补丁包中读取要替换的类及具体替换的方法实现,新建ClassLoader加载补丁dex。当changeQuickRedirect不为null时,可能会执行到accessDispatch从而替换掉之前老的逻辑,达到fix的目的

优点

高兼容性(Robust只是在正常的使用DexClassLoader)、高稳定性,修复成功率高达99.9%

补丁实时生效,不需要重新启动

支持方法级别的修复,包括静态方法

支持增加方法和类

支持ProGuard的混淆、内联、优化等操作

缺点

代码是侵入式的,会在原有的类中加入相关代码

so和资源的替换暂时不支持

会增大apk的体积,平均一个函数会比原来增加17.47个字节,10万个函数会增加1.67M

  • 方案对比

 

如果不考虑增大apk的体积,只是简单的修复代码,不修复so和资源,选择Robust,否则的话选择Tinker 他的功能比较全。阿里Hotfix它不开源,而且商业收费,

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值