Android中的hotfix机制探秘

590 阅读2分钟

一 主要机制分类

hotfix在各大平台的下,有一些公用机制,比如hook机制,是比较容易想到的。之前的一篇文章指出的iOS下的Hotfix机制以及提及。

另外,一种针对特定平台的机制,比如Android平台下,类的装载机制,可以衍生各自的思想。

针对Android平台,由于google开放源码的原因,对内部探索比较多,可以初步分为两类。

1 基于multidex的hotfix热修复方案

依据类加载机制,最新dex加载的class代替后续的dex文件的class,相关的平台有:Tinker(微信),QZone的超级补丁,大众点评的Nuwa,百度金融的RocooFix,饿了么的Amigo

具体的实现方式,就是对dexElements的获取列表进行人为的修改,将patch的dex作为优先项目,可以参考3的源码部分。

2 基于Instant Run热插拔方案

美团的Robust,对代码的每个函数在编译打包阶段自动插入了一段代码,对方法进行了Hook,类似AOP的方式。参考1文章中有示意图---(原理为编译器采用自制gradle的插件,针对需要patch的类函数增加一段redirect类的代码段,在执行期间,检查是否有redirect实现,有的话进入这个patch的新类里,执行被代替函数的同名函数实现体。由于是代码侵入式,所以出错时容易出现幻觉(栈信息理解上)。

3 基于Dexposed技术

核心思想是在native层获取到指定的结构体,然后改变它的nativeFunc字段值,而这个值就是可以指定这个方法对应的native函数指针。阿里的AndFix就是采用的之类技术。

二 相关框架的使用对比

以下图表能表示各个策略的优缺点:

由于Dexposed不能增加方法或者类,所以整体来说,虽然性能较好,但比较适合fix bug这样的小动作,也有人提出适合做远程debug。 前两种方法方法由于能增加类,动态性强,但需要增加patch的管理,需要有一个平台思路,当然android发布周期还是相对apple的快,可以适当中间插入1,2个patches后,重新发布新版本(不过用户不强制更新,还是需要对patches包进行管理)。

参考

  1. www.cnblogs.com/popfisher/p…
  2. www.jianshu.com/p/cb39b1797…
  3. github.com/jasonross/N…