Retrofit2 proguard удалить параметр

Я использую retrofit 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
    );

Затем после прогарда я декомпилирую APK-файл и получил:

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

Я не знаю, почему все параметры удалены. (Примечания: текущий проект работает так же хорошо, как если бы не использовался proguard) Пожалуйста, помогите!

ОБНОВЛЕНИЕ

Основная проблема: я использовал proguard-android-optimize, поэтому я должен добавить (как ответ @EpicPandaForce):

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

person quangson91    schedule 27.02.2016    source источник


Ответы (2)


Попробуйте следующее правило

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

Возможно, потребуется настроить пакет с помощью Retrofit2.

person EpicPandaForce    schedule 27.02.2016
comment
Привет, Вы имеете в виду: @ retrofit2.http. * ‹Methods›; - person quangson91; 27.02.2016
comment
Поскольку retrofit2 изменил имя пакета - person quangson91; 27.02.2016
comment
Пожалуйста, обновите свой ответ. Должен измениться на @retrofit2. Он будет работать. Я думаю, что домашняя страница Retrofit2 тоже должна обновиться @@ - person quangson91; 27.02.2016
comment
@EpicPandaForce Спасибо, что сделали мой день, было бы хорошо, если бы команда Square упомянула об этом. :) - person Bikash; 23.09.2016
comment
У меня не сработало ... все равно возникла та же ошибка после того, как я попробовал это и все другие правила, которые я мог найти. Связал правила, так как он слишком длинный для комментария. ссылка - person Benni; 30.10.2016
comment
@Benni Вы также защищаете свои классы, которые отправляете в качестве параметра? - person EpicPandaForce; 30.10.2016
comment
@EpicPandaForce @POST("auth/login") Observable<String> login(@Body LoginForm loginForm); Вы имеете в виду LoginForm в этом случае? Защитить = сохранить? - person Benni; 11.11.2016
comment
ага, вот что я имею в виду - person EpicPandaForce; 11.11.2016
comment
На самом деле я забыл сохранить весь свой пакет ^^ Спасибо за подсказку :) - person Benni; 24.11.2016
comment
Если я не ошибаюсь, это позволяет программе не запутывать ваши API-интерфейсы, что делает ваше приложение уязвимым для атаки типа «злоумышленник в середине». Я ищу решение, которое позволит мне запутать мои API, кто угодно? - person Alessio; 06.07.2017
comment
@Alessio proguard ни в коем случае не скрывает строковые литералы. - person EpicPandaForce; 06.07.2017
comment
спасибо @EpicPandaForce за разъяснения! Итак, есть ли идеи, как я могу подойти к проблеме, что мои пути видны даже после обфускации Proguard? Любые подсказки, предложения, ссылки или комментарии приветствуются :) - person Alessio; 06.07.2017

из документации по модернизации мы должны добавить в файл 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.** {*;}
person Dmila Ram    schedule 22.11.2017
comment
Мне помогает ведение классов моделей! Спасибо! - person Rafols; 07.06.2018