关于ClassLoader涉及到问题:
- Android中有哪几种ClassLoader?它们的作用和区别是什么?
- 简述ClassLoader的双亲委托模型
- 简述双亲委托模型在热修复领域的应用
Android中的ClassLoader
1. BootClassLoader
2. URLClassLoader
3. BaseDexClassLoader
4. PathClassLoader
5. DexClassLoader
其中BootCLassLoader、URLClassLoader、BaseDexClassLoader是继承ClassLoader;PathClassLoader、DexClassLoader则是继承BaseDexClassLoader
BootClassLoader
Android中类默认无父构造器的时候 会默认使用PathClassLoader作为父构造器,而PathClassLoader的父构造器就是BaseDexClassLoader。
BootClassLoader是ClassLoader中的内部类,是包内可见的,没法使用,不能做动态加载
URLClassLoader
用来加载jar文件,由于dalvik虚拟机不能加载,所以Android中无法使用这个类加载器
BaseDexClassLoader
加载各种Dex中的类,其构造方法有四个参数 (String dexPath, File optimizedDirectory, String librarySearchPath, ClassLoader parent)
public BaseDexClassLoader(String dexPath, File optimizedDirectory, String librarySearchPath, ClassLoader parent) {
throw new RuntimeException("Stub!");
}
- String dexPath:类所在的DEX、jar、apk的路径
- File optimizedDirectory:由于dex文件在jar或者apk文件中,因此需要从apk或者jar文件中解压出dex文件,这个参数就是制定解压dex文件后存放的位置
- String librarySearchPath:目标类使用的C/C++库所在的路径
- ClassLoader parent:该构造器的父构造器,一般为执行类的构造器
PathClassLoader
是BaseDexClassLoader的子类,参数optimizedDirectory默认为空,其实默认路径是/data/dalvik-cache目录
DexClassLoader
是BaseDexClassLoader的子类,支持加载包含classes.dex的jar、apk文件,可以是SD卡上的路径
一般来说dalvik不能直接识别jar文件,但是DexClassesLoader却支持jar文件,其实是BaseDexClassLoader对”.jar”,”.zip”,”.apk”,”.dex”后缀文件最后都会生成一个对应的dex文件;而URLClassLoader不是类似的操作,一般用DexClassLoader来作为动态加载的加载器
简述ClassLoader的双亲委托模型
当一个类加载器收到类加载的请求时,刚开始自身是不处理的,而是交给父类加载器,每个层次都是这样,直到传递到最父类加载器BootClassLoader,父加载器不能完成才会传给子类加载器。
简述双亲委托模型在热修复领域的应用
当应用中有几个类有bug了,修复之后将这些包打包成补丁文件,这些类生成的dex文件会封装成Element对象并且插到dexElementsList的最前端去,这样当dexClassLoader加载类的时候,会优先找到修复的类,有bug的类会在后面,根据双亲委托模型并不会执行到,已达到一个热修复的作用。