2015-06-13 14 views
21

Ho un'applicazione che utilizza una libreria con riferimenti esterni (ovvero, la directory della libreria si trova nello stesso livello dell'applicazione - non è copiata all'interno della cartella dell'applicazione). La libreria fa riferimento all'applicazione e sia la libreria che l'applicazione includono i file proguard. Tutto funziona bene fino a quando non costruisco l'applicazione. Quando ho creato l'app, tutti i riferimenti alle classi definite nella libreria non sono stati trovati - ottengo errori "non riesco a trovare la classe di simboli ..." su tutte le importazioni di classi di libreria. Come ho scoperto, questo è dovuto al fatto che durante la ricostruzione dell'applicazione, proguard nasconde tutte le classi e le variabili e quindi l'applicazione non può fare riferimento a esse. Ho aggiunto il seguente al mio file build.gradle,Gestione proguard per Android Studio in progetti multi-libreria

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

ma sembra che quando si costruisce l'applicazione, quanto sopra non viene preso in considerazione (o l'edificio è fatto in modalità di rilascio). Se cambio sopra di seguito (cioè disabilitare proguard in modalità di rilascio),

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

l'applicazione compila bene.

C'è una soluzione a questo? Posso abilitare proguard solo quando creo un'applicazione firmata?

Ecco il file Proguard libreria:

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

E 'un problema che sto utilizzando Proguard sia la biblioteca e l'applicazione?

risposta

44

Dopo alcune ricerche ho trovato la risposta. Se si utilizzano librerie di sorgenti esterne/separate con il progetto/applicazione principale, non si dovrebbe utilizzare un proguard sui moduli della libreria. Invece, si sostituisce il seguente,

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

con il seguente (nella build.gradle della biblioteca/biblioteche):

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

dove Proguard-project.txt è il file che contiene il Proguard regole per il tuo progetto di biblioteca. Quando si costruisce l'applicazione (in modalità debug o release), il compilatore si prenderà cura di tutte le regole (nella libreria e nell'applicazione).

+2

OMG Ho la stessa situazione e ho perso una settimana intera cercando una soluzione. Mi sentivo così perso. Fino ad ora. Grazie mille! Grazie!! – Simon

+0

Interessante - Ho importato un progetto da eclipse e ha portato in tutti i suoi progetti di libreria, ma non è riuscito a modificare i file build.gradle per specificare consumerProguardFiles. – Carl

+0

Aggiungendo questo - proguard-project.txt di consumerProguardFiles - nel mio plug-in sperimentale mi viene restituito un "Sincronizzazione graduale non riuscita: Nessuna firma del metodo: org.gradle.model.ModelMap.consumerProguardFiles() è applicabile per i tipi di argomenti: (java.lang.String) valori: [proguard-project.txt] ". Hai un'idea del motivo per cui si lamenta? Grazie – Loebre

1

Penso che sia necessario definire le regole proguard per le proprie librerie. Di solito sono nei documenti della biblioteca.

(ad esempio un'occhiata alla mia risposta qui per butterknife lib: link)

+1

Il motivo per cui ho questo problema è perché ho definito le regole proguard per la mia libreria. Quando imposto minify su false (in entrambe le modalità di debug e release) l'applicazione viene compilata correttamente. – user501223

+0

Quindi, sai dov'è il problema. E non è chiaro se hai definito le regole proguard, perché non hai mostrato quel file. – Andrey

+1

Ho modificato la mia domanda e ho aggiunto le regole proguard che sto usando. E sì, so dove si trova il problema, ma la soluzione, cioè la disattivazione di proguard, non è una buona soluzione. – user501223

Problemi correlati