Proguard ignora el archivo de configuración de la biblioteca
Estoy enfrentando un problema realmente extraño por días …
Tengo una aplicación Gradle con dos módulos, un módulo principal y un módulo de biblioteca.
- Desbloqueo de APK de Android con java.lang.AssertionError: imposible en java.lang.Enum
- Android - cómo mantener el enum de proguard
- Uso de Proguard para eliminar clases no utilizadas en la biblioteca de Servicios de Google Play
- Proguard devuelto con el código de error 1. Después de la actualización de ADT 16 a 18
- Error de Proguard, no se puede exportar la aplicación
- En ambos módulos he declarado una ruta de archivo proguard-rules.pro que es correcta
- En ambos archivos .gradle tengo minifyEnabled true
Aquí es el primer problema: incluso si minifyEnabled es falso en la biblioteca, obfuscated. No tiene ningún efecto en absoluto y parece depender de los ajustes del módulo principal. Estoy usando proguard desde hace un tiempo y nunca he experimentado tal comportamiento en absoluto.
Además, el proguard-rules.pro de la biblioteca parece ser completamente ignorado. No importa lo que declaro allí, no se utiliza y el resultado es siempre el mismo (siempre descompilado para ver el resultado). Está ofuscada con la configuración predeterminada.
He utilizado un nombre de archivo proguard no válido para ver si el archivo se toca, y de hecho hay errores con el nombre equivocado y también complaines sobre errores de sintaxis en el archivo proguard …
No sé si de alguna manera está relacionado con una actualización de Android Studio, ya que también me ha recomendado usar "minifyEnabled" en lugar de "runProguard".
¿Cómo puedo gestionar proguard para usar proguard-rules.pro de la biblioteca también?
Editar:
He hecho un proyecto de muestra para aclarar mi problema
La configuración proguard de mi biblioteca
El gradle de mi biblioteca:
Y finalmente el resultado que siempre obtengo. No importa lo que excluyo / include en la configuración de proguard
Como puede ver, las reglas proguard funcionan bastante bien en el módulo principal. Hace lo que debería. Pero siempre obfuscates mi biblioteca a aa …
También ha eliminado completamente la Actividad de la Biblioteca, que no debería suceder en absoluto
- ¿Cómo hacer que runProguard funcione para el plugin Gradle de android-library?
- ¿Cómo decirle a ProGuard que guarde todo en un paquete en particular?
- Obfuscate Android proyecto de prueba, así como el proyecto (prueba en ejecución en la versión ofuscada y la versión)
- Obtener advertencias con Proguard (con bibliotecas externas)
- Error de tiempo de ejecución de Proguard con un tarro externo de Admob
- Android Proguard Release causa no ejecutar for-loop
- Proguard Google Analytics
- Excluyendo ciertos módulos de proguard Android Gradle Buildscript
Por lo general, no debe activar ProGuard en el proyecto de biblioteca. ProGuard procesa la aplicación y la biblioteca juntas en el proyecto de aplicación, que es el enfoque más efectivo.
En el proyecto de biblioteca, puede especificar cualquier configuración específica de biblioteca ProGuard en build.gradle, por ejemplo:
defaultConfig { consumerProguardFiles 'proguard-rules.txt' }
Este archivo se envasa en la biblioteca aar como proguard.txt
y se aplica automáticamente en el proyecto de aplicación.
Si habilita ProGuard en un proyecto de biblioteca (tal vez porque desea distribuir la biblioteca), también debe agregar la configuración adecuada para procesar la biblioteca. La compilación de Android Gradle no parece hacer esto automáticamente. Usted puede:
- Copie
android-sdk/tools/proguard/examples/library.pro
aproguard-project.txt
en su proyecto de biblioteca. - Elimine las líneas de entrada / salida de
-injars
,-outjars
,-libraryjars
,-printmapping
del archivo. El proceso de generación de Gradle proporciona automáticamente estas opciones. - Haga referencia a la configuración del build.gradle del proyecto de biblioteca.
Activar / desactivar ProGuard de forma independiente para el proyecto de biblioteca y para el proyecto de aplicación funciona bien para mí.
Sorprendentemente, la respuesta de Eric está trabajando para mí también!
Por supuesto, Eric sabe de lo que está hablando, pero he intentado encontrar una manera limpia de hacerlo automáticamente en gradle durante más de un año sin ninguna suerte hasta que acabo de encontrar este post hoy.
He combinado unos cuantos otros subprocesos SO y surgió w / esta solución que funciona, que también puede ser capaz de ser simplificado. Los pasos 1 a 4 son opcionales, pero hasta ahora no parece haberle dolido.
- Descargar Proguard 5.2 de http://sourceforge.net/projects/proguard/files/proguard/5.2/
- Descomprimir en …
/android-sdk/tools/proguard5.2
- Cambiar nombre …
/android-sdk/tools/proguard
to …/android-sdk/tools/proguard4.7
-
ln -s .../android-sdk/tools/proguard5.2 .../android-sdk/tools/proguard
- Copie
android-sdk/tools/proguard/examples/library.pro
en la carpeta del proyecto de la biblioteca y cambie el nombre aproguard-library.pro
- Edite
proguard-library.pro
y comente las-injars
,-outjars
,-libraryjars
y-printmapping
. -
Edite el archivo
build.gradle
la biblioteca para que incluya:defaultConfig { minifyEnabled true shrinkResources true proguardFiles 'proguard-library.pro' consumerProguardFiles 'proguard-library-consumer.pro' }
Puede ajustar esto para tener un comportamiento diferente para las compilaciones de lanzamiento y depuración.
-
proguard-library-consumer.pro
# include in this file any rules you want applied to a # consumer of this library when it proguards itself. -dontwarn junit.** -dontwarn org.junit.** # Make crash call-stacks debuggable. -keepnames class ** { *; } -keepattributes SourceFile,LineNumberTable
Lo único que me ha funcionado es definir las dos opciones en mi biblioteca:
release { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' consumerProguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' }