Proguard vs Annotations



我有一个应用程序,使用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

ColumnTable不是现有的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>; }

相关内容

  • 没有找到相关文章

最新更新