我使用改装2&在我的项目中使用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
在build.gradle中我也使用了一些proguard文件: (我来自: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'
这是一个方法定义API:
@GET("app/authenticate")
Observable<AuthenticationModel> authenticate(
@Query("email") String email,
@Query("password") String password
);
然后在proguard之后我反编译APK文件然后我得到了:
@GET("app/authenticate")
rx.a<AuthenticationModel> a();
我不知道为什么删除所有参数。 (注意:当前项目工作以及如果不使用proguard) 请帮忙!
更新
主要问题:我使用proguard-android-optimize
所以我应该添加(作为@EpicPandaForce回答):
-keepclasseswithmembers class * {
@retrofit2.http.* <methods>;
}
答案 0 :(得分:17)
尝试以下规则
-keepclasseswithmembers class * {
@retrofit2.http.* <methods>;
}
可能需要使用Retrofit2调整包装。
答案 1 :(得分:3)
从改进文档中我们应该将下面列出的行添加到proguard文件中:
sayHello()
但根据我的经验,我们也应该添加这些行
#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
我们还需要保留改造使用的Model类:
-keep class retrofit.** { *; }
-keepattributes Signature
-keepattributes Exceptions
-keepclasseswithmembers class * {
@retrofit2.http.* <methods>;
}
-keepclasseswithmembers interface * {
@retrofit2.http.* <methods>;
}