You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android项目中Moshi注解类代码混淆失效问题咨询

问题:Moshi配合代码混淆时类名与结构未被混淆的原因

为Android项目启用代码混淆,使用Moshi处理JSON操作,但Release APK中带@JsonClass(generateAdapter = true)注解的类反编译后可读性仍很高,类名和变量名清晰可见,Moshi生成的适配器类也暴露了可读内容。此前用Gson时无此问题,且未在proguard-rules.pro中添加任何和Moshi或该类相关的保留规则,询问是否遗漏配置。

Gradle配置

buildTypes {
    release {
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
}

原始类

import com.decompiletest.enum.EyeColor
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass

@JsonClass(generateAdapter = true)
data class MPerson(
    @Json(name = "name") val name: String,
    @Json(name = "lucy_number") val luckyNumber: Int,
    @Json(name = "eye_color") val eyeColor: EyeColor,
)

混淆后类

import p002a1.C1300j;
import p002a1.C1303m;
import p026f1.C0403d;
import p099y0.C1202a;

@C1303m(generateAdapter = true)
/* renamed from: com.decompiletest.moshis.MPerson */
public final class MPerson {

    /* renamed from: a */
    public final String f759a;

    /* renamed from: b */
    public final int f760b;

    /* renamed from: c */
    public final C1202a f3861c;

    public MPerson(@C1300j(name = "name") String str, @C1300j(name = "lucy_number") int i, @C1300j(name = "eye_color") C1202a aVar) {
        C0403d.m3330r(str, "name");
        C0403d.m3330r(aVar, "eyeColor");
        this.f759a = str;
        this.f760b = i;
        this.f3861c = aVar;
    }

    public final MPerson copy(@C1300j(name = "name") String str, @C1300j(name = "lucy_number") int i, @C1300j(name = "eye_color") C1202a aVar) {
        C0403d.m3330r(str, "name");
        C0403d.m3330r(aVar, "eyeColor");
        return new MPerson(str, i, aVar);
    }

    public final boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (!(obj instanceof MPerson)) {
            return false;
        }
        MPerson mPerson = (MPerson) obj;
        return C0403d.m3322d(this.f759a, mPerson.f759a) && this.f760b == mPerson.f760b && this.f3861c == mPerson.f3861c;
    }

    public final int hashCode() {
        int hashCode = Integer.hashCode(this.f760b);
        return this.f3861c.hashCode() + ((hashCode + (this.f759a.hashCode() * 31)) * 31);
    }

    public final String toString() {
        return "MPerson(name=" + this.f759a + ", luckyNumber=" + this.f760b + ", eyeColor=" + this.f3861c + ")";
    }
}
解答

这是Moshi的预期行为,并非遗漏配置。Moshi的代码生成器会动态生成ProGuard规则,有条件地保留带@JsonClass(generateAdapter = true)注解的类的类名和主构造函数,确保运行时能正常反射实例化这些类。

内容的提问来源于stack exchange,提问作者Omer KAPLANDROID

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 06:55:54