android optimization obfuscation proguard ormlite

Proguard con OrmLite en Android



optimization obfuscation (8)

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?

¿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 <init>(android.content.​Context); }

Pero tengo otros errores de clase.


En mi caso, esto funcionó:

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

y

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

Con obstrucción y optimizaciones.


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.


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


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.



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 { <init>(long); long getMillis(); }

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


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