Quiero mantener solo las clases, que contienen métodos anotados con @Keep
, y estos métodos. Estos métodos (y las clases propietarias) deben mantenerse incluso si no se utilizan.¿Cómo mantener las clases que contienen miembros específicos?
Lo que escribo en .pro-archivo es:
-keepclassmembers class * {
@Keep *;
}
-keepclasseswithmembers class * {
@Keep *;
}
Pero se contrae a cabo clases con métodos @Keep si no se utilizan.
Luego de que este intento:
-keep class * {
@Keep *;
}
que sólo mantiene todas las clases.
Entonces, ¿qué debo escribir en .pro-file?
Actualización 1: ejemplo Gracias por su respuesta. Pero ya uso nombres de anotación totalmente calificados e incluyo JAR con anotaciones, pero no hago lo que quiero. Entonces, he preparado una muestra.
tengo 2 tarros:
example.jar/
example/
code/
more/
A.class
lib.jar/
example/
lib/
Keep.class
A.java:
package example.code.more;
import example.lib.*;
public class A {
@Keep
void foo() {}
}
Keep.java:
package example.lib;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.CLASS)
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
public @interface Keep {
}
Proguard config, example.pro:
-injars example.jar
-injars lib.jar
-outjars obfuscated.jar
-libraryjars <java.home>/lib/rt.jar
-printmapping rt.map
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
-printseeds
-overloadaggressively
-dontoptimize
-keeppackagenames example.lib.**
-keepattributes *Annotation*
-keepclassmembers class * extends java.lang.Enum {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class example.lib.* { *; }
-keep class * extends java.lang.annotation.Annotation { *; }
-keepclassmembers class * {
@example.lib.Keep *;
}
-keepclasseswithmembers class * {
@example.lib.Keep *;
}
nombres Sede, los paquetes son correctos y todos los tarros están incluidos.
Resultando mapa-archivo:
example.lib.Keep -> example.lib.Keep:
Así, A.class se retira. ¿Qué estoy haciendo mal?
Acabo de actualizar el tema con una muestra.Hago lo mismo que sugieres, y todavía no funciona: '( – Andy
Y especificar JAR con la anotación como una biblioteca (-libraryjars) no ayuda. – Andy
Se actualizó la solución para usar el comodín apropiado. ahora. –