Android 中的 ClassLoader 摘抄笔记

摘抄自:《Android 进阶解密》

Java 中类加载器加载的是 jar 文件和 Class 文件(本质都是加载 Class 文件),但在 Android 中不适用,因为无论是 DVM 还是 ART,它们加载的都是 dex 文件。

Android 中的 ClassLoader 分为两种类型,分别是系统类加载器和自定义加载器。

系统类加载器
1、BootClassLoader

Android 系统启动时会使用 BootClassLoader 来预加载常用类。其是由 Java 代码实现的。

class BootClassLoader extends ClassLoader {

    private static BootClassLoader instance;

    @FindBugsSuppressWarnings("DP_CREATE_CLASSLOADER_INSIDE_DO_PRIVILEGED")
    public static synchronized BootClassLoader getInstance() {
        if (instance == null) {
            instance = new BootClassLoader();
        }

        return instance;
    }
    ...
}    

继承自 ClassLoader,并且是使用单例模式。其访问修饰符是默认的,只有在同一个包中才可以访问,在应用程序中无法直接调用。

2、DexClassLoader

用来加载 dex 文件以及包含 dex 的压缩文件(apk 和 jar 文件),但是最终都是加载 dex 文件。

public class DexClassLoader extends BaseDexClassLoader {
    /**
     *
     * @param dexPath dex 相关文件录路径集合,多个路径用文件分隔符分隔,
     * 	默认文件分隔符为 ":"
     *                
     * @param optimizedDirectory 解压的 dex 文件存储路径,必须是一个内部存储路径,
     * 	一般情况下使用当前应用程序的私有路径 /data/data/<Package Name>/...
     *                           
     * @param librarySearchPath 包含 C/C++ 库的路径几个,多个路径用文件分隔符分隔,
     * 	可以为 null
     *                          
     * @param parent 父加载器
     */   
    public DexClassLoader(String dexPath, String optimizedDirectory,
            String librarySearchPath, ClassLoader parent) {
        super(dexPath, new File(optimizedDirectory), librarySearchPath, parent);
    }
}

继承自 BaseDexClassLoader,方法都在其父类中实现。

3、PathClassLoader
public class PathClassLoader extends BaseDexClassLoader {
    /**
     *
     * @param dexPath dex 相关文件录路径集合,多个路径用文件分隔符分隔,
     * 	默认文件分隔符为 ":"
     *                           
     * @param librarySearchPath 包含 C/C++ 库的路径几个,多个路径用文件分隔符分隔,
     * 	可以为 null
     *                          
     * @param parent 父加载器
     */   
    public PathClassLoader(String dexPath, String librarySearchPath, ClassLoader parent) {
        super(dexPath, null, librarySearchPath, parent);
    }
}

同样继承自 BaseDexClassLoader,方法也都在其父类中实现。

PathClassLoader 默认设置了设置了参数 optimizedDirectory 的值为 /data/dalvik-cache,其无法定义解压的 dex 文件存储路径,因此 PathClassLoader 通常用来加载已经安装的 apk 的 dex 文件(安装的 apk 的 dex 文件会存储在 /data/dalvik-cache 中)。

ClassLoader 继承关系

下图是 Android 8.0 中 ClassLoader 的继承关系
在这里插入图片描述

  • ClassLoader 是一个抽象类,其中定义了 ClassLoader 的主要功能。BootClassLoader 是它的内部类。
  • SecureClassLoader 类和 JDK8 中的 SecureClassLoader 类的代码是一样的,它继承了抽象类ClassLoader。SecureClassLoader 并不是 ClassLoader 的实现类,而是拓展了 ClassLoader 类加入了权限方面的功能,加强了 ClassLoader 的安全性。
  • URLClassLoader 类和 JDK8 中的 URLClassLoader 类的代码是一样的,它继承自 SecureClassLoader,用来通过 URl 路径从jar文件和文件夹中加载类和资源。
  • InMemoryDexClassLoader 是 Android8.0 新增的类加载器,继承自 BaseDexClassLoader,用于加载内存中的 dex 文件。
  • BaseDexClassLoader 继承自 ClassLoader,是抽象类 ClassLoader 的具体实现类,PathClassLoader 和 DexClassLoader、InMemoryDexClassLoader 都继承自它。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值