2015-04-25 9 views
8

Oto mój plik gradle.buildstudio Android 1.1.0 Ustawienie minifyEnabled prawdziwą przyczyną problemów z aplikacją

defaultConfig { 

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

Proguard-rules.pro plik

-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.** 

mam jeden z klasy Java jako

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

którego używam w moim modernizacji restadapter jak

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

Teraz, gdy minifiyEnabled jest fałszywe, cały kod działa dobrze, ale ustawię minifyEnabled na true, połączenie sieciowe nie nastąpi. Moja aplikacja wywołuje ten punkt końcowy natychmiast po uruchomieniu, ale dzienniki sieciowe nie wskazują, że żądanie sieci zostało wykonane. Czy ktoś może mi powiedzieć, co jest nie tak?

Odpowiedz

12

Program Proguard nie jest zgodny z wieloma bibliotekami używanymi w moim projekcie.

Dla gson dodałem zasady PROGUARD podane przez zespół gson na http://google-gson.googlecode.com/svn/trunk/examples/android-proguard-example/proguard.cfg

Musisz zmienić

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

do

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

Dla modernizacji trzeba dodać

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

Zrobione stąd https://github.com/square/retrofit/issues/117

Dla biblioteki Joda dodałem

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

Otto trzeba dodać

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

Zrobione stąd https://github.com/StephenAsherson/Android-OttoSample/blob/master/proguard-project.txt

Dodałem też

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

Przed użyciem tych zmian w konfiguracji proguard przyciął moją aplikację z 3,4 mb na 2 mb. Po użyciu tych zmian zmniejsza się do 3,2 mb, więc po prostu pójdę z minifyEnabled fałszywe.

+0

Twój przykładowy link już nie działa. Możesz użyć tego zamiast: https: // github.com/google/gson/blob/master/examples/android-proguard-example/proguard.cfg – w3bshark

4

Program Proguard prawdopodobnie zaciemnia niektóre z twoich zajęć w projekcie, z których korzysta Retrofit/Gson. Powoduje to, że twoja prośba nigdy się nie powiedzie, ponieważ parsowanie nie powiedzie się. Wynika to z niepasujących parametrów, np. String status może przekształcić się w String a z Proguard. To nie pasuje do odpowiedzi, więc nie działa.

Podsumowując - upewnij się, że wszystkie klasy, których Retrofit/Gson używa do tworzenia i analizowania odpowiedzi, są wyłączone z obfuskacji Proguard.

+0

Tak, to był problem. Napiszę konkretną odpowiedź, która rozwiązała dla mnie problem. –

Powiązane problemy