Android 类加载器
对于 Android 而言,最终的 apk 文件包含的是 dex 类型的文件。dex 文件是将 class 文件重新打包,打包的规则又不是简单地压缩,而是完全对 class 文件内部的各种函数表,变量表进行优化,产生一个新的文件,即 dex 文件。而加载这种特殊的 class 文件就需要特殊的类加载器 DexClassLoader。
源码位于 AOSP/libcore/dalvik/src/main/java/dalvik/system
目录下。
BaseDexClassLoader
1 | /** |
- 在构造函数中初始化
DexPathList
; - 通过 DexPathList 查找 Class 和 资源;
DexPathList
1 | /** |
DexPathList 通过 makeDexElements()
方法返回 Element[]
数组,Element 中保存有 DexFile
的对象。
DexFile
1 | /** |
- 在构造方法中处理 Dex 文件;
- 通过
native 方法
打开 Dex 文件和定义 Class。
JNI 实现文件为 AOSP/art/runtime/native/
文件夹下。
1 | // dalvik_system_DexFile.cc |
关键是 OpenDexFilesFromOat() 方法,转到 oat_file_manager.cc 文件。
1 | // oat_file_manager.cc |
主要是将 dex 文件转 oat。如果转 oat 失败,那就打开 dex 的方式来加载。
DexClassLoader
能够加载未安装的 jar、apk 或 dex。
1 | /** |
DexClassLoader 继承 BaseDexClassLoader,只有一个构造函数,optimizedDirectory 传 null。
PathClassLoader
只能从本地文件系统加载,不能从网络加载类。
1 | /** |
参考
[1] DexClassLoader - developer
[2] PathClassLoader - developer
[3] Android 类加载器 ClassLoader - Gityuan 博客
[4] Android 11 在线源码