概述

没有 Bug 的程序几乎是不存在的,加上 App 更新版本过程又很繁琐,热修复技术从一提出,就拥有很大的技术需求市场。从去年下半年开始,热修复技术就在 Android 技术社区火了一阵子,最近阿里百川正式开启了HotFix 产品的公测服务,这也意味着开始有平台专门提供热修复服务,让普通的开发者和一些小公司也有机会使用上热修复技术,让这项技术不再是大公司才折腾得起、用得起的。当然使用效果或者说提供的服务质量具体怎么样还有待验证。

热修复基本原理

热修复的基本原理并不多,目前已知可用的热修复实现的原理主要有以下几种:

  1. 基于 Xposed 实现的无侵入的运行时 AOP (Aspect-oriented Programming)  框架,可以实现在线修复 Bug,修复粒度方法级别,但是由于对 ART 虚拟机不支持,导致其对 Android 5.0、6.0 均不支持,使用局限性太大。目前基于这一原理实现的解决方案是手淘团队开源的 Dexposed 项目。
  2. native hook 方式,其核心部分在 JNI 层对方法进行替换,替换有问题的方法,修复粒度方法级别,无法在类中新增和删减字段,可以做到即时生效,该原理的实现方案主要是阿里团队开源的 AndFix
  3. 该原理由 QQ 空间技术团队提出,使用新的 ClassLoader 加载 patch.dex,hack 默认的 ClassLoader,替换有问题的类,修复粒度类级别,一般无法做到即时生效,需要在应用下一次启动时生效。目前基于该原理实现的方案有 NuwaHotFixRocooFix
  4. dex 文件全量替换,基于 DexDiff 技术,对比修复前后的 dex 文件,生成 patch.dex,再根据 patch.dex 更新有问题的 dex 文件。该方案由微信团队提出:微信Android热补丁实践演进之路 ,暂时还未开源。目前基于这一原理实现的开源方案只有一个:Tinker_imitator

目前热修复的原理基本就这四种,考虑到使用的兼容性、可实现性以及可操作性,基本上能实际应用到项目中的就剩下了 2、3 两种了,至于第 4 种方式,只能等微信团队开源出比较成熟的方案,方可实际应用。

开源的热修复方案对比

对比总结

就热修复实现的基本原理而言,目前较为成熟的也就 native hook 方式ClassLoader 方式,在这两个基本原理上实现的开源方案中,AndFix 和 RocooFix 较为成熟,相关的打补丁配套解决方案也比较完备。

如果你选择 AndFix 方案,比较倾向于推荐使用阿里百川的 HotFix 服务,希望该服务在公测之后有一个比较完整的服务方案给出,提供一个保证质量的服务。

如果你选择 RocooFix 方案,你可能需要跟进作者的更新,及时反馈相关的问题,帮助作者来完善该项目,使得其在兼容性更加提升一步,同时在配套的生成补丁和下发补丁等方案也保证简单可使用。

你也可以选择等待微信团队开源 Tinker 项目,毕竟鹅厂这套解决方案看起来很不错,在其实际应用到微信项目的基础上,开源出完整的解决方案,必将是一件有利于开发者的好事。

感谢各大公司的技术团队和开源作者们的工作,正是他们让热修复得以实现,虽然各大解决方案都不是那么完美,但是已经有很大改进了,我们期待着越来越多的公司和开发者能够加入到这一工作中来,让热修复不再 “烫” 手。

参考文章

Title
搭个梯子,去看看墙外的世界(超低价,亲测稳定、速度快)