2011-09-11 9 views
20

Tengo una aplicación que usa ActiveAndroid, una biblioteca ORM de base de datos, que se basa en anotaciones.Proguard vs Annotations

@Table(name="test") 
public class DatabaseItem extends ActiveRecordBase<DatabaseItem> { 

    public DatabaseItem(Context context) { 
     super(context); 
     // TODO Auto-generated constructor stub 
    } 

    @Column(name="counter") 
    public int counter; 

} 

¿Cómo consigo que Proguard trabaje muy bien con esto? Actualmente, recibo errores acerca de no encontrar un nombre de columna por ActiveAndroid cuando uso Proguard. Supongo que de alguna manera destruye la anotación.

Mi configuración Proguard relevante:

#ActiveAndroid 
-keep public class com.activeandroid.** 
-keep public class * extends com.activeandroid.ActiveRecordBase 
-keepattributes Column 
-keepattributes Table 

Respuesta

31

Column y Table atributos de archivo de clase Java no son existentes. Al menos tendrá que especificar

-keepattributes *Annotation* 

Cfr. el ProGuard manual.

6

solución era mantener a todos los miembros de la biblioteca y las clases de bases de datos

-keep class com.activeandroid.** 
{ 
    *; 
} 
-keep public class my.app.database.** 
{ 
    *; 
} 
-keepattributes Column 
-keepattributes Table 
+1

He utilizado este, pero en lugar de las dos líneas de "-keepattributes" He utilizado esta única línea: "-keepattributes \ * Anotación \ *", tal como se indica por Eric Lafortune y Simon André Forsberg. ¡Todo funcionó bien ahora! – PFROLIM

15

En marzo de 2013, Proguard version 4.9 was released, una de las correcciones fueron:

Fixed overly aggressive shrinking of class annotations. 

Así que asegúrese de que su versión Proguard es hasta la fecha y luego utilizar la solución de Eric Lafortune:

-keepattributes *Annotation* 

Puede también use esta configuración para almacenar todos los miembros de la clase que tengan una anotación específica:

-keepclassmembers class * { 
    @fully.qualified.package.AnnotationType *; 
} 
2

caso de quienes sólo usando Gradle, la solución es muy similar (nota las comillas simples alrededor de la anotación):

keep 'public class java.package.** { *; }' 

keepattributes '*Annotation*' 

Esto es especialmente útil si está utilizando anotaciones de serialización JSON (por ejemplo, Jackson o similares) en una proyecto vanilla Gradle.

0

Esto lo que funcionó en mi caso:

-keep class com.activeandroid.** { *; } 
-keep class com.activeandroid.**.** { *; } 
-keep class * extends com.activeandroid.Model 
-keep class * extends com.activeandroid.serializer.TypeSerializer 
-keep public class * extends com.activeandroid.ActiveRecordBase 

-keepattributes Column 
-keepattributes Table 
-keepattributes *Annotation* 
-keepclasseswithmembers class * { @com.activeandroid.annotation.Column <fields>; }