我有一个使用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与之合作得很好?目前,我在使用Proguard时遇到ActiveAndroid没有找到列名的错误。我想它会以某种方式破坏注释。
我的相关Proguard配置:
#ActiveAndroid
-keep public class com.activeandroid.**
-keep public class * extends com.activeandroid.ActiveRecordBase
-keepattributes Column
-keepattributes Table
答案 0 :(得分:35)
答案 1 :(得分:16)
2013年3月,Proguard version 4.9 was released,其中一个修正案是:
Fixed overly aggressive shrinking of class annotations.
因此,请确保您的Proguard版本是最新的,然后使用Eric Lafortune的解决方案:
-keepattributes *Annotation*
您还可以使用此配置来存储具有特定注释的所有类成员:
-keepclassmembers class * {
@fully.qualified.package.AnnotationType *;
}
答案 2 :(得分:6)
解决方案是保留库的所有成员和数据库类
-keep class com.activeandroid.**
{
*;
}
-keep public class my.app.database.**
{
*;
}
-keepattributes Column
-keepattributes Table
答案 3 :(得分:2)
对于那些只使用Gradle的人来说,解决方案非常相似(请注意Annotation周围的单引号):
keep 'public class java.package.** { *; }'
keepattributes '*Annotation*'
如果您在vanilla Gradle项目中使用JSON序列化注释(例如,杰克逊等),这将非常有用。
答案 4 :(得分:0)
这对我的情况有用:
-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>; }