Android上带有OrmLite的Proguard

Android上带有OrmLite的Proguard,android,optimization,obfuscation,proguard,ormlite,Android,Optimization,Obfuscation,Proguard,Ormlite,我应该如何在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

我应该如何在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:无法启动活动ComponentInfo{cz.eman.android.cepro/cz.eman.android.cepro.activity.StationOverviewActivity}:java.lang.IllegalStateException:找不到为helper类kb使用上下文参数的构造函数

我还试图补充这一点:

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

-keepclassmembers类*{public(android.content)。​上下文);}

但是我遇到了另一个classmembers错误。

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

您可能缺少:

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

我已经想出了这样的解决方案(也许对某些人也有用)

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

  • 添加了
    -dontobfuscate
    选项

  • 追加
    ,!代码/分配/变量
    -优化
    选项

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


不过,没有进行任何混淆。

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

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

# 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.** { *; }

我希望它能帮助一些人。

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

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

-keepclassmembers类**DateTime{
(长);
long getMillis();
}

…由于ORMLite的
DateTimeType
通过反射完成所有操作。

接受的答案不足以满足我的情况,因此我对其进行了增强,这就是我最终得到的结果:

# 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>();
}
#OrmLite使用反射
-保持类com.j256**
-keepclassmembers类com.j256.*{*;}
-保留enum com.j256**
-keepclassmembers enum com.j256.*{*;}
-保留com.j256接口**
-keepclassmembers接口com.j256.*{*;}
#保留helper类及其构造函数
-keep class*扩展com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper
-keepclassmembers类*扩展com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper{
public(android.content.Context);
}
#保留注释
-keepattributes*注释*
#保留OrmLite使用的所有模型类
#还要保留它们的字段名和构造函数
-keep@com.j256.ormlite.table.DatabaseTable类*{
@com.j256.ormlite.field.DatabaseField;
@com.j256.ormlite.field.ForeignCollectionField;
#在此处添加模型使用的ormlite字段注释
();
}

在我的例子中,这就成功了:

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


-keepclassmembers类*{public(android.content.Context);}
-保持类com.j256.*{*;}

具有目标和优化功能。

除了反射所需的默认值之外:

# 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.** { *; }
否则将剥离实体类。 我使用预定义的数据库(先前生成)


是否有更容易/更好的方法来混淆。也许我的课程太多了?

对于最新版本的或MLite 5来说,这是一个小小的增加

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

-dontwarn com.j256.ormlite.android.**
-dontwarn com.j256.ormlite.logger.**
-dontwarn com.j256.ormlite.misc.**
警告如下:

警告:com.j256.ormlite.android.ormliteransactionalprocessor:无法 查找引用的类javax.lang.model.SourceVersion

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

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


我的回答有帮助吗,伙计?如果是,请接受。如果没有,请提供您自己的答案。如果您已经找到答案,请发布答案,或者将答案标记为正确。这可以帮助其他人找到答案。您最终如何解决此问题?我通过执行以下所有操作(灰色和德文答案)解决了此问题,之后,我还必须添加所有数据库内容对象(使用一个或多个@DatabaseField)在我的proguard配置中如下:-keep class com.myapp.model.*-keepclassmembers class com.myapp.model.*{*;}frank u保存了我的lifeeeee…对我来说还不够…它抛出如下内容:Field类java.lang.String for FieldType:name=b,class=Location对于数据持久器com.j256.ormlite.Field.types无效。DateLongType@20f95c38Thanks托马斯,有趣的是,我从你这里找到了我一直在寻找的答案:)呵呵:)我在这里甚至都不太活跃。经过大量的搜索,这是唯一对我有效的答案。我有“IllegalArgumentException:外部字段类x没有id字段”,我想最后一个keep块解决了这个问题。谢谢。另外一行修复了我在尝试创建签名apk时出现的错误是:-dontwarn com.j256.ormlite.android.**使用最新的“com.j256.ormlite:ormlite android:5.0”,因为com.j256.ormlite.android.ormliteransactionalProcessor扩展了处理器。对于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)
-keepclassmembers类*扩展com.j256.ormlite.Android.apptools.OrmLiteSqliteOpenHelper{public(Android.content.Context);}
-keep class com.example.db.Entities.** { *; }
-dontwarn com.j256.ormlite.android.**
-dontwarn com.j256.ormlite.logger.**
-dontwarn com.j256.ormlite.misc.**