Вопрос по proguard, adt, android – Зачем начинать использовать -libraryjars, когда я никогда не нуждался в этом раньше?

14

С тех пор, как я обновил ADT с 16 до 18 (что требовало обновления Proguard с 4.6 до 4.8), Proguard действовал очень странно (и непоследовательно?).

Последняя такая проблема - при попытке экспортировать подписанный (выпуск) APK, я получаю следующие ошибки:

Proguard returned with error code 1. See console
Warning: com.bta.LibProj2: can't find referenced class com.bta.R$string
Warning: com.bta.MyDlg1: can't find referenced class com.bta.R$string
Warning: com.bta.MyMenu: can't find referenced class com.bta.R$menu
Warning: com.bta.R: can't find referenced class com.bta.R$attr
Warning: com.bta.R: can't find referenced class com.bta.R$drawable
Warning: com.bta.R: can't find referenced class com.bta.R$menu
Warning: com.bta.R: can't find referenced class com.bta.R$string
Warning: com.bta.myapp.MyAppActivity$1: can't find referenced class com.bta.myapp.MyAppActivity
Warning: com.bta.myapp.MyAppActivity$ELicenseResponse: can't find referenced class com.bta.myapp.MyAppActivity
Warning: com.bta.myapp.MyAppActivity$MyLicenseCheckerCallback$1: can't find referenced class com.bta.myapp.MyAppActivity$MyLicenseCheckerCallback
Warning: com.bta.myapp.MyAppActivity$MyLicenseCheckerCallback$1: can't find referenced class com.bta.myapp.MyAppActivity
Warning: com.bta.myapp.R$array: can't find referenced class com.bta.myapp.R
Warning: com.bta.myapp.R$layout: can't find referenced class com.bta.myapp.R
Warning: com.bta.myapp.R$xml: can't find referenced class com.bta.myapp.R
Warning: there were 49 unresolved references to classes or interfaces.
         You may need to specify additional library jars (using '-libraryjars').
java.io.IOException: Please correct the above warnings first.
    at proguard.Initializer.execute(Initializer.java:321)
    at proguard.ProGuard.initialize(ProGuard.java:212)
    at proguard.ProGuard.execute(ProGuard.java:87)
    at proguard.ProGuard.main(ProGuard.java:493)

Я заметил рекомендацию добавить-libraryjars в proguard.cfg, но мне никогда не приходилось делать это раньше (и я ничего не менял в своем коде, все, что я делал, это обновлял Proguard с 4.6 до 4.8). Это говорит о том, что что-то не так в моей конфигурации среды разработки?

Кроме того, я проверил раздел «Устранение неполадок Proguard» дляНе могу найти указанный классЭто относится к забвению или игнорированию указания библиотеки через-libraryjars (что я признаю), но я никогда не указывал библиотеку, и этоalways работал раньше! Что изменилось?

Кстати, мой файл proguard.cfg начинается с:

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

Есть идеи, что происходит? Почему Proguard начал доставлять мне такие неприятности? (Я плавно с этим справился уже больше года) Есть ли что-то фундаментальное, чего мне не хватает в конфигурации моей системы?

Кстати, я попытался добавить библиотеки, которые я использовал, указав все их в-libraryjars линии, но поведение Proguard только ухудшилось: он потерпел бы неудачу, не предоставив ни одного журнала ошибок, который я цитировал выше.

@JamesMoore Я ни минуты не сомневался, что это инструмент программистов:uxdesignedge.com/2010/03/dont-design-like-a-programmer Regex Rookie
Это инструмент для программистов и для них; Вы всегда можете посмотреть на код. Действительно, это не так страшно. Кроме того, опубликуйте весь свой конфигурационный файл proguard, который может дать нам лучшее представление о том, что происходит не так. James Moore
@JamesMoore Вы, возможно, правы, но тот факт, что Proguard предлагает использовать-libraryjars вместо того, чтобы просто сказать «я», понятия не имею. Исправьте эту проблему в другом месте & quot; это просто ужасно безответственно. Proguard - отличный инструмент, и его разработчик заслуживает всяческих похвал -except for the misleading error messages., Я настоятельно рекомендую ему пройти один из этих классов UX Design. Regex Rookie
Вы отвечаете на свой вопрос здесь: proguard действительно нужно знать местоположение вашего кода, включая библиотеки, которые вы используете. Иди исправь эту проблему. Если у вас нет очень глубокого понимания того, что конкретно делает Proguard, оставляя без внимания такие вещи, как библиотечные фляги, это может очень усугубить ситуацию. (И имейте в виду, что шаг сжатия Proguard не так уж велик; очень глубокое понимание того, что делает proguard, не является ракетостроением. ИМХО, чтение кода Proguard не намного сложнее, чем чтение документа proguard. ) James Moore

Ваш Ответ

3   ответа
1

Warning: com.bta.LibProj2: can't find referenced class com.bta.R$string
Warning: com.bta.MyDlg1: can't find referenced class com.bta.R$string

Он не может найти строку com.bta.R $. Почему бы и нет? Есть ли строка com.bta.R $? Не исходный код, мы не заботимся об источнике на данный момент. Файл .class есть? Если он находится в файловой системе, действительно ли на него есть ссылка в файле конфигурации Proguard? Убедитесь, что вы знаете, как он должен быть включен; на что ссылается строка com.bta.R $? Вы, вероятно, собираетесь использовать javap, чтобы понять это.

Лучше использовать кувалду в этом случае не для отключения предупреждений (поскольку они фактически предупреждают вас о чем-то важном), это сказать Proguard оставить отсутствующие классы com.bta, что-то вроде этого:

-keep class com.bta.**

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

BTW, I did try to add the libraries I have been using by specifying all of them in -libraryjars lines, but Proguard's behavior only got worse: It would fail without giving any of the error log that I quoted above.

Возможно, вам нужны записи -libraryjars. Они не усугубляют проблему. Вы перешли от конфигурации, в которой есть N неправильных вещей (без указания -libraryjars), к конфигурации, в которой N - 1 неправильных вещей. Исправьте решение N - 1. Какие ошибки это дает, если таковые имеются? Если ошибок нет, что произойдет, если вы снова включите предупреждения?

Только для экспертов: у вас может быть полезная конфигурация без записей -libraryjars, но вам потребуется полное пониманиеexactly что Proguard делает с вашим кодом. И, кроме всего прочего, я не могу думать ни о какой другой причине, кроме производительности, почему вы хотели бы сделать это.

@RegexRookie У нас недостаточно информации, чтобы помочь вам выяснить, почему ваша старая конфигурация была нарушена. Я могу придумать причины (код, на который ссылается отражение; на него ссылаются с помощью символа подстановки, и вы не понимаете; вы запускаете proguard и не используете его вывод; на этот код ссылается путь кода, который был удален), но вероятно, легче понять, почему он сейчас сломан.
Proguard ничего не говорит мне. Точнее, он не выводит ничего, кроме диалогового окна ошибки:Failed to export application, Я пытался следовать своему собственному советуthe guy with the WinXP problem но это не помогло (у меня Win7). Когда я полностью выключаю Proguard, экспортируюsometimes выдает сообщения об ошибках, перечисленные в исходном вопросе, и иногда ничего не выдает на консоль, вместо этого происходит сбой с печально известнымConversion to Dalvik format failed with error 1. Regex Rookie
Оглядываясь назад, вопрос & quot;Is the .class file there?& Quot; не имеет смысла, потому что, как я описал в своем первоначальном посте, проблема заключается только в экспорте подписанных APK. Если.class файла не было, отладочная версия не работала бы так хорошо. Я ошибаюсь? Regex Rookie
Я не единственный, кто не имеет понятия: (1)stackoverflow.com/q/10155901/576267 (2) stackoverflow.com/q/11044161/576267 (3) stackoverflow.com/q/10723709/576267 и так далее ... Попробуйте посмотреть на БОЛЬШУЮ картинку. Proguard может не содержать ошибок, но если он плохо сообщает о проблемах при вводе ... Regex Rookie
И отвечая на первый вопрос: ДА, есть строка com.bta.R $ (файл .class) (в файловой системе). Но по какой-то причине не отображается в Eclipse Package Explorer.Why should it be referenced in the Proguard configuration file when I never needed to do so before? Regex Rookie
15

Задача решена.After much search for clues here in SO, I finally found этот намек ни кем иным, как самим разработчиком Proguard:

-dontwarn scala.**

Я не использую ничего, что содержит "scala" и я не знаю, что такое скала. Но это дало мне идею размещения-dontwarn наmy own application package:

-dontwarn com.bta.**

Это добилось цели.

Для записи, поисковая фраза, которая привела меня к поиску этой подсказки, была:proguard admob "не может найти указанный класс".

Постскриптум Предложение ProguardYou may need to specify additional library jars (using '-libraryjars') даже в правильном направлении ...

UPDATE: В то время как-dontwarn com.bta.** разрешено создавать подписанный APK, он зависал, как только я пытался запустить его с:

ClassNotFoundException: com.bta.myapp.MyAppActivity in loader dalvik.system.PathClassLoader[/data/app/com.bta.myapp.myapp-1.apk]. 

Какой кошмар.

UPDATE 2: -dontwarn com.bta.** turned out to be way too inclusive. I changed it to:

-dontwarn com.bta.myapp.MyAppActivity.R**

And now everything runs well without incident. Какой кошмар.

Потратив слишком много времени на отладку тех самых инструментов, которые должныsave Я обнаружил источник проблемы.Это ошибка в инструментах Android SDK, Это задокументировано, как было решено в 17 году, но я использую последние из сегодняшних (18 июня 2012) иit hasn't been solved! (см. комментарий 24).Комментарий 25 также описывает обходной путь, который позволяет мне сейчас приступить к моему реальному развитию.

Ошибки являются фактом жизни в сложных системах. Но тот факт, что ни Proguard, ни инструменты сборки, которые подают входные данные в Proguard, не могли предоставить какое-либо полезное сообщение об ошибке (на самом деле они сделали прямо противоположное), указывают на то, что что-то не так в «методологии» инструментов разработки Androidрекомендовано Google.

@Eric Lafortune Я согласен. Он скрывает симптомы недопонимания между разработчиками Eclipse + SDK + ADT + Proguard, прежде чем принять решение о выпуске следующей версии. Результатом является полное игнорированиеbackward compatibility к проектам, которые строились безупречно в течение многих лет ... Мой проект не имелany problems раньше, почему это должно быть сейчас? Вот почему я никогда не спешу «обновить» мои инструменты, когда доступна новая версия. Тратить дни на инструменты, которые должны сэкономить мне время, на самом деле не моя идея производительности. Я знаю, что я не одинок. Просто прочитайте комментарии Кристины. Regex Rookie
В этом случае -dontwarn скрывает симптомы, но, вероятно, это не правильное решение. Вы должны спросить себя, должны ли отсутствующие файлы быть там, проверить, что их там нет, а затем выяснить, почему их там нет. Многие другие вопросы о переполнении стека, касающиеся отсутствующих и поврежденных файлов, наводят на мысль, что происходит что-то еще.
Ну, что должно помочь, так это то, что мы очень, очень уверены, что ваше решение здесь не имеет абсолютно никакого отношения к реальному решению. После прочтения некоторых ссылок из вашего поискового запроса, я начал понимать проблему. Многие люди, которые ничего не знают о Proguard, публикуют плохие советы.
@ Джеймс Мур Да, но он не предлагает никакого решения. & quot; Что-то еще & quot; не помогает мне вообще. Я все еще потерялся. Я думаю, что я собираюсь переустановить все на SDK 11 + Proguard 4.6, что у меня было раньше. По крайней мере, это не останавливает развитие. Regex Rookie
@EricLafortune прав, это не решение. Все, что вы делаете, это меняете предупреждающие сообщения. Что-то еще изменилось, что решило вашу проблему.
1

в результате чего мне потребовалось проверить свой проект с нуля. Попробуйте проверить новую копию вашего проекта, посмотрите, работает ли это.

Прошу прощения, я не могу вам больше помочь. Я был очень рад, что мой проект заработал, я знаю, что это как-то связано с библиотечными проектами, у меня есть один из них, и я помню его замену стандартным jar-файлом, чтобы он работал. Я не помню, что я сделал после этого, что заставило работать библиотечный проект. Я пробовал так много вещей ....
Разочарование, да. Я потратил около суток на исправление своего проекта. По словам Ромена Гая на GooglIO 2009, их команда не использует Eclipse. Теперь мы знаем почему :-)
Да, это так. Или я должен сказать: да, они делают. На самом деле их 3 под/gen dubdirectory. Соответствует самому пакету приложения + 2 библиотечных проекта, используемых приложением. Я в растерянности. Или как кто-то обозначил это:proguard hell Regex Rookie
R-файл генерируется? Я заметил, что Eclipse больше не дает четких сообщений об ошибках, поэтому иногда ошибка в xml-файле остается незамеченной, что приводит к отсутствию R-файла, что приводит к загрузке "not found" ошибки.
Спасибо (+1), я попробую это, но я должен признать, что действительно сложно обойти проблему, не понимая, что ее вызвало и что решило. Я боюсь каждый раз, когда я вынужден обновить свой SDK + ADT, потому что этоalways приводит к потере как минимум 3 рабочих дней. Я думал, что с развитием технологий разработка программного обеспечения со временем станет легче. Оказывается, что сегодня среда разработки программного обеспечения на самом деле хуже, чем использование перфокарт в старые времена. :( Regex Rookie

Похожие вопросы