在 Android 上使用 OrmLite 进行 Proguard

Posted

技术标签:

【中文标题】在 Android 上使用 OrmLite 进行 Proguard【英文标题】:Proguard with OrmLite on Android 【发布时间】:2012-04-08 19:59:57 【问题描述】:

我应该如何在 android 上将 proguard 与 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.**

但我明白了:

03-23 20:23:54.518: E/AndroidRuntime(3032): java.lang.RuntimeException: 无法启动活动 ComponentInfocz.eman.android.cepro/cz.eman.android.cepro.activity.StationsOverviewActivity : java.lang.IllegalStateException: 找不到为帮助类类 kb 接受 Context 参数的构造函数

我也尝试添加这个:

-keepclassmembers class *  public <init>(android.content.​Context); 

但是我得到了另一个班级成员的错误。

【问题讨论】:

我的回答有帮助吗?如果是这样,请接受它。如果不是,请提供您自己的答案。 找到答案请贴出来或标记为正确答案可以帮助其他人找到答案 你最终是如何解决这个问题的? 我通过执行以下所有操作(来自 Gray 和 German 的答案)来修复它,之后我还必须在我的 proguard 中添加我所有的数据库内容对象(带有一个或多个 @DatabaseField)像这样配置: -keep class com.myapp.model.** -keepclassmembers class com.myapp.model.** *; 坦白你救了我的生命…… 【参考方案1】:

最新版本 OrmLite 5 的一个小补充。

您可能希望添加这些行以隐藏一些新警告:

-dontwarn com.j256.ormlite.android.**
-dontwarn com.j256.ormlite.logger.**
-dontwarn com.j256.ormlite.misc.**

警告如下:

警告:com.j256.ormlite.android.OrmliteTransactionalProcessor:不能 查找引用的类 javax.lang.model.SourceVersion

警告:com.j256.ormlite.logger.Slf4jLoggingLog:找不到引用 类 org.slf4j.LoggerFactory

警告:com.j256.ormlite.misc.JavaxPersistenceImpl:找不到 引用类 javax.persistence.Column

【讨论】:

【参考方案2】:

除了反射所需的默认值:

# OrmLite uses reflection
-keep class com.j256.**
-keepclassmembers class com.j256.**  *; 
-keep enum com.j256.**
-keepclassmembers enum com.j256.**  *; 
-keep interface com.j256.**
-keepclassmembers interface com.j256.**  *; 

我需要保留我所有的实体类:

-keep class com.example.db.Entities.**  *; 

否则实体类将被剥离。 我使用预定义的数据库(之前生成的)。

是否有更简单/更好的混淆方式。可能是我上的课太多了?

【讨论】:

【参考方案3】:

就我而言,这成功了:

-keepattributes SourceFile,LineNumberTable,Signature,InnerClasses,*Annotation*

-keepclassmembers class * public <init>(android.content.Context);
-keep class com.j256.**  *; 

带有混淆和优化。

【讨论】:

【参考方案4】:

接受的答案对我的情况来说还不够,所以我对其进行了改进,这就是我最终得到的结果:

# OrmLite uses reflection
-keep class com.j256.**
-keepclassmembers class com.j256.**  *; 
-keep enum com.j256.**
-keepclassmembers enum com.j256.**  *; 
-keep interface com.j256.**
-keepclassmembers interface com.j256.**  *; 

# Keep the helper class and its constructor
-keep class * extends com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper
-keepclassmembers class * extends com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper 
  public <init>(android.content.Context);


# Keep the annotations
-keepattributes *Annotation*

# Keep all model classes that are used by OrmLite
# Also keep their field names and the constructor
-keep @com.j256.ormlite.table.DatabaseTable class * 
    @com.j256.ormlite.field.DatabaseField <fields>;
    @com.j256.ormlite.field.ForeignCollectionField <fields>;
    # Add the ormlite field annotations that your model uses here
    <init>();

【讨论】:

经过大量搜索,这是唯一对我有用的答案。我有“IllegalArgumentException:外部字段类 x 没有 id 字段”,我认为最后一个保留块解决了它。谢谢。 另外一行修复了我在尝试创建签名 apk 时出现的错误: -dontwarn com.j256.ormlite.android.** with the latest 'com.j256.ormlite:ormlite-android:5.0 ',因为 com.j256.ormlite.android.OrmliteTransactionalProcessor 扩展了处理器。 对于 ORMLite 5.0 我必须添加 -dontwarn com.j256.ormlite.android.** -dontwarn com.j256.ormlite.logger.** -dontwarn com.j256.ormlite.misc.** 这是唯一一个对我有用的,虽然另外我必须将所有 com.j256.** 转换为 com.j256** (即删除点)否则我得到一个'未解析的类名'红色下划线(Android Studio 4.1.2)【参考方案5】:

对上述配置的一个小补充 - 如果您尝试通过 ORMLite 序列化/反序列化 Joda 的 DateTime 对象,您可能还需要这个:

-keepclassmembers class **DateTime 
    <init>(long);
    long getMillis();

...因为 ORMLite 的 DateTimeType 通过反射完成所有工作。

【讨论】:

谢谢托马斯,有趣的是我从你这里找到了我正在寻找的答案:) 呵呵 :) 而且我这里也不太活跃。【参考方案6】:

我没有解决方案,但这里有一些参考资料可以提供帮助:

Proguard support request around ORMLite ORMLite proguard discussion #1 ORMLite proguard discussion #2

你可能错过了:

-keepclassmembers class *  
  public <init>(android.content.Context); 
 

和/或

-keepattributes *Annotation*

【讨论】:

-keepclassmembers class * extends com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper public &lt;init&gt;(android.content.Context); 【参考方案7】:

非常感谢您提供这样的帖子,帮助我们一步一步地前进。

在我尝试了最后一个但没有成功后,我想出了其他解决方案:

# OrmLite uses reflection
-keep class com.j256.**
-keepclassmembers class com.j256.**  *; 
-keep enum com.j256.**
-keepclassmembers enum com.j256.**  *; 
-keep interface com.j256.**
-keepclassmembers interface com.j256.**  *; 

我希望它可以帮助某人。

【讨论】:

对我来说还不够......它会抛出类似这样的内容:Field class java.lang.String for field FieldType:name=b,class=Location 对于数据持久性 com.j256 无效。 ormlite.field.types.DateLongType@20f95c38 只为您的 orm 助手类保留构造函数:-keepclassmembers class * extends com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper public &lt;init&gt;(android.content.Context); 保留数据库类(使用 DatabaseTable):-keep @com.j256.ormlite.field.* public class * 将 DB 字段保留在 DB 类中:-keepclassmembers class * @com.j256.ormlite.field. *; 【参考方案8】:

我想出了这样的解决方案(也许也适用于某人)。

proguard.cfg进行了这样的更改:

添加了-dontobfuscate选项

,!code/allocation/variable 附加到-optimization 选项

使用这种配置的 APK 文件大小从 580 kB 减少到 250 kB。

但是,没有进行混淆。

【讨论】:

以上是关于在 Android 上使用 OrmLite 进行 Proguard的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在带有 h2 或 sybase 数据库的 android 上使用 ormlite?

使用从Jackson创建的对象在Android上使用OrmLite保存子集合

android OrmLite 入门

Android平台下使用ormLite的一个小Tip

如何在 android 中使用 ProGuard 和 OrmLite

在 CursorAdapter 中使用带有 ORMLite 的 Android 游标