热修复原理浅析

热修复的基本思想是把有问题的dex替换掉,这个dex是能在虚拟机运行的文件,我们写的代码经过复杂的编译就转换成了dex文件,那怎么才能把dex替换掉了?

虚拟机是从一个叫Element的数组中找到我们的dex,然后运行,那只要我们把无bug的dex放在集合有bug的dex前面,虚拟机遍历集合的时候,就先找到它,然后加载它就完成了热修复。

那怎么把无bug的dex放在又bug的dex之前了?这里我们就需要用到两个类加载器,pathClassLoader和dexClassLoader,pathClassLoader加载已经安装的dex,就是有bug的dex,dexClassLoader加载未安装的dex,就是无bug的dex。我们现在有了两个dex,接下来就是合成Element数组,这就要使用他俩的父类BaseClassLoader,这个类中有一个属性DexpathList。它能将dex转换成file集合,然后再将集合转化成Element数组,用反射把这个数组赋给app的类加载的pathList中,然后通过父类的findClass()方法找到排在前面的无bug Dex。这样app就从lei'类加载器中拿到无bug的dex加载,这样就完成热修复

猜你喜欢

转载自blog.csdn.net/super_xiaojian/article/details/81072522