【Android 逆向】类加载器 ClassLoader ( 类加载器源码简介 | BaseDexClassLoader | DexClassLoader | PathClassLoader )

简介: 【Android 逆向】类加载器 ClassLoader ( 类加载器源码简介 | BaseDexClassLoader | DexClassLoader | PathClassLoader )

文章目录

一、ClassLoader 源码简介

二、BaseDexClassLoader 源码简介

三、DexClassLoader 源码简介

四、PathClassLoader 源码简介

五、InMemoryDexClassLoader 源码简介





一、ClassLoader 源码简介


ClassLoader 抽象类中的 private final ClassLoader parent 成员 , 用于实现双亲委派机制 , 所有的 ClassLoader 子类 , 如 PathClassLoader , DexClassLoader 等类加载器 , 都会存在一个 ClassLoader parent 成员 , 用于表示该 类加载器 的父节点 是哪个 类加载器 ;


BootClassLoader 的 ClassLoader parent 成员是空的 , 是最顶层的类加载器 ;


注意该 ClassLoader parent 成员是 final 修饰的 , 只能进行一次赋值 ;



ClassLoader 源码参考 :


public abstract class ClassLoader {
      // 委托的父类加载器
      // 注意:VM硬编码此字段的偏移量,因此所有新字段
      // 必须在*之后添加*。
      private final ClassLoader parent;
 }


源码路径 : /libcore/ojluni/src/main/java/java/lang/ClassLoader.java






二、BaseDexClassLoader 源码简介


BaseDexClassLoader 中实现了类加载的核心业务逻辑 , 这个类很大 , 很复杂 ;



BaseDexClassLoader 源码 :


/**
   * 用于各种基于dex的数据库之间的通用功能的基类
   * {@link ClassLoader} 实现.
   */
  public class BaseDexClassLoader extends ClassLoader {
  }


源码路径 : /libcore/dalvik/src/main/java/dalvik/system/BaseDexClassLoader.java






三、DexClassLoader 源码简介


DexClassLoader 继承了 BaseDexClassLoader 类 , 类中没有实现任何业务逻辑 , 只是提供了一个构造函数 ;



DexClassLoader 源码 :


/**
 * 从{@code.jar}和{@code.apk}文件加载类的类加载器
 * 包含{@code classes.dex}项。这可用于执行未作为应用程序一部分安装的代码。
 *
 * <p>这个类加载器需要一个应用程序私有的可写目录来缓存优化的类。
 * 使用{@code Context.getCodeCacheDir()}创建
 * 这样一个目录:<pre>{@code
 * File dexOutputDir = context.getCodeCacheDir();
 * }</pre>
 *
 * <p><strong>不要在外部存储上缓存优化的类。</strong>
 * 外部存储不提供保护您的计算机所需的访问控制
 * 防止代码注入攻击的应用程序。
 */
public class DexClassLoader extends BaseDexClassLoader {
    /**
     * 创建一个{@code-DexClassLoader}来查找解释的和本机的
     * 密码解释类可以在包含的一组DEX文件中找到
     * 在Jar或APK文件中。
     *
     * <p>使用指定的字符分隔路径列表
     * {@code path.separator}系统属性,默认为{@code:}。
     *
     * @param dexPath 包含类和
     * 资源,由{@code File.pathSeparator}分隔,其中
     * Android上的默认值为{@code”:“}
     * @param optimizedDirectory 目录,其中包含优化的dex文件
     * 应该是书面的;不能为{@code null}
     * @param librarySearchPath 包含本机
     * 库,由{@code File.pathSeparator}分隔;可能是
     * {@code null}
     * @param parent 父类加载器
     */
    public DexClassLoader(String dexPath, String optimizedDirectory,
                          String librarySearchPath, ClassLoader parent) {
        super(dexPath, new File(optimizedDirectory), librarySearchPath, parent);
    }
}


源码路径 : /libcore/dalvik/src/main/java/dalvik/system/DexClassLoader.java






四、PathClassLoader 源码简介


PathClassLoader 继承了 BaseDexClassLoader 类 , 类中没有实现任何业务逻辑 , 只是提供了一个构造函数 ;



PathClassLoader 源码 :


/**
 * 提供对列表进行操作的简单{@link ClassLoader}实现
 * 本地文件系统中的文件和目录,但不尝试
 * 从网络加载类。Android将该类用作其系统类
 * 加载器及其应用程序类加载器。
 */
public class PathClassLoader extends BaseDexClassLoader {
    /**
     * 创建一个{@code PathClassLoader},它在给定的文件列表上运行
     * 和目录。此方法相当于调用
     * {@link#PathClassLoader(String,String,ClassLoader)}与
     * 第二个参数的{@code null}值(请参见此处的说明)。
     * 
     * @param dexPath 包含类和
     * 资源,由{@code File.pathSeparator}分隔,其中
     * Android上的默认值为{@code”:“}
     * @param parent 父类加载器
     */
    public PathClassLoader(String dexPath, ClassLoader parent) {
        super(dexPath, null, null, parent);
    }
    /**
     * 创建一个{@code PathClassLoader},它在两个给定的
     * 文件和目录的列表。第一个列表的条目
     * 应为以下内容之一:
     * 
     * <ul>
     * <li>JAR/ZIP/APK文件,可能包含“classes.dex”文件
     * 以及任意资源。
     * <li>原始“.dex”文件(不在zip文件中)。
     * </ul>
     * 
     * 第二个列表的条目应该是包含
     * 本机库文件。
     * 
     * @param dexPath 包含类和
     * 资源,由{@code File.pathSeparator}分隔,其中
     * Android上的默认值为{@code”:“}
     * @param librarySearchPath 包含本机
     * 库,由{@code File.pathSeparator}分隔;可能是
     * {@code null}
     * @param parent 父类加载器
     */
    public PathClassLoader(String dexPath, String librarySearchPath, ClassLoader parent) {
        super(dexPath, null, librarySearchPath, parent);
    }
}


源码路径 : /libcore/dalvik/src/main/java/dalvik/system/PathClassLoader.java






五、InMemoryDexClassLoader 源码简介


InMemoryDexClassLoader 类加载器 继承了 BaseDexClassLoader 类 , 与 PathClassLoader , DexClassLoader 类似 , 只提供了构造函数 , 没有实现业务逻辑 ;


InMemoryDexClassLoader 主要用于加载内存中的 Dex 字节码文件 , 在 Android 8.0 8.08.0 中加入到系统中 ;



InMemoryDexClassLoader 源码 :


/**
 * 一个{@link ClassLoader}实现,从
 * 包含DEX文件的缓冲区。这可用于执行以下代码:
 * 尚未写入本地文件系统。
 */
public final class InMemoryDexClassLoader extends BaseDexClassLoader {
    /**
     * 使用给定的DEX缓冲区创建内存中的DEX类装入器。
     * 
     * @param dexBuffers 包含之间的DEX文件的缓冲区数组
     * <tt>buffer.position()</tt>和<tt>buffer.limit()</tt>。
     * @param parent 委托的父类加载器。
     * @隐藏
     */
    public InMemoryDexClassLoader(ByteBuffer[] dexBuffers, ClassLoader parent) {
        super(dexBuffers, parent);
    }
    /**
     * 创建一个新的内存中DEX类装入器。
     * 
     * @param dexBuffer 缓冲区,包含之间的DEX文件内容
     * <tt>buffer.position()</tt>和<tt>buffer.limit()</tt>。
     * @param parent 委托的父类加载器。
     */
    public InMemoryDexClassLoader(ByteBuffer dexBuffer, ClassLoader parent) {
        this(new ByteBuffer[] { dexBuffer }, parent);
    }
}


源码路径 : /libcore/dalvik/src/main/java/dalvik/system/InMemoryDexClassLoader.java


目录
相关文章
|
3月前
|
Ubuntu 开发工具 Android开发
Repo下载AOSP源码:基于ubuntu22.04 环境配置,android-12.0.0_r32
本文介绍了在基于Ubuntu 22.04的环境下配置Python 3.9、安装repo工具、下载和同步AOSP源码包以及处理repo同步错误的详细步骤。
241 0
Repo下载AOSP源码:基于ubuntu22.04 环境配置,android-12.0.0_r32
|
3月前
|
开发工具 git 索引
repo sync 更新源码 android-12.0.0_r34, fatal: 不能重置索引文件至版本 ‘v2.27^0‘。
本文描述了在更新AOSP 12源码时遇到的repo同步错误,并提供了通过手动git pull更新repo工具来解决这一问题的方法。
130 1
|
3月前
|
Android开发 Docker 容器
docker中编译android aosp源码,出现Build sandboxing disabled due to nsjail error
在使用Docker编译Android AOSP源码时,如果遇到"Build sandboxing disabled due to nsjail error"的错误,可以通过在docker run命令中添加`--privileged`参数来解决权限不足的问题。
695 1
|
3月前
|
开发工具 uml git
AOSP源码下载方法,解决repo sync错误:android-13.0.0_r82
本文分享了下载AOSP源码的方法,包括如何使用repo工具和处理常见的repo sync错误,以及配置Python环境以确保顺利同步特定版本的AOSP代码。
466 0
AOSP源码下载方法,解决repo sync错误:android-13.0.0_r82
|
3月前
|
Java Android开发 芯片
使用Android Studio导入Android源码:基于全志H713 AOSP,方便解决编译、编码问题
本文介绍了如何将基于全志H713芯片的AOSP Android源码导入Android Studio以解决编译和编码问题,通过操作步骤的详细说明,展示了在Android Studio中利用代码提示和补全功能快速定位并修复编译错误的方法。
139 0
使用Android Studio导入Android源码:基于全志H713 AOSP,方便解决编译、编码问题
|
3月前
|
Android开发
我的Android 进阶修炼(1): AOSP源码根目录结构
本文介绍了AOSP源码的根目录结构,提供了基于MTK9269 Android 9.0源码的目录说明,帮助读者了解AOSP源码的组织方式和各目录的功能。
189 0
我的Android 进阶修炼(1): AOSP源码根目录结构
|
3月前
|
API 开发工具 Android开发
Android源码下载
Android源码下载
485 0
|
3月前
|
开发工具 Android开发 git
全志H713 Android 11 :给AOSP源码,新增一个Product
本文介绍了在全志H713 Android 11平台上新增名为myboard的产品的步骤,包括创建新的device目录、编辑配置文件、新增内核配置、记录差异列表以及编译kernel和Android系统的详细过程。
123 0
|
3月前
|
Ubuntu 开发工具 Android开发
Repo下载、编译AOSP源码:基于Ubuntu 21.04,android-12.1.0_r27
文章记录了作者在Ubuntu 21.04服务器上配置环境、下载并编译基于Android 12.1.0_r27版本的AOSP源码的过程,包括解决编译过程中遇到的问题和错误处理方法。
201 0
|
4月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的高校后勤网上报修系统安卓app附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的高校后勤网上报修系统安卓app附带文章源码部署视频讲解等
56 0