mejores - Manejo de Android Studio Proguard en proyectos de mĂșltiples bibliotecas
mejores librerias android studio (2)
Creo que necesitas definir reglas de defensa para tus bibliotecas. Por lo general, están en los documentos de la biblioteca.
(Por ejemplo, eche un vistazo a mi respuesta aquí para ButterKnife lib: link )
Tengo una aplicación que usa una biblioteca referenciada externamente (es decir, el directorio de la biblioteca está en el mismo nivel que la aplicación, no se copia dentro de la carpeta de la aplicación). La biblioteca hace referencia a la biblioteca y tanto la biblioteca como la aplicación incluyen archivos proguard. Todo funciona bien hasta que construyo la aplicación. Cuando construí la aplicación, no se encontraron todas las referencias a las clases definidas en la biblioteca: recibo errores de "no puedo encontrar la clase de símbolos ..." en todas las importaciones de clases de la biblioteca. Como encontré, esto se debe a que al reconstruir la aplicación, proguard ofusca todas las clases y variables y, por lo tanto, la aplicación no puede hacer referencia a ellas. He agregado lo siguiente a mi archivo build.gradle,
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile(''proguard-android.txt''), ''proguard-project.txt''
}
debug {
minifyEnabled false
}
}
pero parece que al construir la aplicación, lo anterior no se toma en consideración (o la construcción se realiza en modo de lanzamiento). Si cambio lo anterior a lo siguiente (es decir, deshabilito proguard en el modo de lanzamiento),
buildTypes {
release {
**minifyEnabled false**
proguardFiles getDefaultProguardFile(''proguard-android.txt''), ''proguard-project.txt''
}
debug {
minifyEnabled false
}
}
la aplicación compila bien
¿Hay una solución para esto? ¿Puedo solo activar Proguard al crear una aplicación firmada?
Aquí está el archivo proguard de la biblioteca:
-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*
¿Es un problema que esté usando proguard tanto en la biblioteca como en la aplicación?
Después de buscar, encontré la respuesta. Si está utilizando librerías fuente externas / separadas con su proyecto / aplicación principal, no debe usar un protector en los módulos de la biblioteca. En cambio, reemplazas lo siguiente,
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile(''proguard-android.txt''), ''proguard-project.txt''
}
debug {
minifyEnabled false
}
}
con lo siguiente (en build.gradle de la biblioteca / libraries):
buildTypes {
release {
consumerProguardFiles ''proguard-project.txt''
}
}
donde proguard-project.txt es el archivo que contiene las reglas de proguard para su proyecto de biblioteca. Al compilar la aplicación (ya sea en modo depuración o versión), el compilador se encargará de todas las reglas (en la biblioteca y en la aplicación).