热修复

热修复技术

  • 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;
                }  
        } 
    }   

猜你喜欢

转载自blog.csdn.net/dirksmaller/article/details/78336631
今日推荐