1、Android中有哪几种ClassLoader?它们的作用和区别是什么?
-
BootClassLoader
系统启动时创建的,是 PathClassLoader 的父加载器,PathClassLoader 继承自 BaseDexClassLoader,但是底层返回父类加载器返回的是 BootClassLoader。这个类与 ClassLoader 同级存在于一个文件中。
-
PathClassLoader
应用启动时创建的,从 data/app/… 安装目录下加载 apk 文件。App 安装到手机之后,apk 里面的 class.dex 中的 class 都是通过 PathClassLoader 来加载的
-
BaseDexClassLoader
ClassLoader 是个抽象类,具体实现的子类有 BaseDexClassLoader 和 SecureClassLoader。SecureClassLoader 的子类是 URLClassLoader ,其只能用来加载 jar 文件,这在 Android 的 Dalvik/ART 上没法使用的。
Android 的 Dalvik/ART 不像 JVM 可以直接加载 class 文件,和 jar 文件中的 class,需要转化为 Dalvik byte code 才可以。只能通过 dex 或者 包含 dex 的 jar、apk 文件来加载,所有 Android 里面的 ClassLoader 都是由 BaseDexClassLoader 来处理。基本所有 classlaoder 都是继承了 BaseDexClassLoader。
2、简述ClassLoader的双亲委托模型
创建 Class 时首先去找对应的 ClassLoader 有没有被加载过,没加载过就询问父类,父类加载器再判断是否加载过,然后依次往父类询问。一直到最顶级的父加载器还找不到的话,自身就创建一个,这样保证一个类只会创建唯一的一个类加载器。
3、简述双亲委托模型在热修复领域的应用
Android 中查找类会在一个 dex 数组中遍历,一旦找到就不会往后找,热修复只要把修复后的类排在有 bug 的类之前,由于双亲委托机制,先加载到修复好的类,就不会加载到后面的 bug 类。