之前一个blog简单介绍了Android热修复的nuwa使用demo。这篇blog主要来汇总下Android热修复的几种方案和利弊比较。
Android热修复技术方案主要是两种:1.QQ空间超级补丁和微信Tinker方式。2.阿里巴巴的And Fix、Hot Fix方案。
现在分别介绍下这两种方案的利弊,及使用场景。
1. QQ空间超级补丁和微信Tinker方式。
这两种方案设计的出发点是替换原有的资源、成员变量、方法和类。这两种方式实现的又略有不同。
1)QQ空间超级补丁
实现原理是基于Google提供的mutlidex方式。即apk可以加载多个dex文件。针对apk中需要修复的dex,做一个修复的patch.dex文件。当apk重新加载的时候,优先加载patch.dex。之后再加载其他dex文件。这样apk运行的时候,使用的就是新的class文件。
限制:a) 需要apk重新启动才能生效
b) 需要考虑到Android 对类的verify操作。
“Android对类的verify操作”,即apk安装到机器上,在运行时,虚拟机会将dex文件优化成odex文件,
在这个过程中,会对类检查,如果一个类的引用都在同一个dex文件中,则会打上CLASS_ISPREVERIFIED的标志。
所以,这里我们需要对需要热修复的类都要避免打上这个标志。nuwa(采用该原理),实现方式是让app中所有java都导入一个辅助apk中的类。这样app中所有java文件,导入的类,都不在一个dex文件中,所以,就不会打上CLASS_ISPREVERIFIED标志。
c) patch.dex的加载,会影响app的启动速度。
d) Android ART模式下,如果改动了类的结构,就可能会出现内存错乱的问题。所以,需要将相关类和父类、子类都放到patch.dex。
2)微信Tinker方式。
微信的实现原理,则是将patch.dex,与自由的dex文件合并。第二次启动app的时候,会执行新的dex文件,从而解决此问题。
限制:a) 需要app二次启动才能生效
b) dex文件合并可能会出现失败
c) dex文件合并会占用机器的存储
总结:1)可以进行成员变量、方法、类的替换。支持力度较大。
2)app需要重新启动才能生效
2.AndFix、HotFix方式。
HotFix是AndFix的升级版,即将patch.dex文件可以进行加密等安全方面处理。
它的实现方式是更改方法的引用指针指向,然后及时更新。
限制:1)只能修改函数。热修复使用范围有限,修改点有限。
总结:1)只能修改函数,不能更新资源文件、添加成员变量等
2)app运行时候立刻就能起作用
3)代价较小。
适合函数的bug修复。