使用Proguard模糊ORMLite模型类

时间:2013-11-03 12:42:25

标签: android proguard ormlite

我想在我的代码中混淆一些模型。 我知道我可以忽略整个模型包但我不想这样做。 我尝试了一些proguard调整并检查所有相关的帖子无济于事。 ORMlite不断投掷java.lang.RuntimeException: Unable to create application ...App: java.lang.IllegalArgumentException: Foreign field class ....f.p does not have id field。我检查了注释仍然在dex2jarjd,并且它仍在那里。

我有这个proguard配置(以及更多混淆其他部分的内容):

积极的东西:

-mergeinterfacesaggressively
-allowaccessmodification
-optimizationpasses 5

-verbose
-dontskipnonpubliclibraryclasses
-dontpreverify
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

保留各种框架所需的信息:

-keepattributes *Annotation*
-keepattributes Signature
-keepattributes EnclosingMethod

ORMLITE相关:

-keep class com.j256.**
-keepclassmembers class com.j256.** { *; }
-keep enum com.j256.**
-keepclassmembers enum com.j256.** { *; }
-keep interface com.j256.**
-keepclassmembers interface com.j256.** { *; }

我错过了什么或者这是不可能的吗?

2 个答案:

答案 0 :(得分:5)

由于ORMLite使用反射来保存或保留您的数据,因此他们需要未混淆的实体名称(即您用来保存或保留数据的类)。

抛出此异常是因为ORMLite正在尝试为其表找到Entity类,并且无法找到具有相似名称的类和成员。

使用以下代码忽略您的实体类被混淆:

-keep class com.xyz.components.**
-keepclassmembers class com.xyz.components.** { *; } 

其中com.xyz.components是实体类的包。

我希望这有帮助!

答案 1 :(得分:0)

除了Vivek Soneja's answer: 有一种方法可以使实体类独立于其包而独立:

-keep @com.j256.ormlite.table.DatabaseTable class * {
  @com.j256.ormlite.field.DatabaseField <fields>;
  @com.j256.ormlite.field.ForeignCollectionField <fields>;
  <init>();
}

它将保留所有DatabaseTable带注释的类以及它们的DatabaseFieldForeignCollectionField带注释的字段

相关问题