2013-05-18 3 views
9

私のアプリケーションの起動時に2つのエラーがログに記録されますが、難読化がなければエラーはありません。Proguardの難読化によってjava.lang.IllegalArgumentExceptionが発生する:classが "a"という名前の複数のJSONフィールドを宣言する

私は誤解されていない限り、エラーが似ています:

クラスプロパティ

とクラスPropertyDefinitionにも同じ名前の複数のJSONフィールドを宣言します。

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) 

ここでは、ほぼ同じエラーの1つに関連する難読化マップのセクションを示します。ここでクラス名「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** { 
    *; 
} 

任意の提案?

+0

'Property'と' PropertyDefinition'を難読化しようとしませんでしたか? –

+0

@JoeF私は最後の夜にそれをやりました: '-keep public class myPackage.PropertyDefinition {*; } 'とその他いくつか。これで問題は解決しますが、すべてのメンバー名を保持せずにクラスの名前(たとえば、PropertyDefinition')を保持できると思っています。これまで私はそれを働かせることはできません。 – MountainX

答えて

6

proguard-project.txtにProGuardオプション-overloadaggressivelyを指定しているようです。フィールド名とメソッド名は同じ難読化された名前にオーバーロードされます。 'a'は、フィールドとメソッドのシグネチャが異なる限りです。クラスファイルには有効ですが、GSONではそれが気に入らないので、このオプションは避けてください。

+1

面白いことに、GSONを設定するためのさまざまなProguardの例では、 '-overloadaggressively'が推奨されるオプションの1つです。 – MountainX

+2

-keepオプションと組み合わせて、シリアル化されたフィールドを元の名前で保持する場合、このオプションはokです。それはどんな名前の衝突も避けます。 –

+0

は私には役に立たない – xedo

3

メンバ名を保持せずにクラスの名前を保持しても機能しないのは、メンバ名がエラーの原因であるためです。 Proguardは、複数のメンバーを同じ名前「a」に改名しています。これはクラスファイルで完全に有効です。しかし、使用しているツールでは、同じ名前のメンバーが複数あることが嫌なので、エラーが発生します。

解決策は、Proguardがそのクラスのメンバーの名前を変更するのを止めることです。名前の重複を避けるためのProguardの設定もあるかもしれませんが、私はそれが何であるかを十分に知らないのです。

+1

この回答は私に正しい方向に向けて指摘しました。私は '-keep class your.package.name.model。** {*;}'を[ここに示唆](https://bitbucket.org/littlerobots/cupboard/wiki/ProGuard)として追加しました。 – Sufian

関連する問題