web-dev-qa-db-fra.com

Proguard vs Annotations

J'ai une application qui utilise ActiveAndroid, une bibliothèque de base de données ORM, qui repose sur des 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;

}

Comment puis-je faire en sorte que Proguard fonctionne correctement avec cela? Actuellement, je reçois des erreurs pour ne pas trouver un nom de colonne dans ActiveAndroid lors de l'utilisation de Proguard. Je suppose que cela modifie quelque peu l'annotation.

Ma configuration Proguard pertinente:

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

Column et Table ne sont pas des attributs de fichier de classe Java existants. Vous devrez au moins spécifier

-keepattributes *Annotation*

Cfr. le manuel ProGuard .

33
Eric Lafortune

En mars 2013, La version 4.9 de Proguard est sortie , l'un des correctifs est le suivant:

Fixed overly aggressive shrinking of class annotations. 

Assurez-vous donc que votre version de Proguard est à jour, puis utilisez la solution d'Eric Lafortune:

-keepattributes *Annotation*

Vous pouvez également utiliser cette configuration pour stocker tous les membres de la classe ayant une annotation spécifique:

-keepclassmembers class * {
    @fully.qualified.package.AnnotationType *;
}
16
Simon Forsberg

La solution était de garder tous les membres de la bibliothèque et les classes de la base de données

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

Pour ceux qui n'utilisent que Gradle, la solution est très similaire (notez les guillemets simples autour de l'annotation):

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

keepattributes '*Annotation*'

Cela est particulièrement utile si vous utilisez des annotations de sérialisation JSON (par exemple, Jackson ou similaire) dans un projet Vanilla Gradle.

2
John S.

Ce qui a fonctionné dans mon cas:

-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>; }
0
Hamzeh Soboh