线上进行热修复

线上进行热修复_第1张图片

热修复原理:就是线上实时修复bug,降低了成本,用户体验也好,不用像原来修复bug(哪怕就是一行代码)还得重新打包再发送新版本到应用市场,再让用户下载,那样成本高不说,用户体验还特别不好;热修复主要是通过android的类加载机制来实现(上图就是整体加载项目apkclass文件的一个过程)

实现简单热修复得步骤:

1.通过PathClassLoader 来加载我们自身App的dex,因为我们要修改自己的bug.
2.通过DexClassLoader来加载我们的补丁dex文件,这里面就是没有bug的dex.
3.先反射两个classLoader的,我们的目的就是拿到这个值.
4.接着我们来继续反射两个classloader中的pathList(注意:是两个!一个是我们自己应用的,另一个是我们补丁的,PathClassLoader和DexClassLoader都继承BaseDexClassLoader),DexPathList里面的,没错还是拿到这个数组的值
5.合并两个反射到的Element 数组!这里是重中之重.我们需要把我们的补丁dex放在数组的最前面!
6.将合并的新的数组,通过Field重新设置到我们自身App的DexPathList->dexElements.没错!就是合并之后覆盖有bug那个loader的Element 数组!!
7.通过Android build-tools 中的dx命令打包一个没有bug的dex
注:假设你的App中有一个class A 出bug了,那么你就可以通过dx命令打包一个只有class A的dex文件.

 首先他会通过pathClassLoder来加载我们自身App的dex文件所在的数组,因为我们要修改自己的bug,

然后通过Dexclassloder来加载我们补丁的dex文件所在的数组,这个就是没有bug的dex,将他们合并在

一个Element[]数组中,重新赋值给我们app的自身类加载器,然后通过双清模式来加载dex,双清模式就

是同一个类名的dex,只加载最前面的一个dex,后面的就不会再加载了,而最先加载的就是我们通过

Dexclassloder加载出来的dex文件来进行修复.


你可能感兴趣的:(线上进行热修复)