Proguard vs Аннотации - PullRequest
       17

Proguard vs Аннотации

24 голосов
/ 11 сентября 2011

У меня есть приложение, которое использует ActiveAndroid, библиотеку ORM базы данных, которая опирается на аннотации.

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

}

Как заставить Proguard работать с этим хорошо? В настоящее время я получаю ошибки о том, что ActiveAndroid не находит имя столбца при использовании Proguard. Я думаю, это как-то искажает аннотацию.

Моя соответствующая конфигурация Proguard:

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

Ответы [ 5 ]

35 голосов
/ 18 сентября 2011

Column и Table не являются существующими атрибутами файла класса Java.Вам, по крайней мере, придется указать

-keepattributes *Annotation*

Cfr. Руководство ProGuard .

16 голосов
/ 25 сентября 2013

В марте 2013 года была выпущена Proguard версии 4.9 , одно из исправлений:

Fixed overly aggressive shrinking of class annotations. 

Поэтому убедитесь, что ваша версия Proguard обновлена, а затем используйте Эрика Лафортуна.решение:

-keepattributes *Annotation*

Вы также можете использовать эту конфигурацию для хранения всех членов класса, которые имеют конкретную аннотацию:

-keepclassmembers class * {
    @fully.qualified.package.AnnotationType *;
}
6 голосов
/ 15 сентября 2011

Решением было сохранить всех членов библиотеки и классов базы данных

-keep class com.activeandroid.**
{
     *;
}
-keep public class my.app.database.**
{
    *;
}
-keepattributes Column
-keepattributes Table
2 голосов
/ 17 июня 2014

Для тех, кто использует только Gradle, решение очень похоже (обратите внимание на одинарные кавычки вокруг аннотации):

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

keepattributes '*Annotation*'

Это особенно полезно, если вы используете аннотации сериализации JSON (например, Джексона или тому подобное) в ванильном проекте Gradle.

0 голосов
/ 23 декабря 2017

Вот что сработало в моем случае:

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