support studio manager librería library features compatibilidad bibliotecas android android-studio module proguard android-library

studio - sdk manager android support library



Proguard ignora el archivo de configuración de la biblioteca (3)

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'' }

Me enfrento a 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í está el primer problema: incluso si minifyEnabled es falso en la biblioteca, se ofusca. no tiene ningún efecto y parece depender de la configuración 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 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 usado un nombre de archivo proguard no válido para ver si el archivo se ha tocado, y de hecho hay errores con el nombre incorrecto y también se queja de errores de sintaxis en el archivo proguard ...

No sé si está relacionado de alguna manera con una actualización de Android Studio, ya que también me recomendó 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 / incluyo en la configuración 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 aaa ...

También ha eliminado por completo la Actividad de la Biblioteca, lo que no debería suceder en absoluto


Por lo general, no debería habilitar ProGuard en el proyecto de la 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 la 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 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 construcció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 build.gradle del proyecto de la biblioteca.

Habilitar / deshabilitar ProGuard de forma independiente para el proyecto de la biblioteca y para el proyecto de la aplicación funciona bien para mí.


Sorprendentemente, ¡la respuesta de Eric realmente 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 hacerlo automáticamente en gradle durante más de un año sin suerte hasta que encontré esta publicación hoy.

Combiné algunos otros hilos SO y apareció esta solución que funciona, que también puede simplificarse. Los pasos 1-4 son opcionales, pero hasta ahora no parece haberle dolido.

  1. Descargue Proguard 5.2 de http://sourceforge.net/projects/proguard/files/proguard/5.2/
  2. Descomprimir para ... /android-sdk/tools/proguard5.2
  3. Cambiar el 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 incluir:

    defaultConfig { minifyEnabled true shrinkResources true proguardFiles ''proguard-library.pro'' consumerProguardFiles ''proguard-library-consumer.pro'' }

    Puede modificar esto para tener un comportamiento diferente para versiones 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