1.关于 Android ClassLoader
基本原理跟 Java ClassLoader 相同.
所以在理解了 Java ClassLoader 的情况下,看 Android 的 ClassLoader 就比较简单了
若有不了解 Java ClassLoader 建议先去看看 Java 虚拟机这篇文章
然后再看 Android ClassLoader
也是主要的几个 ClassLoader 来构成 Android 中类的加载机制
1.BootClassLoader
2.PathClassLoader:类似于 JVM 中的 AppClassLoader
3.DexClassLoader:类似于 JVM 中的CustomClassLoader
4.BaseDexClassLoader:是 PathClassLoader 和 DexClassLoder 的父类
2.Android ClassLoader 源码分析
给出在线查看源码的地址
先看看 DexClassLoader
类的注释意思就是说,它负责从 dex 文件中加载类,并且还可以加载没有安装到应用程序的类.
所以它是实现动态加载的核心ClassLoader
而关于构造器的参数
dexPath:dex 文件的路径
optimizedDirectory:是我们指定的 dex 文件要被拷贝到的地址(一般为内部地址)
再看看 PathClassLoader
可以看到 PathClassLoader 只有两个构造器,
我们主要看看第二个构造函数,相比较于 DexClassLoader 的构造函数少了一个参数 String optimizedDirectory 正是因为少了这个参数,所以 PathClassLoader 只能加载应用程序中已经安装的类.
BaseDexClassLoader
这是 DexClassLoader 和 PathClassLoader 的父类,所有的工作都是在这个类里面完成的
而这个类主要的方法就是findClass(String name).
而 findClass(String name) 的整个实现过程(调用链)如下图
可以知道最后是通过一个 native 方法实现了加载