Retrofit2 proguard 删除参数

Posted

技术标签:

【中文标题】Retrofit2 proguard 删除参数【英文标题】:Retrofit2 proguard remove param 【发布时间】:2016-06-10 22:05:10 【问题描述】:

我在我的项目中使用改造 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>;

【问题讨论】:

【参考方案1】:

试试下面的规则

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

可能需要使用 Retrofit2 调整包。

【讨论】:

嗨,你的意思是:@retrofit2.http.* ; 因为retrofit2改了包名 请更新您的答案。应该更改为@retrofit2. 它会工作。我认为 Retrofit2 主页也应该更新@@ @EpicPandaForce 谢谢你让我开心,如果 Square 团队提到了这一点,那就太好了。 :) 对我不起作用......在尝试了这个以及我可能找到的所有其他规则之后仍然得到同样的错误。链接规则,因为评论太长了。 link【参考方案2】:

从改造文档中,我们应该将下面列出的行添加到 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

但根据我的经验,我们也应该添加这些行

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

-keepclasseswithmembers interface * 
    @retrofit2.http.* <methods>;

我们还需要保留改造使用的模型类:

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

【讨论】:

保留模型类对我有帮助!谢谢!

以上是关于Retrofit2 proguard 删除参数的主要内容,如果未能解决你的问题,请参考以下文章

将 proguard 与 retrofit2 和 rxjava 一起使用时出错

ProGuard for Android 和 Retrofit2 Converter Gson?

Proguard & Retrofit 错误

启用 ProGuard 时改造 2 不发送数据

你如何阻止 Proguard 删除类型参数?

Retrofit2