2016-07-28 36 views
4

Ich verwende ProGuard in meinem Projekt, aber es gibt falsche Daten in neuen Gson(). ToJson (Request);ProGuard für Android und Retrofit2 Converter Gson?

ich aus bin immer setzen

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

statt

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

Meine ProGuard Regel

-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.** { *; } 

und ich bin mit

compile 'com.squareup.retrofit2:converter-gson:2.0.0' 

Gibt es eine neue empfohlene ProGuard Konfiguration für Retrofit2: Konverter-Gson in Android?

+0

die einfachste, die Sie wäre, um die Klassen zu halten wan mit Gson zu verwenden. Sonst möchtest du vielleicht schauen, ob gson eine Annotation hat, um einem Feld einen Namen zu geben - so mache ich das in meiner App mit jackson. – Dodge

+0

wie man die Klassen behält..Jede Regel – praj

+0

sehe meine Antwort :) – Dodge

Antwort

9

Sie möchten entweder die Klasse, die Sie verwenden, mit gson beibehalten oder Annotation verwenden.

Option 1 (halte Klasse)

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

Option 2 (Verwendung @SerializedName):

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

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

mit dem zweiten Option proguard verschleiert noch die Klasse und Feldnamen aber gosn verwenden kann, die Anmerkung zu erhalten Sie den richtigen Namen für jedes Feld

3

Kommentieren Sie Ihre JSON-Modellklassen mit @Keep.

0

In meinem Fall verwendete ich Moshi für JSON mit Retrofit, aber das Problem war das gleiche. Es funktionierte im Debug, aber nach dem Erstellen mit ProGuard, stürzte der RecyclerView, der das Modell nutzte, mit einer NullPointerException ab, weil die Liste voller leerer Modellobjekte war, da Moshi keines der Felder erkannte. Ich denke, genau das Gleiche passiert mit Gson.

Eine Lösung ist jedes Feld mit seinem entsprechenden serialisierten Namen mit Anmerkungen versehen:

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

Auf diese Weise ProGuard kann, ohne die Umwandlung die Variablennamen verschleiern.

Die andere Lösung ist das Hinzufügen einer „halten“ Option wie Ausweichen vorgeschlagen, in der proguard-rules.pro Datei

-keep public class com.example.model.User