¿Cómo mantener / excluir una ruta de paquete en particular cuando se usa proguard?

110

Quiero excluir algunas rutas de archivo de ProGuard. Ejemplocom.myapp.customcomponents

¿Cómo puedo hacer esto? Odio tener que colocar banderas -keep para cada archivo de componente personalizado que tengo en este directorio.

He intentado lo siguiente pero no funciona:

-keep public class com.myapp.customcomponents.*
Jona
fuente

Respuestas:

241

No especifica de qué manera no funciona. Su configuración mantiene los nombres de todas las clases públicas en el paquete especificado:

-keep public class com.myapp.customcomponents.*

La siguiente configuración mantiene los nombres de todas las clases públicas en el paquete especificado y sus subpaquetes:

-keep public class com.myapp.customcomponents.**

La siguiente configuración mantiene los nombres de todas las clases / campos / métodos públicos / protegidos en el paquete especificado y sus subpaquetes:

-keep public class com.myapp.customcomponents.** {
  public protected *;
}
Eric Lafortune
fuente
6
Los asteriscos dobles (**) ya no se compilan (Android Studio 4.0)
Daniel
1
Android Studio 4.x mostrará errores como "Nombre de clase no resuelto", etc. para asteriscos dobles (**), pero funcionará como se esperaba.
Mahmudul Hasan Shohag
Está arreglado y no dará errores en los próximos lanzamientos, verifique los detalles aquí
shadygoneinsane hace
55

Agregue la siguiente línea en la parte inferior de su configuración de ProGuard:

-keep class com.facebook.** { *; }

Reemplace el nombre del paquete en consecuencia, aquí el paquete com.facebookse excluirá de ProGuard.

Pawan Maheshwari
fuente
13
por qué mantener y no usar juntos
Jongz Puangput
@Jongz Puangput, si tengo razón, si la aplicación no usa el paquete com.facebook, en la compilación se mostrará la nota "la configuración se refiere a la clase desconocida ...". -dontwarn deshabilite esta nota.
Yura Shinkarev
14
¿Qué { *; }significa?
Muhammad Babar
15
@MuhammadBabar me refiero a cada miembro, método, clase en todos los ámbitos, en resumen, ¡todo!
Omar El Don
1

Mucha gente parece recomendar -keep class com.myapp.customcomponents.** { *; }como una forma de excluir una ruta de ser procesada. Mira aquí:

  1. excluir paquetes de proguard
  2. Hacer que Proguard ignore completamente el paquete
  3. Evitar que un directorio se ofusque proguard

El problema con esta solución es que todavía hay cierto nivel de ofuscación, lo que puede romper su código. Puede ver el mapeo en la impresión del mapeo:

java.lang.String toString() -> toString
int getMemoizedSerializedSize() -> getMemoizedSerializedSize
void setMemoizedSerializedSize(int) -> setMemoizedSerializedSize
int getSerializedSize() -> getSerializedSize
boolean equals(java.lang.Object) -> equals
int hashCode() -> hashCode

La solución por la que he optado es un proceso de dos pasos. Primero, utilícelo injarscon un filtro para seleccionar la ruta del paquete que me gustaría procesar. Es posible agregar los otros parches de paquetes como bibliotecas.

-injars       artifacts/in.jar(org/toprocess/**.class)
-outjars      out/processed.jar
-libraryjars  artifacts/in.jar(org/skipped/**.class)
-libraryjars  artifacts/in.jar(org/moreskipped/**.class)

En segundo lugar, combine el frasco procesado con el frasco original, pero solo las rutas que se omitieron.

-injars  out/processed.jar
-injars  artifacts/in.jar(org/skipped/**.class)
-injars  artifacts/in.jar(org/moreskipped/**.class)
-outjars out/merged.jar

-dontshrink
-dontoptimize
-dontobfuscate

El resultado es un contenedor combinado que es la combinación de la ruta del paquete procesado y las rutas omitidas. Este ejercicio no es válido si alguien puede proporcionar una manera de omitir el procesamiento de ciertas rutas por completo (que no he encontrado).

PLG
fuente
1

Lo que funcionó para mí usando Android Studio 4.0 es:

-keepclassmembers class com.myapp.customcomponents.* {
    <fields>;
    <init>();
    <methods>;
}

Los asteriscos dobles (**) en otras respuestas no me funcionaron. También probé la configuración anterior con R8, funciona bien.

mtsahakis
fuente
esta respuesta es la respuesta más actualizada, creo. gracias.
Gogo-the-Cat