Android 类加载机制
1. 类加载的基本概念
类加载是将.class 字节码文件加载到内存,转换为 JVM(或 ART)可识别的 Class 对象的过程,遵循 "双亲委派模型":
- 当一个类加载器收到加载请求时,会先委托给父类加载器尝试加载
- 只有父类加载器无法加载时,才由当前类加载器自行加载
- 作用:避免类的重复加载,保证核心类的安全性(如 java.lang.String 不会被篡改)
2. Android 中的类加载器体系
Android 基于 Java 类加载机制,但有特殊实现(尤其 ART 虚拟机时代):
- BootClassLoader:最顶层,加载 Android Framework 核心类(如 android.jar 中的类)
- PathClassLoader:加载已安装 APK 中的类(dex 文件),是应用默认的类加载器
- DexClassLoader:可加载外部的 dex/jar/apk 文件,常用于动态加载(如插件化、热修复)
- BaseDexClassLoader:PathClassLoader 和 DexClassLoader 的父类,核心逻辑是从 dex 文件中加载类
3. Android 类加载的特殊点
-
Dex 文件优化:Android 将.class 文件打包成 dex 文件(Dalvik Executable),减少冗余信息,提高加载效率。ART 会进一步将 dex 编译为机器码(OAT 文件)
-
类加载流程:
- 从 dex 文件中查找类的信息
- 验证字节码合法性(安全检查)
- 准备:为类变量分配内存并设置默认值
- 解析:将符号引用转换为直接引用
- 初始化:执行类构造器
<clinit>()
方法(初始化静态变量和静态代码块)
-
与 JVM 的区别:JVM 加载.class 文件,Android 加载 dex 文件;Android 类加载器更注重对移动端资源的优化(如内存占用、加载速度)
4. 实际应用场景
- 插件化:通过 DexClassLoader 加载插件 APK 中的类
- 热修复:替换有问题的 dex 文件,让类加载器优先加载修复后的类
- 动态功能模块:按需加载未安装的功能模块中的类