我有一个应用程序,使用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
Column
和Table
不是现有的java类文件属性。你至少需要指定
-keepattributes *Annotation*
病死率。
2013年3月,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*'
如果你在一个普通的Gradle项目中使用JSON序列化注释(例如,Jackson或类似的),这是特别有用的
这就是我的例子:
-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>; }