Android中ClassLoader种类,作用和区别
1、BootClassLoader,单纯的ClassLoader类,虚拟机内置的类加载器,作为所有加载器的root parent。
2、PathDexClassLoader,ClassLoader子类,访问本地文件系统里的文件列表,用作加载Android系统以及已经安装过的apk文件列表里的类,无法从网络中加载类。
3、DexClassLoader,也是ClassLoader子类,能加载未安装的jar/apk/dex文件里的类,可以用作热更新动态加载补丁dex
4、InMemoryDexClassLoader,API 26添加,可以从包含dex文件的缓冲区加载类,可以执行那些还没被加载到本地文件系统里的代码。
ClassLoader的双亲委托
1、ClassLoader通过双亲委托机制来加载类,加载某个类时,这个类的ClassLoader(源ClassLoader)先判断有没有加载过该类,如果已经加载过,直接返回Class;如果没有,则委托ClassLoader的父ClassLoader来加载。如果还是没有,则一直往上到最上层父祖类BootClassLoader,如果BootClassLoader也没有加载过,那么就开始在其对应类的路径下寻找class字节码文件并载入,载入成功后返回Class;如果载入失败,则开始委托给子类加载器去载入文件中的class字节码,不成功则依次委托给子类的子类加载器...直到源ClassLoader,源ClassLoader如果也载入失败了,就结束加载,抛出异常。
一句话总结:
由子类往父类的findClass流程,以及由父类往子类方向的loadClass流程,一旦成功,流程便会终止并返回Class,失败则会尝试到底。
双亲委托在热修复领域的应用
系统在加载类前,会将所有的dex文件都整理成一个Element数组dexElement,热修复将补丁dex放在dexElement数组最前面,这样会优先加载补丁中dex里面的类,依从双亲委托机制,已经加载过后,不会重复加载,这样就达到了修复作用。
网友评论