2011-07-01 15 views
6

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?

Respuesta

15

Como en los ejemplos/anotaciones/lib/annotations.pro en la distribución de ProGuard, debe especificar los nombres completos. Por otra parte, los -keepclasseswithmembers opción no se combinan bien con el comodín "*" - "utilizar los métodos < >" comodín en su lugar:

-keepclasseswithmembers class * { 
    @proguard.annotation.Keep <methods>; 
} 

También no hay que olvidar que leer el frasco que contiene la anotación clases:

-libraryjars annotations.jar 
+0

Acabo de actualizar el tema con una muestra.Hago lo mismo que sugieres, y todavía no funciona: '( – Andy

+0

Y especificar JAR con la anotación como una biblioteca (-libraryjars) no ayuda. – Andy

+0

Se actualizó la solución para usar el comodín apropiado. ahora. –

Cuestiones relacionadas