Ответ 1
Column
и Table
не существуют атрибуты файла java-класса. Вы, по крайней мере, должны указать
-keepattributes *Annotation*
ЧФР. Руководство ProGuard.
У меня есть приложение, которое использует 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
Column
и Table
не существуют атрибуты файла java-класса. Вы, по крайней мере, должны указать
-keepattributes *Annotation*
ЧФР. Руководство ProGuard.
В марте 2013 года была выпущена версия Proguard версии 4.9, одна из исправлений:
Fixed overly aggressive shrinking of class annotations.
Поэтому убедитесь, что ваша версия Proguard обновлена, а затем используйте решение Eric Lafortune:
-keepattributes *Annotation*
Вы также можете использовать эту конфигурацию для хранения всех членов класса с определенной аннотацией:
-keepclassmembers class * {
@fully.qualified.package.AnnotationType *;
}
Решение состояло в том, чтобы сохранить всех членов библиотеки и классов базы данных
-keep class com.activeandroid.**
{
*;
}
-keep public class my.app.database.**
{
*;
}
-keepattributes Column
-keepattributes Table
Для тех, кто использует только Gradle, решение очень похоже (обратите внимание на одинарные кавычки вокруг аннотации):
keep 'public class java.package.** { *; }'
keepattributes '*Annotation*'
Это особенно полезно, если вы используете аннотации сериализации JSON (например, Jackson или т.п.) в проекте vanilla Gradle.
Это то, что сработало в моем случае:
-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>; }