Android 插件化能从外部下载apk并加载主要依赖于ClassLoader。
ClassLoder是一个抽象类,其中最重要的是BaseDexClassLoader及其子类PathClassLoader和DexClassLoader.
public DexClassLoader(String dexPath, String optimizedDirectory,
String libraryPath, ClassLoader parent) {
super(dexPath, new File(optimizedDirectory), libraryPath, parent);
}
public PathClassLoader(String dexPath, String librarySearchPath, ClassLoader parent) {
super(dexPath, null, librarySearchPath, parent);
}
构造函数一共涉及到四个parent参数
- dexPath :需要加载的dex的路径
- optimizedDirectory:缓存加载的dex文件
- libraryPath: 加载的.so文件路径
- parent:父类加载器. ClassLoader会优先去从父类加载器去查找类,如果已加载,则直接使用,不过没加载 ,再自己加载,提高了性能。
PathClassLoader和DexClassLoader很相似,区别在于构造函数DexClassLoader 多了一个optimizedDirectory参数,而PathClassLoader会直接传递null给父类。
optimizedDirectory是用来缓存加载的dex文件的,如果为null会直接使用dex原有的路径作为缓存目录。所以DexClassLoader可以缓存指定的路径的dex,而PathClassLoader通常是用来加载Android系统类和应用的类。
大部分逻辑都在他们的父类BaseDexClassLoader里,BaseDexClassLoader里维护了一个DexPathList,顾名思义是Dex的一个集合类,里面维护了一个Element的数组,Element是表示dex或者包含dex的目录。
public class BaseDexClassLoader extends