Android 类的加载机制

23 阅读2分钟

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 文件,让类加载器优先加载修复后的类
  • 动态功能模块:按需加载未安装的功能模块中的类