Подтвердить что ты не робот

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

Поскольку я обновлял 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 (что я допускаю), но я никогда не указывал какую-либо библиотеку, и она всегда работала раньше! Что изменилось?

Мой файл proguard.cfg BTW начинается с:

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

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

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

4b9b3361

Ответ 1

Проблема решена. После долгих поисков подсказок здесь, в SO, я наконец нашел этот подсказку ничем иным, как разработчиком Proguard:

-dontwarn scala.**

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

-dontwarn com.bta.**

Это сделал трюк.

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

P.S. Предложение Proguard You 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]. 

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

<ы > ОБНОВЛЕНИЕ 2: -dontwarn com.bta.** оказалось слишком включающим. Я изменил его на:

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

И теперь все хорошо работает без инцидентов. Какой кошмар.

После того, как вы потратили слишком много времени на отладку тех инструментов, которые должны были сэкономить мне время, я обнаружил источник проблемы. Это ошибка в инструментах Android SDK. Это задокументировано, как было решено в r17, но я использую последнее из сегодняшнего дня (18 июня 2012 г.) и он не был решен! (см. Комментарий 24). Комментарий 25 также описывает обходное решение, которое позволяет мне перейти к моей фактической разработке.

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

Ответ 2

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

Ответ 3

Сначала исследуйте, что говорит вам Proguard:

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 $string? Не исходный код, на данный момент нас не интересует источник. Есть ли файл .class? Если это в файловой системе, на самом деле это ссылка в файле конфигурации Proguard? Убедитесь, что вы знаете, как он должен включаться; что ссылается на com.bta.R $string? Вы, вероятно, собираетесь использовать javap, чтобы понять это.

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

-keep class com.bta.**

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

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

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

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