Skip to content

📊 EncodedValueAdaptor

将 DEX 中所有类型的编码常量值(注解值、字段初始值、数组元素)路由到对应渲染器的分发中心。

属性
完整类名org.jf.baksmali.Adaptors.EncodedValue.EncodedValueAdaptor
源码链接Adaptors/EncodedValue/EncodedValueAdaptor.java
类型抽象类(仅含静态方法,不可实例化)

🎯 职责

DEX 格式的 encoded_value 可以是 14 种类型(boolean、byte、char、short、int、long、float、double、string、type、field、method、enum、array、annotation、null)。EncodedValueAdaptor.writeTo() 是这 14 种类型的统一分发入口。


🧠 关键实现

writeTo 完整实现

java
public static void writeTo(IndentingWriter writer, EncodedValue encodedValue) throws IOException {
    switch (encodedValue.getValueType()) {
        case ValueType.ANNOTATION:
            AnnotationEncodedValueAdaptor.writeTo(writer, (AnnotationEncodedValue)encodedValue);
            return;
        case ValueType.ARRAY:
            ArrayEncodedValueAdaptor.writeTo(writer, (ArrayEncodedValue)encodedValue);
            return;
        case ValueType.BOOLEAN:
            BooleanRenderer.writeTo(writer, ((BooleanEncodedValue)encodedValue).getValue());
            return;
        case ValueType.BYTE:
            ByteRenderer.writeTo(writer, ((ByteEncodedValue)encodedValue).getValue());
            return;
        case ValueType.CHAR:
            CharRenderer.writeTo(writer, ((CharEncodedValue)encodedValue).getValue());
            return;
        case ValueType.DOUBLE:
            DoubleRenderer.writeTo(writer, ((DoubleEncodedValue)encodedValue).getValue());
            return;
        case ValueType.ENUM:
            writer.write(".enum ");
            ReferenceUtil.writeFieldDescriptor(writer, ((EnumEncodedValue)encodedValue).getValue());
            return;
        case ValueType.FIELD:
            ReferenceUtil.writeFieldDescriptor(writer, ((FieldEncodedValue)encodedValue).getValue());
            return;
        case ValueType.FLOAT:
            FloatRenderer.writeTo(writer, ((FloatEncodedValue)encodedValue).getValue());
            return;
        case ValueType.INT:
            IntegerRenderer.writeTo(writer, ((IntEncodedValue)encodedValue).getValue());
            return;
        case ValueType.LONG:
            LongRenderer.writeTo(writer, ((LongEncodedValue)encodedValue).getValue());
            return;
        case ValueType.METHOD:
            ReferenceUtil.writeMethodDescriptor(writer, ((MethodEncodedValue)encodedValue).getValue());
            return;
        case ValueType.NULL:
            writer.write("null");
            return;
        case ValueType.SHORT:
            ShortRenderer.writeTo(writer, ((ShortEncodedValue)encodedValue).getValue());
            return;
        case ValueType.STRING:
            ReferenceFormatter.writeStringReference(writer, ((StringEncodedValue)encodedValue).getValue());
            return;
        case ValueType.TYPE:
            writer.write(((TypeEncodedValue)encodedValue).getValue());
    }
}

🔗 关系


📌 小结

EncodedValueAdaptor 是 DEX 常量系统与 smali 文本之间的桥梁。它的价值在于统一接口——无论调用方是处理注解元素(AnnotationFormatter)还是字段初始值(FieldDefinition),都通过同一个 writeTo() 入口,由内部 switch 路由到对应的 Renderer。

Renderers/ 包中的 8 个渲染器(LongRendererIntegerRendererFloatRendererDoubleRendererBooleanRendererByteRendererCharRendererShortRenderer)负责将 Java 基本类型格式化为 smali 字面量语法(如 -0x1L0x1.8p0f)。

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