Skip to content

📜 DexReader

BaseDexReader<DexBackedDexFile> 的具名子类,dexbacked 层中所有解析操作的标准读取器

属性
包名org.jf.dexlib2.dexbacked
类型class extends BaseDexReader<DexBackedDexFile>
源码DexReader.java

🎯 职责

DexReader 本身只有 4 行实现代码,是 Java 泛型系统的"具名锚点":

java
public class DexReader extends BaseDexReader<DexBackedDexFile> {
    public DexReader(@Nonnull DexBackedDexFile dexFile, int offset) {
        super(dexFile, offset);
    }
}

它将泛型参数 T 固定为 DexBackedDexFile,使上层代码(DexBackedClassDefDexBackedMethod 等)可以直接声明 DexReader 类型,避免到处写 BaseDexReader<DexBackedDexFile>

🧠 关键实现

创建方式

java
// 通过 DexBackedDexFile 的工厂方法创建
@Override
public DexReader readerAt(int offset) {
    return new DexReader(this, offset);
}

在 DexBackedClassDef 中的典型使用

java
// 从 class_data_item 起始处创建读取器,流式读取 4 个 ULEB128 计数
DexReader reader = dexFile.readerAt(classDataOffset);
staticFieldCount   = reader.readSmallUleb128();
instanceFieldCount = reader.readSmallUleb128();
directMethodCount  = reader.readSmallUleb128();
virtualMethodCount = reader.readSmallUleb128();
staticFieldsOffset = reader.getOffset(); // 记录字段数据起始位置

读取器游标每次调用 readSmallUleb128() 后自动前进,无需手动管理偏移。

与 BaseDexReader 的关系

DexReader 的所有实际能力来自 BaseDexReader:ULEB128/SLEB128 解析、字符串读取、各种整数格式读取等。DexReader 只是固定了泛型类型,本身不添加任何新方法。

🔗 关系

📌 小结

DexReader 是 dexbacked 层"命名即文档"的体现。虽然只有 4 行代码,但它使整个 dexbacked 子包的代码更加清晰——每个持有 DexReader 字段的类,都明确表达了"我在解析一个 DEX 文件"的语义。

基于 MIT 协议发布 · 本文档仅用于安全研究与教学目的