2016-07-28 20 views
4

プロジェクトでProGuardを使用していますが、新しいGson()で間違ったデータを与えています。toJson(Request);ProGuard for AndroidおよびRetrofit2 Converter Gson?

私は取得していますが

{"a":"manage","b":"689184d4418b6d975d9a8e53105d3382","c":"10","d":"76"} 

代わりの

{"username":"manage","password":"689184d4418b6d975d9a8e53105d3382","value":"10","store":"76"} 

マイProGuardのルール

-dontwarn okio.** 
-dontwarn retrofit2.Platform$Java8 
-dontwarn sun.misc.Unsafe 
-dontwarn org.w3c.dom.bootstrap.DOMImplementationRegistry 
-dontwarn retrofit2.** 
-keep class retrofit2.** { *; } 
-keepattributes Signature 
-keepattributes Exceptions 
-keepclassmembers class rx.internal.util.unsafe.** { 
    long producerIndex; 
    long consumerIndex; 
} 

-keepclasseswithmembers class * { 
    @retrofit2.http.* <methods>; 
} 
-keep class com.google.gson.** { *; } 
-keep class com.google.inject.** { *; } 

と私は

compile 'com.squareup.retrofit2:converter-gson:2.0.0' 
を使用していますを置きます

retrofit2の新しい推奨ProGuard設定は:Androidのconverter-gsonですか?

+0

で、提案のようなオプションを「維持」追加されます。そうでなければ、gsonにフィールドに名前を付ける注釈があるかどうかを調べることができます。これは、私がjacksonを使ってアプリケーションで行う方法です。 – Dodge

+0

どのようにクラスを維持する..すべてのルール – praj

+0

私の答えを参照してください:) – Dodge

答えて

9

gsonで使用しているクラスをそのまま使用するか、@SerializedNameアノテーションを使用します。

オプション1(キープクラス)

 
// all classes in a package 
-keep class com.example.app.json.** { *; } 
// or a specific class 
-keep class com.example.app.json.SpecificClass { *; } 

オプション2(使用@SerializedName):2番目のオプションProGuardのと

 
public class YourJsonClass{ 
    @SerializedName("name") String username; 

    public MyClass(String username) { 
    this.username = username; 
    } 
} 

はまだクラス名とフィールド名を難読化だけに注釈をgosn使用することができます各フィールドの正しい名前を取得する

3

@KeepでJSONモデルクラスに注釈を付けます。

0

私の場合、私はRetrofitでJSONにMoshiを使用していましたが、問題は同じでした。デバッグでは機能しましたが、ProGuardでビルドした後、モデルを使用したRecyclerViewは空のモデルオブジェクトでいっぱいだったため、NullPointerExceptionでクラッシュしました。私はGsonでもまったく同じことが起こると思います。

一つの解決策は、それに対応するシリアル化された名前を持つすべてのフィールドに注釈を付けることである。

@Json(name="username") String username; 

そのように、ProGuardの変換を壊すことなく、変数名を難読化することができます。

他のソリューションは、ダッジは、最も簡単にはあなたがgsonで使用するワンクラスを維持するだろうproguard-rules.proファイル

-keep public class com.example.model.User 
関連する問題