Proguard con OrmLite en Android

¿Cómo debo usar proguard con la biblioteca ormlite en Android?

Probando esto

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

Pero entiendo:

03-23 ​​20: 23: 54.518: E / AndroidRuntime (3032): java.lang.RuntimeException: no se puede iniciar la actividad ComponentInfo {cz.eman.android.cepro / cz.eman.android.cepro.activity.StationsOverviewActivity}: java .lang.IllegalStateException: no se pudo encontrar el constructor que toma un argumento de contexto para la clase de clase auxiliar kb

También traté de agregar esto:

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

Pero tengo otros errores de clase.

Muchas gracias por publicaciones como esta que nos ayudan a avanzar paso a paso.

He encontrado otra solución después de haber probado la última sin éxito:

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

Espero que pueda ayudar a alguien.

No tengo la solución pero aquí hay un par de referencias para ayudar:

  • Solicitud de soporte Proguard alrededor de ORMLite
  • Discusión de Proguard ORLite # 1
  • ORMLite discusión proguard # 2

Usted puede estar perdido:

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

y / o

 -keepattributes *Annotation* 

La respuesta aceptada no fue suficiente para mi caso, así que la mejoré y esto es con lo que terminé:

 # 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 (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 ; @com.j256.ormlite.field.ForeignCollectionField ; # Add the ormlite field annotations that your model uses here (); } 

Una pequeña adición a la configuración anterior: si está tratando de serializar / deserializar los objetos DateTime de Joda a través de ORMLite, probablemente también necesite esto:

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

… ya que DateTimeType de ORMLite hace todo a través de la reflexión.

Además del valor por defecto necesario para la reflexión:

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

Necesitaba mantener todas mis clases de Entidad:

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

De lo contrario, las clases de entidad se eliminan. Yo uso DB predefinido (generado anteriormente).

¿Hay una manera más fácil / mejor de ofuscar? Tal vez estoy manteniendo demasiadas clases?

En mi caso, esto funcionó:

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

y

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

Con obstrucción y optimizaciones.

Una pequeña adición para la última versión de OrmLite 5 .

Es posible que desee agregar estas filas para ocultar algunas advertencias nuevas:

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

Las advertencias son como estas:

Advertencia: com.j256.ormlite.android.OrmliteTransactionalProcessor: no se puede encontrar la clase referenciada javax.lang.model.SourceVersion

Advertencia: com.j256.ormlite.logger.Slf4jLoggingLog: no se puede encontrar la clase referenciada org.slf4j.LoggerFactory

Advertencia: com.j256.ormlite.misc.JavaxPersistenceImpl: no se puede encontrar la clase referenciada javax.persistence.Column

He encontrado una solución así (quizás también funcione para alguien).

Hicieron tales cambios en proguard.cfg :

  • Se -dontobfuscate opción -dontobfuscate

  • -optimization ,!code/allocation/variable to -optimization option

Tamaño del archivo APK con dicha configuración reducida de 580 kB a 250 kB.

Sin embargo, no se ofusca.