proguard with ormlite on Android

Android开发中ormlite混淆

ormlite官网上没有找到proguard相关的配置说明,在stackoverflow上找到了如下配置:

1
2
3
4
5
6
7
8
9
# 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.** { *; }
-keepattributes *Annotation*

能正式打包通过,但是在运行时会报一个异常:

1
no fields have a databasefield annotation in class <com.package.myclass>

原因是我的数据库表bo类中使用了ormlite的 @DatabaseField注解;这个异常能通过下面这一句

1
-keepclassmembers class com.package.bo.** { *; }

来忽略混淆bo包下的所有类的类成员,但是有时候这不是一个最好的方法因为bo包下有可能还有一些非数据库使用的bo类或者其他类。

最后,我从Proguard手册中找到了下面这个方法,可以仅忽略混淆使用了DatabaseField注解的类成员。

1
2
3
-keepclassmembers class * {
@com.j256.ormlite.field.DatabaseField *;
}

自此ormlite相关的proguard就正常了,在此做个记录。

另外如果程序里使用到了泛型,或许可能需要下面这一句
-keepattributes Signature
不混淆泛型

最后附上Proguard手册地址,传送门