2016-02-27 36 views
7

Io uso il retrofit 2 & utilizzando proguard nel mio progetto.Retrofit2 proguard remove param

mio Proguard:

-dontwarn retrofit2.** 
-keep class retrofit2.** { *; } 
-keepattributes Signature 
-keepattributes Exceptions 
-keepclassmembers class fqcn.of.javascript.interface.for.webview { 
    public *; 
}  

# Begin twitter 4j. 
-dontwarn twitter4j.** 
-keep class twitter4j.conf.PropertyConfigurationFactory 
-keep class twitter4j.** { *; } 
# End twitter 4j. 


# Start androidsocialnetworks 
-keep class com.androidsocialnetworks.lib.** { *; } 
# End androidsocialnetworks. 

# Google api 
-keep class com.google.** { *;} 
-keep interface com.google.** { *;} 
-dontwarn com.google.** 

-dontwarn sun.misc.Unsafe 
-dontwarn com.google.common.collect.MinMaxPriorityQueue 
-keepattributes *Annotation*,Signature 
-keep class * extends com.google.api.client.json.GenericJson { 
*; 
} 
-keep class com.google.api.services.** { 
*; 
} 

-dontwarn com.google.android.gms.cast.** 
-dontwarn com.google.android.gms.** 
-keep class com.google.android.gms.** { *; } 

-keep class * extends java.util.ListResourceBundle { 
    protected Object[][] getContents(); 
} 

-keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable { 
    public static final *** NULL; 
} 

-keepnames @com.google.android.gms.common.annotation.KeepName class * 
-keepclassmembernames class * { 
    @com.google.android.gms.common.annotation.KeepName *; 
} 

-keepnames class * implements android.os.Parcelable { 
    public static final ** CREATOR; 
} 
# End google api 

# Other 
-optimizations !class/unboxing/enum 
-dontwarn com.google.code.** 
-dontwarn oauth.signpost.** 
-dontwarn javax.management.** 
-dontwarn javax.xml.** 
#-dontwarn org.apache.** 
#-dontwarn org.slf4j.** 
-keep class org.** { *; } 
-keep class javax.** { *; } 
-assumenosideeffects class * implements org.slf4j.Logger { 
    public *** trace(...); 
    public *** debug(...); 
    public *** info(...); 
    public *** warn(...); 
    public *** error(...); 
} 

# Rx java 
-dontwarn sun.misc.** 
-keep class rx.internal.util.unsafe.** { *; } 

-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* { 
    long producerIndex; 
    long consumerIndex; 
} 

-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef { 
    rx.internal.util.atomic.LinkedQueueNode producerNode; 
} 

-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef { 
    rx.internal.util.atomic.LinkedQueueNode consumerNode; 
} 

# End other 


# Java mail 
-dontwarn java.awt.** 
-dontwarn java.beans.Beans 
-dontwarn javax.security.** 

-keep class javamail.** {*;} 
-keep class javax.mail.** {*;} 
-keep class javax.activation.** {*;} 

-keep class com.sun.mail.dsn.** {*;} 
-keep class com.sun.mail.handlers.** {*;} 
-keep class com.sun.mail.smtp.** {*;} 
-keep class com.sun.mail.util.** {*;} 
-keep class mailcap.** {*;} 
-keep class mimetypes.** {*;} 
-keep class myjava.awt.datatransfer.** {*;} 
-keep class org.apache.harmony.awt.** {*;} 
-keep class org.apache.harmony.misc.** {*;} 
# End java mail 

E in build.gradle ho anche utilizzando alcuni file di Proguard: (che ricevo da: https://github.com/krschultz/android-proguard-snippets)

 proguardFile 'proguards/proguard-support-v7-appcompat.pro' 
     proguardFile 'proguards/proguard-google-play-services.pro' 
     proguardFile 'proguards/proguard-gson.pro' 
     proguardFile 'proguards/proguard-butterknife-7.pro' 
     proguardFile 'proguards/proguard-square-retrofit2.pro' 
     proguardFile 'proguards/proguard-rx-java.pro' 
     proguardFile 'proguards/proguard-rxjava-promises.pro' 
     proguardFile 'proguards/proguard-square-okhttp3.pro' 
     proguardFile 'proguards/proguard-jsoup.pro' 
     proguardFile 'proguards/proguard-jackson-2.pro' 
     proguardFile 'proguards/proguard-simple-xml.pro' 
     proguardFile 'proguards/proguard-support-design.pro' 
     proguardFile 'proguards/proguard-square-okio.pro' 
     proguardFile 'proguards/proguard-facebook.pro' 

Qui è un metodo di definire API:

@GET("app/authenticate") 
    Observable<AuthenticationModel> authenticate(
      @Query("email") String email, 
      @Query("password") String password 
    ); 

Quindi dopo proguard ho decompilato il file APK quindi ho ottenuto:

@GET("app/authenticate") 
    rx.a<AuthenticationModel> a(); 

Non so perché tutti i parametri viene rimosso. (Note: il progetto corrente funziona come se non si utilizzi proguard) Please help!

UPDATE

Il problema principale: ho usato proguard-android-optimize quindi dovrei aggiunto (come @EpicPandaForce risposta):

-keepclasseswithmembers class * { 
    @retrofit2.http.* <methods>; 
} 

risposta

16

provare la seguente regola

-keepclasseswithmembers class * { 
    @retrofit2.http.* <methods>; 
} 

Potrebbe essere necessario per regolare il pacchetto con Retrofit2.

+0

Ciao, vuoi dire: @ retrofit2.http * ;. – quangson91

+0

Perché retrofit2 ha cambiato il nome del pacchetto – quangson91

+0

Si prega di aggiornare la risposta. Dovrebbe cambiare in '@ retrofit2. Funzionerà. Penso che anche la Homepage di Retrofit2 dovrebbe aggiornarsi @@ – quangson91

0

dalla documentazione retrofit dovremmo aggiungere linee elencate di seguito per il file Proguard:

#Retrofit 
# Platform calls Class.forName on types which do not exist on Android to determine platform. 
-dontnote retrofit2.Platform 
# Platform used when running on Java 8 VMs. Will not be used at runtime. 
-dontwarn retrofit2.Platform$Java8 
# Retain generic type information for use by reflection by converters and adapters. 
-keepattributes Signature 
# Retain declared checked exceptions for use by a Proxy instance. 
-keepattributes Exceptions 

ma come la mia esperienza dovremmo aggiungere queste righe troppo

-keep class retrofit.** { *; } 
-keepattributes Signature 
-keepattributes Exceptions 
-keepclasseswithmembers class * { 
    @retrofit2.http.* <methods>; 
} 
-keepclasseswithmembers interface * { 
    @retrofit2.http.* <methods>; 
} 

anche abbiamo bisogno di mantenere le classi modello utilizzato per retrofit:

-keep public class your.package.to.models.** {*;}