web-dev-qa-db-ja.com

Proguardとアノテーション

アノテーションに依存するデータベースORMライブラリであるActiveAndroidを使用するアプリがあります。

@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
24
Peterdk

ColumnTableは存在しませんJavaクラスファイル属性。少なくとも指定する必要があります

-keepattributes *Annotation*

Cfr。 ProGuardマニュアル

35
Eric Lafortune

2013年3月、 Proguardバージョン4.9がリリースされました 、修正の1つは次のとおりです。

Fixed overly aggressive shrinking of class annotations. 

したがって、Proguardのバージョンが最新であることを確認してから、EricLafortuneのソリューションを使用してください。

-keepattributes *Annotation*

この構成を使用して、特定の注釈を持つすべてのクラスメンバーを格納することもできます。

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

解決策は、ライブラリとデータベースクラスのすべてのメンバーを保持することでした

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

Gradleのみを使用している場合、解決策は非常に似ています(注釈の周りの一重引用符に注意してください)。

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

keepattributes '*Annotation*'

これは、Vanilla GradleプロジェクトでJSONシリアル化アノテーション(Jacksonなど)を使用している場合に特に便利です。

2
John S.

これは私の場合はうまくいきました:

-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>; }
1
Hamzeh Soboh