Android studio 1.1.0 установка minifyEnabled true вызывает проблемы с приложением

вот мой Gradle в.создать файл

defaultConfig {

    minSdkVersion 15
    targetSdkVersion 21
    versionCode 2
    versionName "1.0"
}
buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

Proguard-правила.pro файл

-keepclassmembers class * extends de.greenrobot.dao.AbstractDao {
    public static java.lang.String TABLENAME;
}
-keep class **$Properties

-dontwarn com.squareup.**
-dontwarn okio.**
-dontwarn retrofit.**
-dontwarn org.joda.time.**

у меня есть один из классов java как

public class Endpoints {
    public final static String GET_ENDPOINT = "MY_ENDPOINT";
}

который я использую в моем Retrofit restadapter как

 RestAdapter restAdapter = new RestAdapter.Builder()
            .setEndpoint(Endpoints.GET_ENDPOINT)
            .setLogLevel(RestAdapter.LogLevel.NONE)
            .setConverter(new GsonConverter(gson))
            .setClient(new OkClient(BusProvider.getClientInstance()))
            .build();

теперь, когда minifiyEnabled false, весь код работает нормально, но я установил minifyEnabled true, сетевой вызов не происходит. Мое приложение вызывает эту конечную точку, как только она запускается, но сетевые журналы не показывают сетевой запрос. Мочь кто подскажет, что случилось здесь?

2 ответов


Proguard не очень хорошо играет со многими библиотеками, которые я использовал в своем проекте.

для gson я добавил правила proguard, данные командой gson в http://google-gson.googlecode.com/svn/trunk/examples/android-proguard-example/proguard.cfg

вам нужно изменить

-keep class com.google.gson.examples.android.model.** { *; }

to

-keep class com.your.package.name.your.models.** { *; }

для дооснащения необходимо добавить

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

Взято отсюда https://github.com/square/retrofit/issues/117

для библиотеки joda я добавил

-keep class org.joda.time.** { *; }
-dontwarn org.joda.time.**

для Отто вам нужно добавить

-dontwarn com.squareup.**
-keepclassmembers class ** {
    @com.squareup.otto.Subscribe public *;
    @com.squareup.otto.Produce public *;
}

Взято отсюда https://github.com/StephenAsherson/Android-OttoSample/blob/master/proguard-project.txt

Я также добавил

-keep class com.squareup.okhttp.** { *; }

перед использованием этих изменений конфигурации proguard обрезал мое приложение с 3,4 МБ до 2 Мб. После использования этих изменений он сжимает его до 3,2 Мб поэтому я просто собираюсь пойти с minifyEnabled false.


Proguard, вероятно, запутывает некоторые из ваших классов в вашем проекте, который использует Retrofit/Gson. Это приводит к тому, что ваш запрос никогда не будет успешным, потому что синтаксический анализ терпит неудачу. Это связано с параметрами, не соответствующими, например String status превращается в String a С Proguard. Это не соответствует ответу, поэтому он терпит неудачу.

короче - убедитесь, что все ваши классы, которые Retrofit/Gson использует для создания и анализа ответа, исключены из Proguard обфускация.