Android 逆向整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | 类加载器构造函数分析 | DexPathList 引入 )
Posted 韩曙亮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 逆向整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | 类加载器构造函数分析 | DexPathList 引入 )相关的知识,希望对你有一定的参考价值。
一、DexClassLoader 类加载器构造函数分析
DexClassLoader 是加载 dex 文件的核心类 , 但是该类除了定义了一个构造函数之外 , 并没有实现其它业务逻辑操作 ;
DexClassLoader
是 BaseDexClassLoader
的子类 , 因此类加载的核心操作流程 , 都定义在 BaseDexClassLoader.java 代码中 ;
DexClassLoader
的构造函数 , 调用了 BaseDexClassLoader
的构造函数 ;
public class DexClassLoader extends BaseDexClassLoader
public DexClassLoader(String dexPath, String optimizedDirectory,
String libraryPath, ClassLoader parent)
super(dexPath, new File(optimizedDirectory), libraryPath, parent);
源码路径 : /libcore/dalvik/src/main/java/dalvik/system/DexClassLoader.java
BaseDexClassLoader
的构造函数 , 调用了 ClassLoader
的构造函数 ;
public class BaseDexClassLoader extends ClassLoader
public BaseDexClassLoader(String dexPath, File optimizedDirectory,
String libraryPath, ClassLoader parent)
super(parent);
this.pathList = new DexPathList(this, dexPath, libraryPath, optimizedDirectory);
源码路径 : /libcore/dalvik/src/main/java/dalvik/system/BaseDexClassLoader.java
查询 ClassLoader
源码时 , 在源码路径中检索出两个 ClassLoader
, 分别是
- Dalvik 下的 ClassLoader : /libcore/libdvm/src/main/java/java/lang/ClassLoader.java
- ART 下的 ClassLoader : /libcore/libart/src/main/java/java/lang/ClassLoader.java
本篇博客分析的是 Dalvik 下的 ClassLoader 类加载器 , 因此分析的是 /libcore/libdvm/src/main/java/java/lang/ClassLoader.java 源码 ;
在 BaseDexClassLoader 中调用的 ClassLoader 构造函数如下 , 该构造函数中实现的内容很简单 , 只设置了该类加载器的父节点 ;
public abstract class ClassLoader
/**
* 使用指定的类装入器作为其父类构造此类的新实例。
*
* @param parentLoader
* 要用作新类装入器父级的@code ClassLoader。
*/
protected ClassLoader(ClassLoader parentLoader)
this(parentLoader, false);
源码路径 : /libcore/libdvm/src/main/java/java/lang/ClassLoader.java
二、DexPathList 引入
BaseDexClassLoader
的构造函数 , 调用了 ClassLoader
的构造函数 之后 , 有调用了 DexPathList
的构造函数 , 创建 DexPathList 实例对象 , 赋值给了 BaseDexClassLoader
的唯一成员 private final DexPathList pathList
;
public class BaseDexClassLoader extends ClassLoader
private final DexPathList pathList;
public BaseDexClassLoader(String dexPath, File optimizedDirectory,
String libraryPath, ClassLoader parent)
super(parent);
this.pathList = new DexPathList(this, dexPath, libraryPath, optimizedDirectory);
源码路径 : /libcore/dalvik/src/main/java/dalvik/system/BaseDexClassLoader.java
以上是关于Android 逆向整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | 类加载器构造函数分析 | DexPathList 引入 )的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向整体加固脱壳 ( DEX 优化流程分析 | DexPrepare.cpp 中 dvmContinueOptimizati() 函数分析 )
Android 逆向整体加固脱壳 ( DEX 优化流程分析 | dvmDexFileOpenPartial | dexFileParse | 脱壳点 | 获取 dex 文件在内存中的首地址 )(代码片
Android 逆向整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | DexPathList 构造函数分析 | makeDexElements 函数分析 )
Android 逆向整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | DexFile loadDexFile 函数 | 构造函数 | openDexFile 函数 )(代码片
Android 逆向整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | DexPathList 中根据 File 加载 DexFile | loadDexFile 分析 )(代
Android 逆向整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | RawDexFile.cpp 分析 | dvmRawDexFileOpen函数读取 DEX 文件 )(代