Proguard with OrmLite on Android

2020-01-24 21:37发布

How should I use proguard with ormlite library on Android?

Trying this:

-keep class com.j256.**
-keepclassmembers class com.j256.**
-keep enum com.j256.**
-keepclassmembers enum com.j256.**
-keep interface com.j256.**
-keepclassmembers interface com.j256.**

But I get:

03-23 20:23:54.518: E/AndroidRuntime(3032): java.lang.RuntimeException: Unable to start activity ComponentInfo{cz.eman.android.cepro/cz.eman.android.cepro.activity.StationsOverviewActivity}: java.lang.IllegalStateException: Could not find constructor that takes a Context argument for helper class class kb

I also tried to add this:

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

But I get another classmembers errors.

8条回答
该账号已被封号
2楼-- · 2020-01-24 21:47

In addittion to default necessary for reflection:

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

I needed to keep all my Entity classes:

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

Otherwise entity classes are stripped out. I use predefined DB(generated earlier).

Is there an easier/better way to obfuscate. Maybe I'm keeping too many classes?

查看更多
唯我独甜
3楼-- · 2020-01-24 21:52

A small addition for the latest version OrmLite 5.

You may want to add these rows to hide some new warnings:

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

Warnings are like these:

Warning:com.j256.ormlite.android.OrmliteTransactionalProcessor: can't find referenced class javax.lang.model.SourceVersion

Warning:com.j256.ormlite.logger.Slf4jLoggingLog: can't find referenced class org.slf4j.LoggerFactory

Warning:com.j256.ormlite.misc.JavaxPersistenceImpl: can't find referenced class javax.persistence.Column

查看更多
孤傲高冷的网名
4楼-- · 2020-01-24 21:58

The accepted answer was not enough for my case, so I enhanced it and this is what I ended up with:

# 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>();
}
查看更多
我只想做你的唯一
5楼-- · 2020-01-24 22:02

I don't have the solution but here are a couple of references to help:

You may be missing:

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

and/or

-keepattributes *Annotation*
查看更多
来,给爷笑一个
6楼-- · 2020-01-24 22:03

In my case this did the trick:

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

and

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

With obfucation and optimizations.

查看更多
疯言疯语
7楼-- · 2020-01-24 22:10

Thank you a lot for posts like this that help us to advance step by step.

I've came up with other solution after i have tried the last one without success:

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

I hope it can help someone.

查看更多
登录 后发表回答