2015-06-13 18 views
21

Mam aplikację korzystającą z zewnętrznej biblioteki (tzn. Katalog biblioteki jest na tym samym poziomie, co aplikacja - nie jest kopiowany w folderze aplikacji). Do biblioteki odwołuje się aplikacja, a zarówno biblioteka, jak i aplikacja zawierają pliki proguard. Wszystko działa dobrze, dopóki nie zbuduję aplikacji. Kiedy zbudowałem aplikację, nie znaleziono wszystkich odwołań do klas zdefiniowanych w bibliotece - otrzymuję "nie mogę znaleźć klasy symboli ...) błędów we wszystkich importach klas bibliotecznych. Jak stwierdziłem, dzieje się tak dlatego, że podczas przebudowy aplikacji program ukrywa wszystkie klasy i zmienne i dlatego aplikacja nie może ich odwoływać. Dodałem następujące do mojego pliku build.gradle,Obsługa programu Android Studio proguard w projektach z wieloma bibliotekami

buildTypes { 
    release { 
     minifyEnabled true 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt' 
    } 
    debug { 
     minifyEnabled false 
    } 
} 

ale wydaje się, że podczas budowania aplikacji, powyższe nie jest brany pod uwagę (lub budynku odbywa się w trybie zwolnienia). Jeśli zmienić powyżej, poniżej (to jest w trybie wyłączenia ProGuard uwalnianiu),

buildTypes { 
    release { 
     **minifyEnabled false** 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt' 
    } 
    debug { 
     minifyEnabled false 
    } 
} 

zastosowanie kompiluje.

Czy istnieje rozwiązanie tego problemu? Czy mogę włączyć program proguard tylko podczas tworzenia podpisanej aplikacji?

Oto PROGUARD plik biblioteki:

-optimizationpasses 5 
-dontusemixedcaseclassnames 
-dontskipnonpubliclibraryclasses 
-dontpreverify 
-verbose 
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 

-optimizations !method/marking/static 

-keep public class * extends android.app.Activity 
-keep public class * extends android.app.Application 
-keep public class * extends android.app.Service 
-keep public class * extends android.content.BroadcastReceiver 
-keep public class * extends android.content.ContentProvider 
-keep public class * extends android.app.backup.BackupAgentHelper 
-keep public class * extends android.preference.Preference 
-keep public class com.android.vending.licensing.ILicensingService 

-keepclasseswithmembernames class * { 
    native <methods>; 
} 

-keepclasseswithmembers class * { 
    public <init>(android.content.Context, android.util.AttributeSet); 
} 

-keepclasseswithmembers class * { 
    public <init>(android.content.Context, android.util.AttributeSet, int); 
} 

-keepclassmembers class * extends android.app.Activity { 
    public void *(android.view.View); 
} 

-keepclassmembers enum * { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 

-keep class * implements android.os.Parcelable { 
    public static final android.os.Parcelable$Creator *; 
} 

-dontwarn **CompatHoneycomb 
-keep class android.support.v4.** { *; } 

-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; 
} 

-keep class com.google.android.gms.** { *; } 

-keep public class com.google.ads.** { public *; } 
-keep public class com.google.gson.** { public protected *; } 
-keep public class com.google.ads.internal.** {*;} 
-keep public class com.google.ads.internal.AdWebView.** {*;} 
-keep public class com.google.ads.internal.state.AdState {*;} 
-keep public class com.google.ads.mediation.** { public *; } 

-keep public class com.google.ads.searchads.** {*;} 
-keep public class com.google.ads.util.** {*;} 

-keep class com.google.ads.** 
-dontwarn com.google.ads.** 

-keepattributes *Annotation* 

Czy jest to problem, który używam ProGuard zarówno biblioteki i aplikacji?

Odpowiedz

44

Po poszukiwaniach znalazłem odpowiedź. Jeśli korzystasz z zewnętrznych/oddzielnych bibliotek źródłowych z głównym projektem/aplikacją, nie powinieneś używać proguarda w modułach bibliotecznych. Zamiast tego, należy wymienić następujące,

buildTypes { 
    release { 
     minifyEnabled true 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt' 
    } 
    debug { 
     minifyEnabled false 
    } 
} 

z następujących (w build.gradle biblioteki/bibliotek)

buildTypes { 
    release { 
     consumerProguardFiles 'proguard-project.txt' 
    } 
} 

gdzie PROGUARD-project.txt jest plik zawierający ProGuard zasady dla twojego projektu bibliotecznego. Podczas budowania aplikacji (w trybie debugowania lub wydania) kompilator zajmie się wszystkimi regułami (w bibliotece i aplikacji).

+2

OMG Mam taką samą sytuację i straciłem cały tydzień szukając rozwiązania. Czułem się tak zagubiony. Do teraz. Dziękuję bardzo! Dziękuję Ci!! – Simon

+0

Interesujące - zaimportowałem projekt z zaćmienia i przyniosłem wszystkie jego projekty biblioteczne, ale całkowicie nie udało się edytować plików build.gradle w celu określenia consumerProguardFiles. – Carl

+0

Dodanie tego - proguard-project.txt consumerProguardFiles - w mojej eksperymentalnej wtyczce dostaje mi "Synchronizacja Gradla nie powiodła się: Podpis metody: org.gradle.model.ModelMap.consumerProguardFiles() jest odpowiedni dla typów argumentów: (java.lang.String) wartości: [proguard-project.txt] ". Czy masz pojęcie dlaczego narzeka? Dziękuję – Loebre

1

Myślę, że potrzebujesz zdefiniować reguły proguard dla swoich bibliotek. Zwykle są w dokumentach biblioteki.

(na przykład spojrzeć na moją odpowiedź tutaj dla butterknife lib: link)

+1

Powodem, dla którego mam ten problem, jest to, że zdefiniowałem reguły proguard dla mojej biblioteki. Kiedy ustawiam minify na false (w obu trybach debugowania i zwolnienia) aplikacja kompiluje się dobrze. – user501223

+0

Więc wiesz, gdzie jest problem. I nie jest jasne, czy zdefiniowałeś zasady proguard, bo nie pokazałeś tego pliku. – Andrey

+1

Zmieniłem moje pytanie i dodałem reguły proguarda, których używam. I tak, wiem, gdzie jest problem, ale rozwiązanie, tj. Wyłączenie proguard nie jest dobrym rozwiązaniem. – user501223

Powiązane problemy