6

我有一些模型要在我的代码中进行混淆处理。我知道我可以忽略整个模型包,但我不想这样做。我尝试了一些 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.** { *; }

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

4

2 回答 2

5

由于 ORMLite 使用反射来保存或保留您的数据,他们希望实体的名称不混淆(即您用来保存或保留数据的类)。

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

只需使用以下代码忽略您的实体类就不会被混淆:

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

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

我希望这有帮助!

于 2013-11-03T13:28:48.097 回答
1

除了Vivek Soneja 的回答:还有一种方法可以让实体类独立于它们的包:

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

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

于 2019-04-01T19:33:55.943 回答