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

introduzca la descripción de la imagen aquí

La configuración de proguard de mi biblioteca

introduzca la descripción de la imagen aquí

El grado de mi biblioteca:

introduzca la descripción de la imagen aquí

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

introduzca la descripción de la imagen aquí

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

Author: Marian Klühspies, 2014-11-18

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:

  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 muestra-injars, -outjars, -libraryjars, -printmapping del archivo. El proceso de compilación de Gradle proporciona automáticamente estas opciones.
  3. 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í.

 79
Author: Eric Lafortune,
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.

  1. Descarga Proguard 5.2 desde http://sourceforge.net/projects/proguard/files/proguard/5.2 /
  2. Descomprimir a .../android-sdk/tools/proguard5.2
  3. Renombrar .../android-sdk/tools/proguard a .../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 a la carpeta del proyecto de la biblioteca y cambie el nombre a proguard-library.pro
  6. Editar proguard-library.pro y comentar el -injars, -outjars, -libraryjars, y -printmapping líneas.
  7. 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.

  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
    
 7
Author: swooby,
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'
}
 4
Author: Asaf Pinhassi,
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