Skip to content

🔑 BaseMethodReference

MethodReference 接口的抽象骨架实现,提供基于四元组(definingClass + name + returnType + parameterTypes)的标准比较逻辑。

属性
包名org.jf.dexlib2.base.reference
类型abstract class implements MethodReference
源码BaseMethodReference.java
子类DexBackedMethodImmutableMethodImmutableMethodReference

🎯 职责

为所有方法引用实现类提供:

  • hashCodedefiningClass + name + returnType + parameterTypes 四元组哈希
  • equals:四元组全等比较(参数列表用 CharSequenceUtils.listEquals 支持泛型比较)
  • compareTo:按顺序比较四个字段,字典序

🧠 关键实现

java
public abstract class BaseMethodReference implements MethodReference {

    @Override
    public int hashCode() {
        int hashCode = getDefiningClass().hashCode();
        hashCode = hashCode * 31 + getName().hashCode();
        hashCode = hashCode * 31 + getReturnType().hashCode();
        return hashCode * 31 + getParameterTypes().hashCode();
    }

    @Override
    public boolean equals(@Nullable Object o) {
        if (o != null && o instanceof MethodReference) {
            MethodReference other = (MethodReference) o;
            return getDefiningClass().equals(other.getDefiningClass())
                && getName().equals(other.getName())
                && getReturnType().equals(other.getReturnType())
                && CharSequenceUtils.listEquals(getParameterTypes(), other.getParameterTypes());
        }
        return false;
    }

    @Override
    public int compareTo(@Nonnull MethodReference o) {
        int res = getDefiningClass().compareTo(o.getDefiningClass());
        if (res != 0) return res;
        res = getName().compareTo(o.getName());
        if (res != 0) return res;
        res = getReturnType().compareTo(o.getReturnType());
        if (res != 0) return res;
        return CollectionUtils.compareAsIterable(
            Ordering.usingToString(), getParameterTypes(), o.getParameterTypes());
    }
}

CharSequenceUtils.listEquals 的作用

参数类型列表的元素类型是 CharSequence 而非 String,这允许不同实现类使用不同的字符串表示(StringStringBuilder 等)。CharSequenceUtils.listEquals 进行内容比较而非引用比较,确保跨实现的方法引用能正确判等。

在 ZjDroid 脱壳中的作用:

DexBackedMethod 继承 BaseMethodReference,当 DexBackedClassDef 遍历方法时,使用 ImmutableMethodReference.of(item) 创建快照,通过 currentMethod.equals(nextMethod) 检测重复方法(skipDuplicates 逻辑),确保脱壳输出的 smali 不包含重复方法定义。

🔗 关系

📌 小结

BaseMethodReference 统一了方法引用的比较语义,使 DexBackedMethodImmutableMethodReference 等不同实现可以互相 equals 比较,这是 dexlib2 集合操作(去重、查找)正确性的基础保障。

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