Problema con Proguard y XmlPullParser

Estoy teniendo un problema en un proyecto de Android usando Proguard con algunas bibliotecas. Específicamente, estoy teniendo una colisión XmlPullParser, y no importa lo que parezco hacer, no puedo parecer resolverlo. Aquí están las bibliotecas que estoy usando:

JacksonParser, incluye:

  • Jackson-all.1.6.4.jar
  • Joda-time.1.6.2.jar
  • Jsr311-api-1.0.jar
  • Stax2-api-3.0.0.jar

XStream, que incluye :

  • Xpp3_min-1.1.4c.jar
  • Xstream-for-android-1.0.0.jar

También hay otros, pero no son un problema. Estos parecen ser el culpable de nuestros problemas.

Específicamente, los temas son:

Mejoramiento

Si hago una optimización, consigo "la conversión a dalvik falló con 1". Hay un post específicamente sobre esto en "Conversión a formato Dalvik falló con error 1" en JAR externo , que me apuntó en la dirección de tener una clase XmlPullParser duplicada. Esto tiene sentido, ya que XStream utiliza app3_min-1.1.4c.jar, que incluye un XmlPullParser que tiene una funcionalidad mejor / adicional que la incluida en android.jar. Como tal, he intentado un comodín xmlpull ** eliminación de android.jar:

-libraryjars <java.home>/lib/rt.jar;C:/Android/platforms/android-9/android.jar(!org/xmlpull/v1/**) 

Y también he intentado eliminarlos explícitamente:

 -libraryjars <java.home>/lib/rt.jar;C:/Android/platforms/android-9/android.jar(!org/xmlpull/v1/XmlPullParser.class,!org/xmlpull/v1/XmlPullParserException.class,!org/xmlpull/v1/XmlPullParserFactory,!org/xmlpull/mxp1/MXParser) 

Pero ninguno de los dos ha ayudado.

Pero espera, hay más (todo centrado alrededor del mismo problema sin embargo, así que pienso si yo soluciono éste, los otros van lejos).

Ofuscación

Si intento ofuscar, consigo el error de tiempo de ejecución siguiente:

 java.lang.NoSuchMethodError: android.content.res.XmlResourceParser.s looking this up in the mapping, i get: .s = abstract int next() 

Por lo que le falta el siguiente método (). Así que ¿por qué falta ese método? No entiendo. Incluso he intentado hacer esto:

 -keep class android.content.res.XmlResourceParser { int next(); } 

Para asegurarse de que el método se conserva, pero aún así obtener el mismo problema.

Contracción

El encogimiento también parece fallar. La aplicación se lanza, pero nunca llega a ningún lado, simplemente sigue intentando iniciar la primera actividad una y otra vez y me da un error inútil. No estoy tan preocupado por esto, sin embargo, puedo vivir sin encogerse, si puedo obtener obfuscation y optimización de trabajo.

Más información

Como un punto de referencia, he tratado de hacer referencia a mis bibliotecas de dos maneras, la primera es usar injars:

 -injars ReferencedAssemblies/XStream/xpp3_min-1.1.4c.jar(!META-INF/MANIFEST.MF) -injars ReferencedAssemblies/JacksonParser/jackson-all-1.6.4.jar(!META-INF/MANIFEST.MF,!META-INF/ASL2.0,!META-INF/LICENSE,!META-INF/NOTICE) -injars ReferencedAssemblies/JacksonParser/joda-time-1.6.2.jar(!META-INF/MANIFEST.MF) -injars ReferencedAssemblies/JacksonParser/jsr311-api-1.0.jar(!META-INF/MANIFEST.MF) -injars ReferencedAssemblies/JacksonParser/stax2-api-3.0.0.jar(!META-INF/MANIFEST.MF) -injars ReferencedAssemblies/XStream/xstream-for-android-1.0.0.jar(!META-INF/MANIFEST.MF) 

Esto ni siquiera se construirá.

También he hecho esto:

 -libraryjars <java.home>/lib/rt.jar ;C:/Android/platforms/android-9/android.jar(!org/xmlpull/v1/**) #;C:/Android/platforms/android-9/android.jar(!org/xmlpull/v1/XmlPullParser.class,!org/xmlpull/v1/XmlPullParserException.class,!org/xmlpull/v1/XmlPullParserFactory,!org/xmlpull/mxp1/MXParser) ;ReferencedAssemblies/JacksonParser/jackson-all-1.6.4.jar(!META-INF/MANIFEST.MF,!META-INF/ASL2.0,!META-INF/LICENSE,!META-INF/NOTICE) ;ReferencedAssemblies/JacksonParser/joda-time-1.6.2.jar(!META-INF/MANIFEST.MF) ;ReferencedAssemblies/JacksonParser/jsr311-api-1.0.jar(!META-INF/MANIFEST.MF) ;ReferencedAssemblies/JacksonParser/stax2-api-3.0.0.jar(!META-INF/MANIFEST.MF) ;ReferencedAssemblies/XStream/xpp3_min-1.1.4c.jar(!META-INF/MANIFEST.MF) 

Esto me da lo más lejos, soy capaz de exportar un APK si no optimizar.

También he hecho esto:

 -dontwarn org.xmlpull.v1.** 

Ya que esto parece ser un problema conocido (ver enlace anterior)

Alguien tiene alguna idea de lo que está pasando aquí o cómo lo soluciono? Tengo la sensación de que esto tiene algo que ver con el hecho de que estoy usando tanto XStream y JacksonParser, y tal vez una de las bibliotecas JacksonParser también tiene un XmlPullParser en ella? La cosa es, que explicaría el error de optimización, pero no el error de ofuscación. No tengo ni idea de eso. ¿Por qué no estaría encontrando ese método, aunque lo haya preservado explícitamente?

gracias a todos.

Esto funciona para mí:

 -dontwarn org.xmlpull.v1.** -dontnote org.xmlpull.v1.** -keep class org.xmlpull.** { *; } 

El proceso de configuración y creación de ProGuard parece mezclar jarras de programa y jarras de biblioteca.

Para ProGuard, probablemente puede especificar todos los tarros enumerados como tarros de entrada (con -injars). Sus versiones procesadas terminarán en el tarro de salida (-outjars).

De hecho, puede evitar las advertencias sobre las clases xmlpull duplicadas mediante el filtrado de android.jar. ProGuard también imprimirá advertencias en caso de que haya duplicados en los tarros de entrada. A continuación, puede filtrar los duplicados también.

No debe especificar <java.home>/lib/rt.jar como un jar de biblioteca, ya que este jar no está presente como una biblioteca en dispositivos Android tampoco. Sin embargo, algunos de los tarros enumerados dependen de él, por lo que al menos algunas de ellas no son totalmente compatibles con el tiempo de ejecución de Android. La solución más limpia para evitar las advertencias sobre clases ofensivas es filtrarlas de los tarros de entrada correspondientes (por ejemplo, un filtro !com/thoughtworks/xstream/converters/extended/ColorConverter.class ). Alternativamente, puede desactivar sin rodeos estas advertencias (p -dontwarn com.thoughtworks.xstream.converters.extended.ColorConverter ., -dontwarn com.thoughtworks.xstream.converters.extended.ColorConverter ).

Para el compilador Dalvik, sólo debe especificar el tarro de salida procesado, no cualquiera de los tarros de programa que entraron en él. De lo contrario, obtendrá clases duplicadas: algunas copias no procesadas y algunas copias parcialmente ocultas. No se mezclan y conducen a Error1 y NoSuchMethodErrors.

Para que las clases de biblioteca tengan prioridad y cierre Proguard, ponga esto en main-rules.xml (pero copie una parte a build.xml primero):

  -libraryjars ${android.libraryjars}(!org/xmlpull/v1/XmlPullParser.class,!org/xmlpull/v1/XmlPullParserException.class) 

También te encontrarás con otros problemas con XStream, ver: Proguard y XStream con omitField () en Android

Para toda la historia: https://plus.google.com/112617873637231221858/posts/YxWrEJRMSo4

Análisis XML puede ser un verdadero dolor en Android. Recientemente me encontré con problemas similares al intentar utilizar el enlace de datos XML de Jackson en Android.

Terminé usando la herramienta Jar Jar Links para mover las clases en conflicto en las bibliotecas que estaba tratando de usar con un nuevo nombre de paquete que no entra en conflicto con las clases de plataformas Android:

http://code.google.com/p/jarjar/

Puede decirle a Jar Jar Links que encuentre los espacios de nombres en los archivos JAR de la biblioteca XML que proporcionamos que estén en conflicto con Android (es decir, javax.xml.stream.* ) Y que JarJar los cambie de nombre a algo que no entre en conflicto (es decir, edu.usf.cutr.javax.xml.stream.* ). Android aceptará las librerías que no entren en conflicto sin que el Conversion to Dalvik format failed with error 1 .

Aquí hay un archivo zip que incluye archivos que usé para hacer una conversión por lotes de las bibliotecas XML que necesitaba, que eran:

  • StAX API – JSR 173 Definiciones de la interfaz de la API. También vea la entrada StAX de Wikipedia para más información.
  • StAX2 API – Expansión experimental del StAX API original utilizado por Aalto
  • Implementación del analizador XML Aalto – StAX 1 y 2
  • Jackson-dataformat-xml – integra las APIs e implementaciones de analizador XML anteriores con el proyecto central de Jackson

El archivo de lotes generate_android_jarsv21.bat se incluye para automatizar el proceso de conversión utilizando JarJar para varios JAR de biblioteca XML a la vez.

JarJar utiliza una serie de reglas para cambiar los espacios de nombres en los archivos JAR. Aquí está el contenido de mi archivo rules.txt que cambia el nombre de todas las ocurrencias de javax.xml.stream.* edu.usf.cutr.javax.xml.stream.* :

rule javax.xml.stream.** edu.usf.cutr.javax.xml.stream.@1

Debería poder seguir un proceso similar para las bibliotecas XML con las que está trabajando. Una vez que la colisión en paquetes se resuelve moviendo las clases de biblioteca a un nuevo paquete, los otros problemas de flujo descendente con Proguard deben resolver ellos mismos.

Escribí un tutorial completo aquí que incluye más detalles sobre "Modificar bibliotecas XML para Android":

https://github.com/CUTR-at-USF/SiriRestClient/wiki/Modifying-XML-libraries-for-Android

  • Cómo ofuscar un apk con Proguard a través de Eclipse?
  • Error de Proguard al exportar una aplicación firmada usando el paquete de compatibilidad de nido de abeja android.support.v4.app
  • Proguard Parse Error de excepción. Cómo resolverlo
  • Uso de Proguard para Android en Eclipse obtuvo error
  • Configuración de Proguard al utilizar la plantilla Google Cloud Endpoints de Android Studio
  • Pase 1.1.3 - Proguard
  • No se pudieron determinar las dependencias de la tarea ': app: crashlyticsStoreDeobsDebug' si habilito el proguard
  • Cómo corregir estas advertencias proguard
  • Utilizando Otto, el método sólo se suscribe si lo llamo directamente a otra parte
  • Proguard dice que el archivo jar de entrada se especifica dos veces
  • Eliminar la llamada de registro mediante proguard
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.