2011-12-06 14 views
19

después de recorrer todo tipo de consultas relacionadas con problemas con ofuscación usando Proguard, he llegado al punto en el que siento que podría ser solo teniendo este particular problema. Por lo tanto, la publicación.Error al trabajar con la biblioteca de Jackson después de la ofuscación usando Proguard

Tengo una aplicación de Android bastante estándar que hace uso de llamadas REST basadas en JSON para intercambiar datos. Hago uso de la biblioteca Jackson para analizar los datos JSON. Todo había funcionado a la perfección, hasta que decidimos incorporar ofuscación para nuestras versiones de lanzamiento usando Proguard. Después de resolver un mundo de problemas relacionados con la devolución de llamadas, finalmente me encuentro con un problema relacionado con la biblioteca de Jackson.

básicamente, la línea ObjectMapper om = new ObjectMapper() - simplemente no funciona! Sigo recibiendo el siguiente error en esa línea:

Caused by: java.lang.ExceptionInInitializerError 
    at org.codehaus.jackson.map.ObjectMapper.<clinit>(Unknown Source) 
    ... 8 more 
Caused by: java.lang.NullPointerException 
    at org.codehaus.jackson.map.introspect.VisibilityChecker$Std.<init>(Unknown Source) 
    at org.codehaus.jackson.map.introspect.VisibilityChecker$Std.<clinit>(Unknown Source) 
    ... 9 more 

Después de leer una serie de otros mensajes relacionados con bibliotecas externas incluyendo, haciendo caso omiso de Proguard las clases de biblioteca Jackson, el encendido y apagado de optimización y reducción de banderas, estoy simplemente despistado en este momento.

Las diversas cosas que he incluido en mi archivo proguard.cfg por el amor de Jackson -

-dontskipnonpubliclibraryclassmembers 
-dontoptimize 
-dontshrink 
-libraryjars xtraLibs/joda-time-1.6.2.jar;xtraLibs/xml-apis.jar;xtraLibs/jsr311-api-0.8.jar;xtraLibs/stax2-api-3.0.0.jar;xtraLibs/httpmime-4.0.1.jar 

entre éstos, he alternar las banderas y dontoptimizedontshrink. Sin embargo, el resultado siempre ha sido el mismo.

En todo el tiempo que he dedicado a tratar de resolver este problema, me he sorprendido y asombrado por el tipo de esfuerzo invertido en la biblioteca de Proguard. Es solo que cuando las cosas no funcionan, son un poco ofuscado.

versión Proguard - 4,6

Respuesta

38

No es obvio a partir de la traza de la pila, pero Jackson necesita algunas anotaciones, que ProGuard elimina por defecto. Cfr. Manual ProGuard> Ejemplos>Processing annotations:

-keepattributes *Annotation*,EnclosingMethod 

Además, como el nombre del paquete de mal agüero 'org.codehaus.jackson.map.introspect' sugiere, Jackson realiza la introspección de las clases analizadas para encontrar captadores y definidores. Sin saber nada mejor, ProGuard puede eliminarlos o renombrarlos, porque es posible que su código no los use explícitamente. Puede que tenga que guardarlos de forma explícita, por ejemplo:

-keep public class mydatapackage.** { 
    public void set*(***); 
    public *** get*(); 
} 
+5

eric lafortune - ¡muchas gracias **! para cualquier otra persona que enfrenta esta situación, busque la solución de toda la cadena de correo en el foro de sourceforge - https://sourceforge.net/projects/proguard/forums/forum/182456/topic/4867948/index/page/1 – anirvan

+22

Con Jackson 2.1.4 los necesitaba además de los atributos anteriores: '-keepattributes Signature',' -keepnames class com.fasterxml.jackson. ** {*; } ',' -dontwarn com.fasterxml.jackson.databind. ** ' – ashughes

+0

Excelentes comentarios. También necesitaba esto: -cuentadores de la clase pública final enum org.codehaus.jackson.annotate.JsonAutoDetect $ Visibilidad { public static final org.codehaus.jackson.annotate.JsonAutoDetect $ Visibility *; } – Sean

Cuestiones relacionadas