proguard hell - не могу найти указанный класс


125

Итак, я ПЫТАЮСЬ выпустить какое-нибудь программное обеспечение, но 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.
[ 

Предупреждения, похоже, связаны с simpleframework, поэтому в моем конфигурационном файле proguard я добавил следующее:

-libraryjars pathtoprojecttolibs\simple-xml-2.4.jar

Где pathtoprojecttolibsпуть к банкам, на которые ссылается мой проект.

Это НЕ имеет значения.

Если simpleframework ссылается на javax, могу ли я сказать proguard игнорировать и это ??

Любые идеи?


1
Вы используете proguard только для встряхивания деревьев? Если да, то проверяли ли вы размер файла, не используя его? Вы можете получить сверхъестественные ошибки, когда proguard выбрасывает что-то, к чему осуществляется доступ, например, с помощью отражения, чего вы не найдете, пока оно не прервет время выполнения, так что будьте действительно, действительно уверены, что вам это нужно.
alun 07

Я действительно использовал его только для того, чтобы попытаться так же легко защитить код от взлома? Как вы думаете, оно того стоит?
iasksillyquestions

3
@ListenToRick Proguard отлично подойдет, если он запущен с правильными конфигурациями и ваше полученное приложение протестировано должным образом. Я почти уверен, что Google даже рекомендует его использовать. Google предоставляет множество руководств / примеров по использованию Proguard с приложениями Android.
CrackerJack9,

Proguard - хороший инструмент, но рекомендации Google, вероятно, не меньше из-за довольно странного ограничения размера в формате dex, чем что-либо еще. (См. Code.google.com/p/android/issues/detail?id=7147 )
alun,

5
@alun, причина не в этом. Те из нас, кто не хочет, чтобы наши приложения подвергались реверс-инжинирингу, или кто использует лицензирование, чтобы «попытаться» предотвратить пиратство, должны использовать такой инструмент обфускации, как этот, чтобы усложнить задачу, будут хакерами. Уменьшение занимаемого вашим приложением места также является преимуществом для конечного пользователя, и эти инструменты также позволяют выполнять оптимизацию ... еще одно преимущество.
Кристофер Перри,

Ответы:


128

org.simpleframework.xml.stream.StreamReaderв вашем коде имеется в виду javax.xml.stream.events.XMLEvent. Последний класс является частью среды выполнения Java ( rt.jar), но не частью среды выполнения Android ( android.jar), поэтому ProGuard предупреждает, что что-то может сломаться. Если вы уверены, что ваше приложение все равно работает, вы можете указать

-dontwarn javax.xml.stream.events.**

ProGuard ад?


15
Это не -dontwarn javax.xml.**
помогло

8
Добавление -libraryjars <java.home>/lib/rt.jarустранило проблему для меня.
Gautam

3
Я получил дополнительные предупреждения, например, о javax.xml.stream.XMLInputFactory, поэтому я использовал-dontwarn javax.xml.stream.**
Spaceist

1
Как я могу настроить -dontwarnпение графического интерфейса?
Томаш Зато - Восстановите Монику

2
Ад Proguard продолжается, просто содрать с меня кожу и покончить с этой болью.
Джош


5

Эта ошибка возникает из-за того, что используемые вами библиотеки зависят от других библиотек, которые на самом деле не используются, но Proguard ищет их.
Добавьте -dontwarn строки в proguard-rules.pro файл в вашем Android проекта , чтобы отключить эти предупреждения.

введите описание изображения здесь

Вы можете найти, какие зависимости вам нужно добавить в proguard-rules.pro, в трассировке стека вашей ошибки.


2

Вы должны включить это в свой конфиг Proguard:

-dontskipnonpubliclibraryclasses

Что ж, тогда это было для меня ... ~ 4 года назад ... с тех пор все могло измениться :) В любом случае, похоже, сработало как минимум еще 2 человека.
CrackerJack9

В файле proguard-android.txt по умолчанию уже есть эта строка.
Кристина Де Рито

1
@Ultimecia, этот коммит датируется 2013 годом, этот пост был сделан в 2011 году
CrackerJack 9

2

Мой волшебный ключ, который решил мои часы поиска: добавьте это в progruard-android.txt

-dontskipnonpubliclibraryclassmembers

0

Хм. При чтении этого предупреждения может показаться, что библиотека, которую вы пытаетесь использовать, зависит от javax.xml.stream.events. Я не думаю, что это пространство имен вообще включено в Android. (См. Указатель пакетов ).

Попробуйте развернуть его в эмуляторе без использования proguard и посмотрите, работает ли он. Думаю, нет, если это предупреждение верно.


Привет, если он работает в эмуляторе без прогарда, значит, предупреждения неточные? Я пытаюсь понять, почему у меня были подобные предупреждения. Я не хочу просто подавлять предупреждения.
Мишель Ши

0

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


0

В моем случае я ничего не менял, и начали появляться предупреждения. Проблема заключалась в сломанных кешах Gradle. Проверьте мой другой ответ . Я согласен с этим, потому что мне потребовалось 2 часа, чтобы найти проблему:]


0

Добавьте эту строку в свой proguard-rules.proфайл в каталоге скриптов gradle:

-dontwarn package.class.name.**

где package.class.nameэто имя пакета с добавленным именем класса jar-файла.

Например:

-dontwarn com.myexternalclass.utils.**
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.