2011-09-11 5 views
20

Ho un'app che utilizza ActiveAndroid, una libreria ORM del database, che fa affidamento sulle annotazioni.Proguard vs annotazioni

@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; 

} 

Come posso far funzionare correttamente Proguard? Attualmente, ricevo errori nel non trovare un nome di colonna da ActiveAndroid quando si utilizza Proguard. Immagino che in qualche modo maneggi l'annotazione.

La mia configurazione Proguard rilevanti:

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

risposta

31

Column e Table non sono attributi di file di classe Java esistente. Dovrai almeno specificare

-keepattributes *Annotation* 

Cfr. il ProGuard manual.

6

soluzione era quella di mantenere tutti i membri della biblioteca e le classi di database

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

ho usato questo, ma invece di due linee di "-keepattributes" Ho usato questa unica linea: "-keepattributes \ * annotazione \ *", come indicato di Eric Lafortune e Simon André Forsberg. Tutto ha funzionato bene ora! – PFROLIM

15

Nel marzo 2013, Proguard version 4.9 was released, una delle correzioni erano:

Fixed overly aggressive shrinking of class annotations. 

Quindi, assicurarsi che la versione Proguard è aggiornata e quindi utilizzare la soluzione di Eric Lafortune:

-keepattributes *Annotation* 

Puoi utilizzare anche questa configurazione per archiviare tutti i membri della classe con un'annotazione specifica:

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

Per coloro che solo con Gradle, la soluzione è molto simile (notare le virgolette attorno al Annotazione):

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

keepattributes '*Annotation*' 

Ciò è particolarmente utile se si utilizza JSON annotazioni di serializzazione (ad esempio, Jackson o simili) in un progetto di vaniglia Gradle.

0

Questo ciò che ha funzionato nel mio 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>; }