apk+热补丁
参考文献:
- http://zhuanlan.zhihu.com/magilu/20308548
- https://github.com/dodola/HotFix
- http://blog.csdn.net/zylc369/article/details/44618229
系统环境
硬件环境:macOS
IDE :Android studio
前言
什么是热补丁?
当一个APP发布以后,如果某个类或者模块出现bug需要修复,这时需要重新编译、打包、测试APP,之后再发到各个渠道,提示用户升级,覆盖安装更新版本,而改动却仅仅是一行代码。
这时如果服务器提供一份修复的代码,app在下载到这份代码之后,直接替换掉原来的代码该是件多么温馨的事啊。
热补丁就是完成这样的事。
热补丁原理
该原理简单的来说就是类替换:将有问题的类替换成我们修复的类。
正常的app解压之后只有一个classes.dex文件,该文件是Android Dalvik虚拟机可以执行的文件。如图:
如果你知道Android multidex(也叫Android分包)的话,就会知道一个app里是可以有多个dex文件的。
我们的修复类就在classes2.dex(后面我们会对该文件进行重新打包为途中的path_dex.jar文件,这个操作后续会说)。
我们知道,multidex方案的实现,其实就是把多个dex放进app的classloader之中,从而使得所有dex的类都能被找到。在虚拟机findClass的过程中,如果在两个dex文件中出现了重复的类,参照下面的类加载的实现,是会使用第一个找到的类的。
public Class findClass(String name, List<Throwable> suppressed) {
for (Element element : dexElements) { //每个Element就是一个dex文件
DexFile dex = element.dexFile;
if (dex != null) {
Class clazz = dex.loadClassBinaryName(name, definingContext, suppressed);
if (clazz != null) {
return clazz;
}
}
}
if (dexElementsSuppressedExceptions != null) {
suppressed.addAll(Arrays.asList(dexElementsSuppressedExceptions));
}
return null;
}
该热补丁方案就是从这一点出发,只要把有问题的类修复后,放到一个单