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.

  • 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

Introduzca aquí la descripción de la imagen

La configuración proguard de mi biblioteca

Introduzca aquí la descripción de la imagen

El gradle de mi biblioteca:

Introduzca aquí la descripción de la imagen

Y finalmente el resultado que siempre obtengo. No importa lo que excluyo / include en la configuración de proguard

Introduzca aquí la descripción de la imagen

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

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:

  1. Copie android-sdk/tools/proguard/examples/library.pro a proguard-project.txt en su proyecto de biblioteca.
  2. 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.
  3. 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.

  1. Descargar Proguard 5.2 de http://sourceforge.net/projects/proguard/files/proguard/5.2/
  2. Descomprimir en … /android-sdk/tools/proguard5.2
  3. Cambiar nombre … /android-sdk/tools/proguard to … /android-sdk/tools/proguard4.7
  4. ln -s .../android-sdk/tools/proguard5.2 .../android-sdk/tools/proguard
  5. Copie android-sdk/tools/proguard/examples/library.pro en la carpeta del proyecto de la biblioteca y cambie el nombre a proguard-library.pro
  6. Edite proguard-library.pro y comente las -injars , -outjars , -libraryjars y -printmapping .
  7. 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.

  8. 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' } 
  • La ofuscación de Proguard está rompiendo simplexml
  • Gradle no se pudo construir cuando proguard está activado
  • La aplicación de Android se bloquea en la generación de versiones con el uso de Proguard y Dagger
  • ¿Cómo evitar la ingeniería inversa de un archivo APK?
  • cómo escribir una configuración proguard para una lib de servicio remoto
  • Reducir la biblioteca de Google Play Services para usarla únicamente con Google Analytics
  • Cómo utilizar retrace.bat en android
  • Decoración de artículos Proguard y RecyclerView
  • Cómo decir Proguard para ofuscar nombres de clase
  • ¿Cómo configurar proguard para amazon iap?
  • Definición de Android Proguard Duplicate
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.