Android中的热修复原理(通俗易懂)
脑子里一直有个梗,这个热修复到底是个什么东西呢?来来来,往下看!
什么是热修复?
说的清新脱俗一点,就是线上实时修复bug
为什么要有热修复呢?(优点)
降低了成本,用户体验也好,不用像原来修复bug(哪怕就是一行代码)还得重新打包再发送新版本到应用市场,再让用户下载,那样成本高不说,用户体验还特别不好,所以就出现了热修复。
热修复的原理?
热修复主要是通过android的类加载机制来实现的。Android中有两个类加载器PathClassLoader和DexClassLoader,准确的来说应该是有三个,还有一个BaseDexClassLoader,BaseDexClassLoader是上面这两个类加载器的父类,在BaseDexClassLoader里面有一个重要的属性DexPathList,DexPathList在BaseDexClassLoader的构造函数中被创建出来,DexPathList里面有两个构造函数SplitDexPath()(将dexPath目录下的所有文件转成一个File集合) 和makeDexElments()(将File集合转为Elment数组), 在这个BaseDexClassLoader里面还有一个特别重要的方法,这也是它的核心方法。 findClass()从Elemet数组中拿出一个个dex文件,在从dex文件中搜索class,正因为这个特性,我们只需要将Element数组与App原Element数组合并,得到一个新的Element数组,要注意摆放的先后顺序,然后将这个新的Element数组用反射的方式赋值给App当前类加载器的pathList中的Elements数组,因为pathList的 findClass()是采用遍历方式一个个从Element中找class,而修复好的class所在的Element排在有Bug的class的Element的前面,所以,当App再次从类加载器中拿Class时就只会拿到前面的Class,也就是Bug已经修复好的class。这就是热修复的原理。。。 看图说话: