热修复技术
- Dexposed、andFix (阿里)
- 从C底层二进制进行处理的
- thinker (腾讯)
- Java的加载机制入手处理的
热修复的定义
通常情况下,修复app的bug是通过发布新版本进行。热修复提供了一种在现有安装程序上进行修复bug
bug一般会出现在某个类的某个方法地方。
如果我们能够动态地将客户手机里面的apk里面的某个类给替换成我们已经修复好的类。
修复前的工具准备
关闭AndroidStudio的instant run功能。因为该功能本身就是dex分包。
实现原理
从Java的类加载机制来入手的。
ClassLoader
- DexClassLoader 可以加载指定的某个dex文件。(限制:必须要在应用程序的目录下面)
- PathClassLoader 用来加载应用程序的dex
利用DexClassLoader
修复方案:搞多个dex。
第一个版本:classes.dex
修复后的补丁包:classes2.dex(包涵了我们修复xxx.class)
这种实现方式也可以用于插件开发
dex合并
如果可以解决这个问题:把两个dex合并—将修复的class替换原来出bug的class
protected Class<?> findClass(String name) throws ClassNotFoundException {
List<Throwable> suppressedExceptions = new ArrayList<Throwable>();
Class c = pathList.findClass(name, suppressedExceptions);
return c;
}
通过pathList对象,进行字节码的查找
public Class findClass(String name, List<Throwable> suppressed) {
for (Element element : dexElements) {
DexFile dex = element.dexFile;
Class clazz = dex.loadClassBinaryName(name, definingContext, suppressed);
if (clazz != null) {
return clazz;
}
}
}