Proguard ignora el archivo de configuración de la biblioteca
Me enfrento a un problema muy raro desde hace días...
Tengo una aplicación Gradle con dos módulos, un módulo principal y un módulo de biblioteca.
- En ambos módulos he declarado un proguard-rules.pro ruta del archivo que es correcta
- En ambos .tengo minifyEnabled true
Aquí está el primer problema: incluso si minifyEnabled es false en la biblioteca, se ofusca. no tiene ningún efecto y parece depender de la configuración del módulo principal. Im usando proguard desde hace un tiempo y nunca he experimentado tal comportamiento en absoluto.
También, el proguard-rules.pro de la biblioteca parece ser completamente ignorado. No importa lo que declare allí, no se usa y el resultado es siempre el mismo (siempre descompilado para ver el resultado). Está ofuscado 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 incorrecto y también se queja de errores de sintaxis en el archivo proguard...
No se si está relacionado de alguna manera con una actualización de Android Studio, ya que también me ha recomendado usar "minifyEnabled" en lugar de "runProguard".
¿Cómo puedo manejar proguard para utilizar el proguard-rules.pro ¿de la biblioteca también?
Editar:
He hecho un proyecto de ejemplo para aclarar mi problema
La configuración de proguard de mi biblioteca
El grado de mi biblioteca:
Y finalmente el resultado siempre obtengo. No importa lo que excluya / incluya en la configuración de proguard
Como puede ver, las reglas de proguard funcionan bastante bien en el módulo principal. Hace lo que debería. Pero siempre ofusca completamente mi biblioteca a A. A....
También ha eliminado completamente la Actividad de la Biblioteca, lo que no debería suceder en absoluto
3 answers
Normalmente no debe habilitar ProGuard en el proyecto de biblioteca. ProGuard procesa la aplicación y la biblioteca juntos en el proyecto de aplicación, que es el enfoque más efectivo.
En el proyecto de biblioteca, puede especificar cualquier configuración de ProGuard específica de la biblioteca en build.gradle, por ejemplo:
defaultConfig {
consumerProguardFiles 'proguard-rules.txt'
}
Este archivo se empaqueta en la biblioteca aar como proguard.txt
y se aplica automáticamente en el proyecto de la aplicación.
Si hace habilitar ProGuard en un proyecto de biblioteca (tal vez porque desea distribuir la biblioteca), entonces también tiene que 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 muestra
-injars
,-outjars
,-libraryjars
,-printmapping
del archivo. El proceso de compilación de Gradle proporciona automáticamente estas opciones. - Haga referencia a la configuración desde el construir.gradle del proyecto biblioteca.
Habilitar/deshabilitar ProGuard independientemente para el proyecto de biblioteca y para el proyecto de aplicación funciona bien para mí.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-24 16:08:02
Sorprendentemente, la respuesta de Eric en realidad está funcionando para mí también!
Por supuesto, Eric sabe de lo que está hablando, pero he estado tratando de encontrar una manera limpia de hacer esto automáticamente en gradle durante más de un año sin suerte hasta que acabo de encontrar este post hoy.
He combinado algunos otros así hilos y surgió w/ esta solución que funciona, que también puede ser capaz de ser simplificado. Los pasos 1-4 son opcionales, pero hasta ahora no parecía tener doler.
- Descarga Proguard 5.2 desde http://sourceforge.net/projects/proguard/files/proguard/5.2 /
- Descomprimir a ...
/android-sdk/tools/proguard5.2
- Renombrar ...
/android-sdk/tools/proguard
a .../android-sdk/tools/proguard4.7
ln -s .../android-sdk/tools/proguard5.2 .../android-sdk/tools/proguard
- Copie
android-sdk/tools/proguard/examples/library.pro
a la carpeta del proyecto de la biblioteca y cambie el nombre aproguard-library.pro
- Editar
proguard-library.pro
y comentar el-injars
,-outjars
,-libraryjars
, y-printmapping
líneas. -
Edite el archivo
build.gradle
de la biblioteca para incluir:defaultConfig { minifyEnabled true shrinkResources true proguardFiles 'proguard-library.pro' consumerProguardFiles 'proguard-library-consumer.pro' }
Puede ajustar esto para tener diferentes comportamiento de las compilaciones de liberación 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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-06 00:29:52
Lo único que funcionó para mí es definir ambas opciones en mi biblioteca:
release {
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
consumerProguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-06 07:14:20