ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Android 中的 ClassLoader 摘抄笔记

2019-05-16 18:52:25  阅读:221  来源: 互联网

标签:dex 文件 ClassLoader 路径 摘抄 param Android 加载


摘抄自:《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 都继承自它。

标签:dex,文件,ClassLoader,路径,摘抄,param,Android,加载
来源: https://blog.csdn.net/OneDeveloper/article/details/90257213

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有