在Android上使用OrmLite的Proguard

时间:2012-03-24 15:55:08

标签: android optimization obfuscation proguard ormlite

我应该如何在Android上使用带有ormlite库的proguard?

试试这个:

-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.StationsOverviewActivity }:java.lang.IllegalStateException:找不到为辅助类类kb接受Context参数的构造函数

我也尝试添加这个:

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

但我得到了另一个班级错误。

8 个答案:

答案 0 :(得分:40)

非常感谢你这样的帖子,这些帖子可以帮助我们一步步推进。

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

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

我希望它可以帮助别人。

答案 1 :(得分:15)

我没有解决方案,但这里有几个参考帮助:

你可能会失踪:

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

和/或

-keepattributes *Annotation*

答案 2 :(得分:15)

对于我的案例,接受的答案是不够的,所以我加强了它,这就是我最终的结果:

# 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>();
}

答案 3 :(得分:3)

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

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

...因为ORMLite DateTimeType通过反思完成所有事情。

答案 4 :(得分:1)

另外还有反射所需的默认值:

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

否则实体类将被删除。 我使用预定义的DB(之前生成的)。

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

答案 5 :(得分:0)

就我而言,这就是诀窍:

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

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

有了观察和优化。

答案 6 :(得分:0)

最新版 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:找不到引用   class org.slf4j.LoggerFactory

     

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

答案 7 :(得分:-2)

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

proguard.cfg进行了此类更改:

  • 添加了-dontobfuscate选项

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

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

但是,没有进行混淆。