在 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 <init>(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 <init>(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保存子集合