繁体   English   中英

Proguard混淆导致java.lang.IllegalArgumentException:class声明了多个名为“a”的JSON字段

[英]Proguard obfuscation results in java.lang.IllegalArgumentException: class declares multiple JSON fields named “a”

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

除非我被误导,否则错误就像:

class属性声明了多个名为a的JSON字段

和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显然不喜欢它,所以你应该避免使用该选项。

仅保留类的名称而不保留成员名称的原因是因为成员名称是导致错误的原因。 Proguard将多个成员重命名为同名“a”,这在类文件中完全有效。 但是,您正在使用的工具不喜欢具有相同名称的多个成员,因此会引发错误。

因此,解决方案是阻止Proguard重命名该类成员。 可能还有一个Proguard设置,以避免重复的名称,但我不熟悉它是什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM