2012-03-24 13 views
21

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

Intentar 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 me sale:

03-23 ​​20: 23: 54.518: E/Android Runtime (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 constructor que toma un argumento Contexto de la clase kb clase de ayuda

También traté de añadir lo siguiente:

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

Pero conseguir otro classmembers errores.

+1

que hizo mi respuesta ayuda tio? Si es así, por favor, acéptelo. Si no, por favor, brinde su propia respuesta. – Gray

+1

por favor publique la respuesta si ha encontrado o marque las respuestas como correctas Puede ayudar a otros a encontrar la respuesta –

+0

¿cómo solucionó esto eventualmente? – Frank

Respuesta

39

Muchas gracias por mensajes como este que nos ayudan a avanzar paso a paso.

he se le ocurrió otra solución después he intentado el último 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.

+0

No es suficiente para mí ... arroja algo como esto: Clase de campo java.lang.String para el campo FieldType: name = b, class = La ubicación no es válida para persistencia de datos com.j256.ormlite.field .types.DateLongType @ 20f95c38 –

-2

He ocurrió con tal solución (tal vez va a trabajar para alguien también).

introduzcan cambios en proguard.cfg:

  • Agregado -dontobfuscate opción de tamaño

  • como apéndice ,!code/allocation/variable a -optimization opción

archivo APK utilizando dicha configuración reducido de 580 KB a 250 KB .

Aunque no se produce ninguna ofuscación.

3

Una pequeña adición a la configuración anterior - si usted está tratando de serializar/deserializar objetos de DateTime Joda a través ORMLite, es probable que tenga esto también:

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

... desde DateTimeType de ORMLite hace todo a través reflexión.

+0

Gracias Thomas, es curioso que encontré la respuesta que estaba buscando aquí :) – Tino

+0

Hehe :) Y ni siquiera estoy demasiado activo aquí. –

12

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

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

Después de muchas búsquedas, esta fue la única respuesta que funcionó para mí. Tuve "IllegalArgumentException: la clase de campo extranjera x no tiene campo de Id." Y creo que el último bloque de mantenimiento lo resolvió. Gracias. – bradkratky

+0

Y una línea adicional solucionó mi error al intentar crear una aplicación firmada es: -dontwarn com.j256.ormlite.android. ** con la más reciente 'com.j256.ormlite: ormlite-android: 5.0', porque com.j256. ormlite.android.OrmliteTransactionalProcessor extiende el procesador. –

+4

Para ORMLite 5.0 Tuve que agregar '-dontwarn com.j256.ormlite.android. **' '-dontwarn com.j256.ormlite.logger. **' '-dontwarn com.j256.ormlite.misc. ** ' – Diederik

0

En mi caso esto hizo el truco:

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

y

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

Con obstrucción y optimizaciones.

1

Además de todas DEFAULT necesaria 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.** { *; } 

que necesitaba para mantener todas mis clases de entidades:

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

De lo contrario, las clases de entidad son despojados a cabo. Uso DB predefinido (generado anteriormente).

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

0

Una pequeña adición para la última versión OrmLite 5. No puede:

Es posible que desee añadir estas filas para ocultar algunas nuevas advertencias:

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

advertencias son como éstos:

Advertencia: com.j256.ormlite.android.OrmliteTransactionalProcessor encontrar javax.lang.model.SourceVersion clase referenciada

Advertencia: com.j256.ormlite.logger.Slf4jLoggingLog: no se encuentra referenciada org.slf4j.Logg clase erFactory

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