Proguard vs Annotazioni

Ho un app che utilizza ActiveAndroid, un database ORM biblioteca, che si basa sulle 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 ottenere il Proguard lavorando bene con questo? Attualmente, ottengo l’errore di non trovare il nome di una colonna da ActiveAndroid quando si utilizza Proguard. Credo che, in qualche modo, manipola l’annotazione.

Mio rilevanti Proguard configurazione:

#ActiveAndroid
-keep public class com.activeandroid.**
-keep public class * extends com.activeandroid.ActiveRecordBase
-keepattributes Column
-keepattributes Table
InformationsquelleAutor Peterdk | 2011-09-11

 

5 Replies
  1. 16

    Nel Marzo 2013, Proguard versione 4.9 è stato rilasciato, uno dei correzioni di bug sono stati:

    Fixed overly aggressive shrinking of class annotations. 

    In modo da assicurarsi che il vostro Proguard versione è aggiornato e quindi utilizzare Eric Lafortune soluzione:

    -keepattributes *Annotation*

    È inoltre possibile utilizzare questa configurazione per memorizzare tutti i membri della classe che ha una specifica annotazione:

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

    Soluzione è stata 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
    • Ho usato questo, ma invece di due righe “-keepattributes” ho usato questa linea: “-keepattributes *Annotazioni*”, come indicato da Eric Lafortune e Simon André Forsberg. Tutto ha funzionato bene ora!
  3. 2

    Per chi utilizza solo Gradle, la soluzione è molto simile (nota le virgolette intorno alla Annotazione):

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

    Questo è particolarmente utile se si utilizza serializzazione JSON annotazioni (ad esempio, Jackson o simili), vaniglia Gradle progetto.

  4. 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>; }

Lascia un commento