2011-03-17 11 views
9

Cuando mi aplicación se compila con ProGuard, falla con el siguiente mensaje. Utilizo un proguard.cfg predeterminado generado por Android SDK con algunos -libraryjars. ¿Qué puedo hacer por eso?Error de Android ProGuard con org.xmlpull.v1.XmlPullParser

[2011-03-17 09:27:04 - MyProject] Proguard returned with error code 1. See console 
[2011-03-17 09:27:04 - MyProject] Note: there were 4247 duplicate class definitions. 
[2011-03-17 09:27:04 - MyProject] Warning: library class android.content.res.XmlResourceParser extends or implements program class org.xmlpull.v1.XmlPullParser 
[2011-03-17 09:27:04 - MyProject] Warning: library class android.content.Intent depends on program class org.xmlpull.v1.XmlPullParser 
[2011-03-17 09:27:04 - MyProject] Warning: library class android.graphics.drawable.AnimationDrawable depends on program class org.xmlpull.v1.XmlPullParser 
[2011-03-17 09:27:04 - MyProject] Warning: library class android.graphics.drawable.BitmapDrawable depends on program class org.xmlpull.v1.XmlPullParser 
[2011-03-17 09:27:04 - MyProject] Warning: library class android.graphics.drawable.Drawable depends on program class org.xmlpull.v1.XmlPullParser 
[2011-03-17 09:27:04 - MyProject] Warning: library class android.graphics.drawable.Drawable depends on program class org.xmlpull.v1.XmlPullParser 
[2011-03-17 09:27:04 - MyProject] Warning: library class android.graphics.drawable.Drawable depends on program class org.xmlpull.v1.XmlPullParser 
[2011-03-17 09:27:04 - MyProject] Warning: library class android.view.LayoutInflater depends on program class org.xmlpull.v1.XmlPullParser 
[2011-03-17 09:27:04 - MyProject] Warning: library class android.view.LayoutInflater depends on program class org.xmlpull.v1.XmlPullParser 
[2011-03-17 09:27:04 - MyProject]  You should check if you need to specify additional program jars. 
[2011-03-17 09:27:04 - MyProject] Warning: there were 9 instances of library classes depending on program classes. 
[2011-03-17 09:27:04 - MyProject]   You must avoid such dependencies, since the program classes will 
[2011-03-17 09:27:04 - MyProject]   be processed, while the library classes will remain unchanged. 
[2011-03-17 09:27:04 - MyProject] java.io.IOException: Please correct the above warnings first. 
[2011-03-17 09:27:04 - MyProject] at proguard.Initializer.execute(Initializer.java:321) 
[2011-03-17 09:27:04 - MyProject] at proguard.ProGuard.initialize(ProGuard.java:211) 
[2011-03-17 09:27:04 - MyProject] at proguard.ProGuard.execute(ProGuard.java:86) 
[2011-03-17 09:27:04 - MyProject] at proguard.ProGuard.main(ProGuard.java:492) 

Al parecer, org.xmlpull.v1.XmlPullParser no es una clase de programas. He actualizado ProGuard a la versión más reciente (4.6), pero tengo las mismas advertencias.

Respuesta

1

Según el registro parcial que proporcione, la clase de tiempo de ejecución de Android org.xmlpull.v1.XmlPullParser ha terminado en el código del programa. Debe asegurarse de que no esté presente en el contenedor bin/classes o en algún jar en lib, porque ya está presente en la biblioteca jar android.jar.

Además, tiene 4247 definiciones de clases duplicadas. Esto probablemente se deba a la especificación de "algunos -ibraryjars" como mencionas. Supongo que estos archivos jar de la biblioteca ya están incluidos automáticamente por el script de compilación, por lo que no debe especificarlos de nuevo.

+0

Eric, la razón por la que (o en todo caso, I) tiene la clase XmlPullParser en un frasco en su libs es tan original que anularía la clase XmlPullParser incorporada de Android que es deficiente para algunos usos. Debido a la forma en que formulamos proguard.cfg en Android, no es posible filtrar el incorporado, ni tampoco queremos filtrar el mejor, AFAIK. Tampoco parece prudente rodar nuestros propios frascos de Android, si eso es posible. ¿Cómo deberíamos lidiar con esto?Gracias – pjv

+2

Si los archivos de su programa contienen mejores implementaciones, debería intentar filtrar las versiones de la biblioteca, con "-libraryjars android.jar (! Org/xmlpull/v1/**)", de modo que ProGuard obtenga una entrada limpia. Si eso no es posible, puede especificar algo como "-dontwarn org.xmlpull.v1. **". Debería funcionar en este caso, porque ProGuard da prioridad a las clases de programa sobre las clases de biblioteca. –

2

no tengo la solución aún para Proguard ejecutar a través de Eclipse para Android, pero si se ejecuta Proguard manualmente desde la línea de comandos, se puede poner lo siguiente en su proguard.cfg:

-basedirectory /home/pjv/workspace/collectionista-repo/collectionista-main 

-injars /tmp/android_4500371803543847111.jar 
-injars libs/joda-time-1.6.jar(!META-INF/MANIFEST.MF) 
-injars libs/FlurryAgent.jar(!META-INF/MANIFEST.MF) 
-injars libs/veecheck-2.0.jar(!META-INF/MANIFEST.MF) 
-injars libs/commons-lang-2.4.jar(!META-INF/MANIFEST.MF,!META-INF/NOTICE.txt,!META-INF/LICENSE.txt) 
-injars libs/OIAbout-lib-temporary.jar(!META-INF/MANIFEST.MF) 
-injars libs/libGoogleAnalytics.jar(!META-INF/MANIFEST.MF) 
-injars libs/xstream-1.3.1.jar(!META-INF/MANIFEST.MF) 
-injars libs/ZQL_custom.jar(!META-INF/MANIFEST.MF) 
-injars libs/xpp3_min-1.1.4c.jar(!META-INF/MANIFEST.MF) 
-injars libs/GoogleAdMobAdsSdk-4.1.0.jar(!META-INF/MANIFEST.MF) 
-injars libs/bugsense-trace.jar(!META-INF/MANIFEST.MF) 
-outjars /tmp/android_1348923171424559204.jar 

-libraryjars /opt/android-sdk/android-sdk-linux_x86-1.6_r1/platforms/android-12/android.jar(!org/xmlpull/v1/XmlPullParser.class,!org/xmlpull/v1/XmlPullParserException.class) 

Nota cómo XmlPullParser.class se filtra del jar API de Android.

No se preocupe por las advertencias relacionadas con XmlPullParser todavía. Primero corrija los errores y otras advertencias y, si es necesario, use -ignorewarnings en su proguard.cfg.

+0

Mientras tanto, pasé a algo más elegante. Consulte http://stackoverflow.com/questions/6780902/problem-with-proguard-and-xmlpullparser/7986229 – pjv

1

Creo que su paquete jar incluye la clase XmlPullParser y android.jar también incluye esto. Para poder eliminar las clases org.xmlpull.* en el paquete jar, y compilar de nuevo.

+0

¿Podría elborar qué significa esto? Y posiblemente cómo hacerlo. ¿Qué quiere decir con "paquete jar"? – Mafro34

12

añadir esta línea a PROGUARD-project.txt

-dontwarn org.xmlpull.v1.** 

y esta línea de project.properties

proguard.config=proguard-project.txt 
+0

No puedo encontrar proguard-project.txt y project.properties. Tengo dos archivos .properties: - 1. local.properties 2. gradle.properties. El archivo proguard-rules.pro está disponible dentro del módulo de aplicación –

+0

Muchas gracias por la respuesta. En mi caso, tengo que usar tanto tu respuesta como -salir la clase org.xmlpull.v1. ** {*; } – Hong

7

He resuelto esto utilizando esta configuración en el archivo Proguard:

-dontwarn org.kobjects.** 
-dontwarn org.ksoap2.** 
-dontwarn org.kxml2.** 
-dontwarn org.xmlpull.v1.** 

-keep class org.kobjects.** { *; } 
-keep class org.ksoap2.** { *; } 
-keep class org.kxml2.** { *; } 
-keep class org.xmlpull.** { *; } 

-dontusemixedcaseclassnames 
-dontskipnonpubliclibraryclasses 
-dontoptimize 
-dontpreverify 
+0

Por favor, evite copiar pegar @Ton desde su mismo enlace de recurso compartido en su lugar – Killer

+0

Tuve que agregar las siguientes 2 filas ro hacerlo funcionar -dontwarn org.codehaus. ** y -mantener clase org.codehaus. ** {*; } – Pecana

+0

@Ton ¿dónde debería agregar? –

-2

para mí podría resolverlo quitando mi build.gradle modificado anterior

I Eliminado:

 minifyEnabled true 

    shrinkResources true 

y vuelve al valor

minifyEnabled false 
+0

¿Su solución para resolver un problema con proguard es desactivar proguard? – Daverix

Cuestiones relacionadas