通过源码我们知道Android加载类是通过ClassLoad类里面的findClass先去查找的,如下图所示

Android为TV端助力之热修复原理-LMLPHP

通过看源码我们知道,ClassLoad是一个抽象类,它本身并没有实现findclass()方法,而是通过Android双亲委托机制交给它的子类去实现的,如果子类没有找到,那最终就会调用自己的findclass方法

抛出ClassNotFoundException异常,接下来我们去看它的子类是如何实现findclass方法的,通过源码我们知道ClassLoad有两个子类SecureClassLoader跟BaseDexClassLoader,

Android为TV端助力之热修复原理-LMLPHP

我们在BaseDexClassLoader里面找到的findclass类的实现方法

Android为TV端助力之热修复原理-LMLPHP

通过此方法我们看到它是调用了pathList.findClass方法去查找类,而pathList是属于DexPathList的对象,那么我们点进去看看此方法是如何查找的

Android为TV端助力之热修复原理-LMLPHP

我们看到它首先遍历的一个叫dexElements的数组,得到一个DexFile对象,接着往下看,它接着又调用的dex.loadClassBinaryName方法的,我们在点进去看看

Android为TV端助力之热修复原理-LMLPHP

Android为TV端助力之热修复原理-LMLPHP

发现它最终走到的native方法里面了,那么我们就不深究的,回来上一步来看看dexElements是个什么东西??? dexFile是什么东西? 为什么要遍历它???

通过DexPahtList的构造方法,我们可以知道dexElements是在这里赋值的,如果

Android为TV端助力之热修复原理-LMLPHP

那么我们一如既往的点进去看看是如何实现的

Android为TV端助力之热修复原理-LMLPHP

Android为TV端助力之热修复原理-LMLPHP

Android为TV端助力之热修复原理-LMLPHP

看到这里我们明白的前面的dexFile是什么的,他是由loadDexFile构造出来的DexFile文件,纳尼???我们接着看loadDexFile

Android为TV端助力之热修复原理-LMLPHP

这里的optimizedDirectory:dex文件的输出目录(因为在加载jar/apk/zip等压缩格式的程序文件时会解压出其中的dex文件,该目录就是专门用于存放这些被解压出来的dex文件的)。

在构造方法的时候就已经传过来的,所以我们接着看optomizedPathFor方法

Android为TV端助力之热修复原理-LMLPHP

这个file就是在这里创建的

Android为TV端助力之热修复原理-LMLPHP

Android为TV端助力之热修复原理-LMLPHP

optimizedPathFor 方法执行完了,就是返回的一个FIle路径,里面放的是你补丁包,然后再把路径传给

Android为TV端助力之热修复原理-LMLPHP

返回一个dexFile文件,loadDex最终执行的是naitve方法,直白点说就是把我们的补丁包dex文件加载成dexFile对象,然后放到我们最开始的数组里面

Android为TV端助力之热修复原理-LMLPHP

Android为TV端助力之热修复原理-LMLPHP

最后回到我们最开始的地方,遍历这个数组,找到我们的class文件,返回结果,好了原理就讲到这里的,后续还需要自己多多操作,越用越熟练!

05-28 14:19