Evite que la clase se contraiga
En mi aplicación para Android tengo una clase DbHelper
que extiende OrmLiteSqliteOpenHelper
que extiende SQLiteOpenHelper
. Ejecutar ProGuard en proyecto se completa correctamente, pero más tarde en tiempo de ejecución estoy recibiendo un error: java.lang.NoClassDefFoundError: com.example.myapp.mypackage.DbHelper
Me han añadido -keep class com.example.myapp.mypackage.** { *; }
-keep class com.example.myapp.mypackage.** { *; }
En proguard-project.txt
para excluir mi DbHelper
de encogimiento, pero esto no ayuda.
- ¿Cómo decirle a ProGuard que ofusque métodos y nombres de clase?
- ¿Cómo puedo excluir .jar externa de obfuscation por Proguard (proyecto de Android)?
- Cómo ofuscar mi proyecto android en IDE eclipse?
- Android Progaurd - Problema de conectividad a Internet después de exportar la aplicación
- Ofuscación de Proguard y métodos genéricos
También he intentado añadir -dontshrink
bandera, sólo para la prueba, para desactivar el paso de encogimiento, pero esto no ayuda demasiado.
¿Alguna sugerencia de lo que hago mal y qué probar? Gracias
UPD: Full stacktrace
E/AndroidRuntime: FATAL EXCEPTION: main java.lang.NoClassDefFoundError: com.example.myapp.mypackage.DbHelper at com.example.myapp.App.onCreate(App.java:78) at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1000) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4391) at android.app.ActivityThread.access$1300(ActivityThread.java:141) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1294) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:5041) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) at dalvik.system.NativeStart.main(Native Method)
UPD 2: Para OrmLite estoy usando esta configuración
-keep class com.j256.** -keepclassmembers class com.j256.** { *; } -keep enum com.j256.** -keepclassmembers enum com.j256.** { *; } -keep interface com.j256.** -keepclassmembers interface com.j256.** { *; }
UPD 3: Estoy intentado undex classes.dex
de proguarded apk con la herramienta dex2jar
y mi DbHelper existe exactamente donde debería ser
UPD 4: No, esto no es aplicación de prueba, esta es la aplicación android habitual
UPD 5: Sí, DbHelper
utilizar algún tipo de cosas del paquete de soporte y en las clases proguarded apk del paquete de suppord se pierde. En proguard-project.txt
Tengo esta configuración para el paquete de soporte y barra de acción Sherlock
-keep class android.support.v4.app.** { *; } -keep interface android.support.v4.app.** { *; } -keep class com.actionbarsherlock.** { *; } -keep interface com.actionbarsherlock.** { *; }
¿Cómo puedo configurar correctamente ProGuard para evitar que el paquete de soporte se contraiga?
- ¿Cómo puedo comprobar / actualizar la versión Proguard cuando lo utilizo en Eclipse para el desarrollo de Android?
- Android: proguard obfuscating problema
- conflicto entre ksoap2 y actionbarscherlock usando Proguard
- Uso de ProGuard con Android
- ¿Proguard mantiene nombres de clase?
- ProGuard - ¿Cómo mantener los métodos y obfuscate ellos al mismo tiempo?
- Cómo usar proguard en android 2.3
- Android Proguard ExceptionInInitializerError y RuntimeException
Muchas gracias a @gunar por ayuda. He resuelto el problema, la razón es que proguard-project.txt
paquete de soporte en proguard-project.txt
como -libraryjars
no como -injars
. Por lo tanto su contenido no se empaquetó en apk resultante y dalvik no puede inicializar DbHelper en tiempo de ejecución que utiliza clases de paquete de soporte