文档章节

Android热修复方案调研

AwesomeQA
 AwesomeQA
发布于 2017/08/24 13:40
字数 1117
阅读 13
收藏 0

一. 当前热修复方案-AndFix

AndFix,全称是Android hot-fix。是阿里开源的一个Android热补丁框架,允许APP在不重新发布版本的情况下修复线上的bug,支持Android 2.3 到 7.0。
AndFix执行的原理是实现方法体的替换,如下图所示:

macdown ScreenShot
AndFix通过Java的自定义注解来判断一个方法是否应该被替换,如果可以就会hook该方法并进行替换。AndFix在ART架构上的Native方法是art_replaceMethod 、在X86架构上的Native方法是dalvik_replaceMethod。对于Dalvik,它将改变目标方法的类型为Native同时hook方法的实现至AndFix自己的Native方法。对于ART来说,我们仅仅改变目标方法的属性来替代它。

二. 微信热修复方案-Tinker

Tinker是微信官方的Android热补丁解决方案,它支持动态下发代码、So库以及资源,让应用能够在不需要重新安装的情况下实现更新。
Tinker 的方案来源 gradle 编译的 instant run 与 buck 编译的 exopackage。它的思想都是全量替换新的 Dex。即我们完全使用了新的 Dex,那样既不出现 Art 地址错乱的问题,在 Dalvik 也无需插桩。但全量合成带来的问题是在Art上会占用大量Rom体积,同时受不同厂商OTA升级的影响以及AndroidN下混合编译带来的问题。因此在全量合成Dex的基础上提出了分平台合成的方案。
在 Dalvik 平台,我们合成全量的 dex,这可以避免我们插桩的要求。
在 Art 平台,我们只合成上述三个条件下的类:
a. 修改跟新增的 class;
b. 若 class 有 field,method 或 interface 数量变化,它们所有的子类;
c. 若 class 有 field,method 或 interface 数量变化,它们以及它们所有子类的调用类。如果采用 ClassN 方式,即需要多个 dex 一起处理。

三. 市面主流方案对比

当前市面的热补丁方案有很多,其中比较出名的有阿里的AndFix、美团的Robust以及QZone的超级补丁方案。

 

Tinker

QZone

AndFix

Robust

类替换 yes yes no no
So替换 yes no no no
资源替换 yes yes no no
全平台支持 yes yes yes yes
即时生效 no no yes yes
性能损耗 较小 较大 较小 较小
补丁包大小 较小 较大 一般 一般
开发透明 yes yes no no
复杂度 较低 较低 复杂 复杂
gradle支持 yes no no no
Rom体积 较大 较小 较小 较小
成功率 较高 较高 一般 最高

四. Tinker的局限性

由于原理与系统限制,Tinker有以下已知问题:

  1. Tinker不支持修改AndroidManifest.xml,Tinker不支持新增四大组件;
  2. 由于Google Play的开发者条款限制,不建议在GP渠道动态更新代码;
  3. 在Android N上,补丁对应用启动时间有轻微的影响;
  4. 不支持部分三星android-21机型,加载补丁时会主动抛出”TinkerRuntimeException:checkDexInstall failed”;
  5. 由于各个厂商的加固实现并不一致,在1.7.6以及之后的版本,tinker不再支持加固的动态更新;
  6. 对于资源替换,不支持修改remoteView。例如transition动画,notification icon以及桌面图标。

五. 总结

  1. AndFix作为native解决方案,首先面临的是稳定性与兼容性问题,更重要的是它无法实现类替换,它是需要大量额外的开发成本的;
  2. Robust兼容性与成功率较高,但是它与AndFix一样,无法新增变量与类只能用做的bugFix方案;
  3. Qzone方案可以做到发布产品功能,但是它主要问题是插桩带来Dalvik的性能问题,以及为了解决Art下内存地址问题而导致补丁包急速增大的。
    特别是在Android N之后,由于混合编译的inline策略修改,对于市面上的各种方案都不太容易解决。而Tinker热补丁方案不仅支持类、So以及资源的替换,它还是2.X-7.X的全平台支持。利用Tinker我们不仅可以用做bugfix,甚至可以替代功能的发布。

六. 参考资料

  1. Tinker github https://github.com/Tencent/tinker
  2. AndFix github https://github.com/alibaba/AndFix
  3. Instant Run工作原理及用法中文翻译稿 http://www.jianshu.com/p/2e23ba9ff14b
  4. Buck exopackage 介绍 https://buckbuild.com/article/exopackage.html

© 著作权归作者所有

上一篇: git常用操作技巧
下一篇: Tinker热修复流程
AwesomeQA
粉丝 7
博文 70
码字总数 55188
作品 0
海淀
QA/测试工程师
私信 提问
阿里大牛推荐!业界首部安卓热修复宝典免费下载!

继《阿里巴巴Java开发手册》后,我们为小伙伴们带来了第二份礼物:业界首部全方位完整介绍热修复原理书籍《深入理解Android热修复技术原理》,该书为阿里巴巴手淘技术团队撰写,现已免费开放...

阿里云云栖社区
2017/07/06
0
0
荐书丨深入探索Android热修复技术原理

点击上方“程序人生”,选择“置顶公众号” 第一时间关注程序猿(媛)身边的故事 Android 系统热修复技术之作|移动开发人员人手一本查阅| 详解Sophix 热修复开发实践过程 热修复技术,可以看...

CSDN程序人生
2018/09/01
0
0
热修复技术的实践之旅——微信TinkerPatch热修复结合Walle多渠道打包的详解

本文导语: 本文的核心内容介绍: (1)对比当前市场上的热修复方案,对Tinker热修复方案进行了简单的介绍。 (2)详细讲解了微信Tinker的完整接入过程,文末提供了一个自己写的非常轻量的D...

懂音乐码虫
2018/05/29
0
0
Android热修复Sophix

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangyonghui_1234/article/details/79657246 阿里热修复最新版本 热修复技术现在已经很成熟了,至今还没有用过...

wang_yong_hui_1234
2018/03/23
0
0
笔记 深入探索Android热修复技术原理

阿里电子书《深入探索Android热修复技术原理》整理的笔记 1.热修复技术介绍 代码修复两大主要方案 代码修复底层替换方案 代码修复类加载方案 资源修复 SO库修复:本质上是对native方法的修复和...

幻海流心
2018/05/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
5
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
6
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
7
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
6
0
【技术分享】TestFlight测试的流程文档

上架基本需求资料 1、苹果开发者账号(如还没账号先申请-苹果开发者账号申请教程) 2、开发好的APP 通过本篇教程,可以学习到ios证书申请和打包ipa上传到appstoreconnect.apple.com进行TestF...

qtb999
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部