Проблема с Proguard и XmlPullParser

У меня возникли проблемы с проектом Android, использующим Proguard с некоторыми библиотеками. В частности, у меня возникает коллизия XmlPullParser, и что бы я ни делал, я не могу ее решить. Вот библиотеки, которые я использую:

JacksonParser, включает:

  • Джексон-все.1.6.4.jar
  • Joda-time.1.6.2.jar
  • jsr311-api-1.0.jar
  • stax2-api-3.0.0.jar

XStream, который включает:

  • xpp3_min-1.1.4c.jar
  • xstream-для-android-1.0.0.jar

Есть и другие, но это не проблема. Кажется, они являются виновниками наших проблем.

В частности, проблемы:

Оптимизация

если я делаю оптимизацию, я получаю «преобразование в dalvik не удалось с 1». Об этом есть специальное сообщение в Преобразование в Форматирование Dalvik завершилось с ошибкой 1 во внешнем JAR, что указало мне на наличие дублирующегося класса XmlPullParser. Это имеет смысл, так как XStream использует app3_min-1.1.4c.jar, который включает в себя XmlPullParser, который имеет лучшую/дополнительную функциональность, чем включенный в android.jar. Таким образом, я попытался удалить подстановочный знак xmlpull ** из android.jar:

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

и я также пытался явно удалить их:

-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)

но ни один фикс не помог.

но подождите, есть еще (все вокруг одной и той же проблемы, поэтому я думаю, что если я решу эту, остальные исчезнут).

Запутывание

Если я попытаюсь запутать, я получаю следующую ошибку времени выполнения:

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

поэтому отсутствует метод next(). так почему этот метод отсутствует? я не понимаю. я даже пытался сделать это:

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

чтобы убедиться, что этот метод сохраняется, но все же я получаю ту же проблему.

Уменьшение

Сокращение также кажется неудачным. приложение запускается, но никуда не приходит, оно просто продолжает пытаться запустить первое действие снова и снова и выдает мне бесполезную ошибку. я пока не так беспокоюсь об этом, я могу жить без сжатия, если я смогу заставить работать обфускацию и оптимизацию.

Подробнее

В качестве ориентира я пытался ссылаться на свои библиотеки двумя способами, первый из которых использует 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)

это даже не построится.

я также сделал это:

-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)

это заводит меня дальше всего, я могу экспортировать APK, если не оптимизирую.

я также сделал это:

-dontwarn org.xmlpull.v1.**

так как это, кажется, известная проблема (см. предыдущую ссылку)

Кто-нибудь знает, что здесь происходит или как я могу это решить? у меня такое ощущение, что это как-то связано с тем фактом, что я использую и XStream, и JacksonParser, и, возможно, в одной из библиотек JacksonParser также есть XmlPullParser? Дело в том, что это объяснило бы ошибку оптимизации, но не ошибку обфускации. я понятия не имею об этом. почему бы ему не найти этот метод, даже если я его явно сохранил?

Спасибо всем.


person bryan costanich    schedule 21.07.2011    source источник


Ответы (4)


Это работает для меня:

-dontwarn org.xmlpull.v1.**
-dontnote org.xmlpull.v1.**
-keep class org.xmlpull.** { *; }
person stefan    schedule 04.08.2014
comment
Это действительно сработало для меня. По крайней мере, кажется, у меня пока нет проблем. У меня возникла эта проблема после обновления части сервисов Google Play в моем приложении до последней версии и запуска proguard. - person Armando; 23.05.2015

Ваша конфигурация ProGuard и процесс сборки, похоже, смешивают файлы jar программы и jar библиотеки.

Для ProGuard вы, вероятно, можете указать все перечисленные банки в качестве входных (с -injars). Их обработанные версии окажутся в выходной банке (-outjars).

Вы действительно можете избежать предупреждений о повторяющихся классах xmlpull, отфильтровав их из android.jar. ProGuard также распечатает предупреждения, если во входных банках есть дубликаты. Затем вы также можете отфильтровать эти дубликаты.

Вы не должны указывать <java.home>/lib/rt.jar в качестве библиотеки jar, так как этот jar также не представлен как библиотека на устройствах Android. Однако некоторые из перечисленных jar-файлов зависят от него, поэтому, по крайней мере, некоторые из них не полностью совместимы со средой выполнения Android. Самое чистое решение, позволяющее избежать предупреждений о классах-нарушителях, — отфильтровать их из соответствующих входных банок (например, фильтр !com/thoughtworks/xstream/converters/extended/ColorConverter.class). Кроме того, вы можете просто отключить эти предупреждения (например, -dontwarn com.thoughtworks.xstream.converters.extended.ColorConverter).

Для компилятора Dalvik вы должны указать только обработанный файл jar вывода, а не какой-либо из файлов jar программы, которые вошли в него. В противном случае вы получите повторяющиеся классы: некоторые необработанные копии и некоторые частично запутанные копии. Они не смешиваются и приводят к Error1 и NoSuchMethodErrors.

person Eric Lafortune    schedule 22.07.2011

Чтобы позволить библиотечным классам иметь приоритет и закрыть Proguard, поместите это в main-rules.xml (но сначала скопируйте часть в build.xml):

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

Вы также столкнетесь с другими проблемами с XStream, см.: Proguard и XStream с опустить поле() на Android

Подробности: https://plus.google.com/112617873637231221858/posts/YxWrEJRMSo4

person pjv    schedule 02.11.2011

Синтаксический анализ XML может стать настоящей головной болью на Android. Недавно я столкнулся с похожими проблемами при попытке использовать привязку данных Jackson XML на Android.

В итоге я использовал инструмент Jar Jar Links для перемещения конфликтующих классов в библиотеках, которые я пытался использовать, на новое имя пакета, которое не конфликтует с классами платформы Android:

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

Вы можете указать Jar Jar Links найти пространства имен в файлах JAR библиотеки XML, которые мы предоставляем, которые конфликтуют с Android (например, javax.xml.stream.*), и попросить JarJar переименовать их во что-то, что не конфликтует (например, edu.usf.cutr.javax.xml.stream.*). Затем Android примет библиотеки, которые не конфликтуют без расширения Conversion to Dalvik format failed with error 1.

Вот zip-файл, содержащий файлы, которые я использовал для пакетного преобразования XML-библиотек, необходимые, а именно:

  • StAX API — определения интерфейса API JSR 173. Также см. запись StAX в Википедии для получения дополнительной информации.
  • StAX2 API — экспериментальное расширение оригинального StAX API, используемого Аалто.
  • Aalto — реализация анализатора XML StAX 1 и 2
  • jackson-dataformat-xml – интегрирует вышеуказанные API-интерфейсы парсера XML. и реализации с основным проектом Джексона

Пакетный файл generate_android_jarsv21.bat включен для автоматизации процесса преобразования с использованием JarJar для нескольких JAR-файлов XML-библиотеки одновременно.

JarJar использует ряд правил для изменения пространств имен в файлах JAR. Вот содержимое моего файла rules.txt, который переименовывает все вхождения javax.xml.stream.* в edu.usf.cutr.javax.xml.stream.*:

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

Вы должны иметь возможность следовать аналогичному процессу для библиотек XML, с которыми вы работаете. Как только коллизия в пакетах будет устранена путем перемещения классов библиотеки в новый пакет, другие последующие проблемы с Proguard должны решиться сами собой.

Здесь я написал полный учебник, который включает более подробную информацию об «Изменении библиотек XML для Android»:

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

person Sean Barbeau    schedule 05.10.2012