Ад proguard - не могу найти указанный класс
Итак, я пытаюсь выпустить какое-то программное обеспечение, но Proguard вызывает у меня головную боль.
Когда я пытаюсь экспортировать с помощью proguard, я получаю много предупреждений, т.е. "не могу найти ссылочный класс"
Например:
[2011-08-07 17:44:37 - GAME] Warning: org.simpleframework.xml.stream.StreamReader: can't find referenced class javax.xml.stream.events.XMLEvent
[2011-08-07 17:44:37 - GAME] Warning: there were 52 unresolved references to classes or interfaces.
[2011-08-07 17:44:37 - GAME] You may need to specify additional library jars (using '-libraryjars'),
[2011-08-07 17:44:37 - GAME] or perhaps the '-dontskipnonpubliclibraryclasses' option.
[2011-08-07 17:44:37 - GAME] java.io.IOException: Please correct the above warnings first.
[
Похоже, что предупреждения относятся к простой рамке, поэтому в моем конфигурационном файле proguard я добавил следующее:
-libraryjars pathtoprojecttolibs\simple-xml-2.4.jar
куда pathtoprojecttolibs
это путь к банкам, на которые ссылается мой проект.
Это не имеет значения.
Если ссылки на простой фреймворк javax я могу сказать proguard игнорировать это тоже??
Есть идеи?
8 ответов
org.simpleframework.xml.stream.StreamReader
в вашем коде относится к javax.xml.stream.events.XMLEvent
, Последний класс является частью среды выполнения Java (rt.jar
) но не является частью среды выполнения Android (android.jar
), поэтому ProGuard предупреждает, что что-то может быть сломано. Если вы уверены, что ваше приложение все равно работает, вы можете указать
-dontwarn javax.xml.stream.events.**
ProGuard, черт возьми?
В моем случае коренная причина была здесь. Эти предупреждения вы можете просто пропустить:
-dontwarn org.simpleframework.xml.stream.**
Эта ошибка возникает из-за того, что используемые вами библиотеки зависят от других библиотек, которые на самом деле не используются, но Proguard ищет их.
Добавьте строки -dontwarn в файл proguard-rules.pro в вашем проекте Android, чтобы отключить эти предупреждения.
Вы можете найти зависимости, которые вам нужно добавить в ваш proguard-rules.pro, в трассировке стека вашей ошибки.
Вы должны включить это в вашу конфигурацию Proguard:
-dontskipnonpubliclibraryclasses
Мой Волшебный ключ, который решил мои часы поиска: добавьте это в progruard-android.txt
-dontskipnonpubliclibraryclassmembers
В моем случае я ничего не изменил, и стало появляться предупреждение. Проблема была со сломанными кешами gradle. Проверьте мой другой ответ. Я делюсь этим, потому что мне понадобилось 2 часа, чтобы найти проблему:]
Добавьте эту строку в свой proguard-rules.pro
файл в каталоге скриптов Gradle:
-dontwarn package.class.name.**
где package.class.name
имя пакета с добавленным именем класса файла JAR
Например:
-dontwarn com.myexternalclass.utils.**
Хм. При чтении этого предупреждения может показаться, что библиотека, которую вы пытаетесь использовать, зависит от javax.xml.stream.events. Я не думаю, что пространство имен на самом деле включено в Android. (См. Индекс пакета).
Попробуйте развернуть его на эмуляторе, не используя proguard, и посмотрите, работает ли он. Я думаю, что нет, если это предупреждение верно.
Я думаю, что это крайний случай, но в моем случае мне пришлось полностью стереть папку сборки на моем proguard Jenkins, пытаясь работать со старым кодом, которого там больше не было - на случай, если у кого-то возникнет та же проблема.