Подтвердить что ты не робот

Proguard vs Аннотации

У меня есть приложение, которое использует 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
4b9b3361

Ответ 1

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

-keepattributes *Annotation*

ЧФР. Руководство ProGuard.

Ответ 2

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

Fixed overly aggressive shrinking of class annotations. 

Поэтому убедитесь, что ваша версия Proguard обновлена, а затем используйте решение Eric Lafortune:

-keepattributes *Annotation*

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

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

Ответ 3

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

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

Ответ 4

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

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

keepattributes '*Annotation*'

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

Ответ 5

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

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