java - Proguard 混淆导致 java.lang.IllegalArgumentException : class declares multiple JSON fields named "a"

标签 java json gson obfuscation proguard

启动我的应用程序时记录了两个错误,但仅在混淆之后。没有混淆就没有错误。

除非我被误导,否则错误如下:

class Property declares multiple JSON fields named a

类 PropertyDefinition 也是如此。

05/18 03:33:19.465  java.lang.IllegalArgumentException: class PropertyDefinition declares multiple JSON fields named a:  
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:122)
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72)
com.google.gson.Gson.getAdapter(Gson.java:349)
com.google.gson.Gson.toJson(Gson.java:574)
com.google.gson.Gson.toJson(Gson.java:561)
com.google.gson.Gson.toJson(Gson.java:516)
com.google.gson.Gson.toJson(Gson.java:496)
Property.a(SourceFile:210) <see comment in code below noting this code line>
Property.a(SourceFile:68)
bj.a(SourceFile:44)
aA.<init>(SourceFile:339)

05/18 03:33:19.479  java.lang.IllegalArgumentException: class Property declares multiple JSON fields named a:  
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:122)
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72)
com.google.gson.Gson.getAdapter(Gson.java:349)
com.google.gson.Gson.fromJson(Gson.java:790)
com.google.gson.Gson.fromJson(Gson.java:757)
com.google.gson.Gson.fromJson(Gson.java:706)
com.google.gson.Gson.fromJson(Gson.java:678)
Property.a(SourceFile:75) <see comment in code below noting this code line>
bj.a(SourceFile:44)
aA.<init>(SourceFile:339)

这是与其中一个几乎相同的错误相关的混淆图部分。我在这里和上面取消混淆了类名“Property”。我没有看到问题。我没有进一步的混淆经验,所以我不知道要寻找什么。

mypackage.Property:
    mypackage.PropertyDefinition rootElement -> a
    java.util.HashMap indexById -> a
    java.util.HashMap indexByKey -> b
    long nntgID -> a
    43:54:boolean equals(java.lang.Object) -> equals
    60:64:int hashCode() -> hashCode
    68:84:boolean check() -> a
    88:88:java.lang.String getFileName() -> a
    92:92:java.lang.String getDirectory() -> b
    101:102:java.lang.String getVersion() -> c
    107:107:java.util.HashMap getIdIndex() -> a
    112:112:java.util.HashMap getKeyIndex() -> b
    122:122:long getNntgID() -> a
    126:127:void setNntgID(long) -> a
    142:147:void setRootElement(mypackage.PropertyDefinition) -> a
    150:150:mypackage.PropertyDefinition getPropertyDefinitionById(java.lang.String) -> a
    154:154:mypackage.PropertyDefinition getPropertyDefinitionByKey(java.lang.String) -> b
    162:168:java.lang.String toString() -> toString
    210:214:void toFile() -> a

顺便说一句,我的 Proguard 配置中已经有了这个部分:

-keep class com.google.gson** { *; }
-keepclassmembers class com.google.gson** {
   *;
}

关于从哪里开始进行故障排除有什么建议吗?

最佳答案

您似乎在 proguard-project.txt 中指定了 ProGuard 选项 -overloadaggressively。它将字段名称和方法名称重载为相同的混淆名称,例如'a',只要字段和方法的签名不同即可。它对类文件有效,但 GSON 显然不喜欢它,因此您应该避免使用该选项。

关于java - Proguard 混淆导致 java.lang.IllegalArgumentException : class declares multiple JSON fields named "a",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16622192/

相关文章:

java - 打印大小为 m * n 的矩阵中所有元素的组合

Python 搜索带有键值的 Json

json - 在 GoLang 中,如何获取 HandleFunc() 函数以将 json 解析为函数外部可访问的变量

json - Gson.toJson()保留父级和子级字段,其中子级字段占主导

Java Hamcrest Matcher 检查列表是否包含另一个列表

java - 使用 Espresso 测试时未在 <package> 中找到测试

java - 尝试将 GSON 与自己的类一起使用时出错

java - 如何在 Gson 中制作自定义列表反序列化器?

java - 使用多个索引对 String[] 的 ArrayList 进行排序

javascript - 如何合并/连接两个 JSON 文件?