Proguard проблемы с файлами JAR, как найти отсутствующий JAR? - PullRequest
13 голосов
/ 09 февраля 2011

Когда я пытаюсь экспортировать свой apk с помощью Proguard, я получаю много ошибок (более 400), подобных:

Warning: org.codehaus.jackson.jaxrs.JsonMappingExceptionMapper: can't find superclass or interface javax.ws.rs.ext.ExceptionMapper

и

org.codehaus.jackson.xc.DataHandlerJsonDeserializer$1: can't find superclass or interface javax.activation.DataSource

Я использую библиотеку Джексона Джсона , и ошибки, похоже, связаны с этим.

Исследуя эту ошибку, я нашел следующее в Proguards FAQ :

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

Поиск по SO Я нашел много вопросов без ответов, связанных с этим, но общий смысл заключался в том, что используемый мной jar-файл (в данном случае Jackon JSON) полагается на большее количество библиотек, и их нужно добавить в Proguard. Конфигурационный файл кое-как.

Однако я не могу понять, как определить, какие банки нужны и где они находятся. В предупреждениях упоминается множество различных пакетов, таких как javax.ws.rs.ext, org.joda.time, org.codehaus.stax2, javax.xml.stream и т. Д.

  1. Как определить, какие банки содержат эти пакеты? Например, какой jar требуется для классов javax.ws.rs.ext. **?
  2. Как мне определить, где находятся эти jar-файлы и какой путь будет использоваться с -libraryjars в Proguard?

Большое спасибо


Редактировать: Следует также упомянуть, что я использую Android Library Project setup. Банки находятся в основном проекте библиотеки, и у реального рабочего проекта есть свои пути сборки, включая банки в проекте библиотеки. Не знаю, имеет ли это значение, но подумал, что я должен упомянуть об этом.


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

Добавляет ли мастер экспорта Android в Eclipse автоматическое добавление / lib / jars в proguard или их нужно добавлять вручную в конфигурационный файл proguard, например:

-libraryjars C:/Project/lib/somjar.jar

Я попробовал это для Джексона, но это не имело никакого значения. Значит ли это, что мне также нужно найти все банки, которые нужны для классов, упомянутых в предупреждениях, и добавить их? Будут ли они в SDK или в установке Java?

Извините, если это глупые вопросы, но я пытался выяснить это последние пару часов и не знаю, что делать.

Еще раз спасибо


Обновите снова

Таким образом, в результате дополнительного поиска, в сочетании с предложением Бенджамина, я обнаружил, что некоторые из пропущенных классов находятся в rt.jar, который находится в папке lib на jdk. В итоге я добавил

-libraryjars  <java.home>/lib/rt.jar

В файл proguard.cfg и перенесли предупреждения с 485 до 204. Эй, я думаю, это что-то ... Остальные предупреждения описывают классы, которые я вообще не могу найти. Приложение работает нормально, без запуска Proguard, так что эти классы должны быть где-то правильно? Или эти предупреждения о том, что я должен использовать -dontwarn с?

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

org.joda.time.
org.codehaus.stax2.
javax.ws.rs.

Так что теперь мне просто нужен способ выяснить:

  1. Какие банки имеют эти классы
  2. Где эти банки, чтобы я мог включить их в конфигурационный файл proguard

Ответы [ 3 ]

5 голосов
/ 10 февраля 2011

У меня были схожие проблемы с Proguard и схожие ошибки, я использовал osmdroid.jar, который собирал OK без всяких сомнений. Этот jar должен иметь внешние зависимости, которые не нужны моему приложению. К счастью, авторы перечислили необходимые jar-файлы, и как только я скачал их и сообщил Proguard через опцию -libraryjars, сборка Proguard была в порядке.

Пересмотрите ваши недостающие банки (которые вам, вероятно, на самом деле не нужны, но Proguard считает, что вы можете!), Вы должны найти их по адресу:

org.joda.time (Банка в молнии)

org.codehaus.stax2.

javax.ws.rs.

3 голосов
/ 09 февраля 2011

Я могу дать ответ только для первой части: Дайте

http://www.findjar.com

попробовать, там вы можете найти имена необходимых jar-файлов примерно так

0 голосов
/ 08 ноября 2012

Вам не нужно включать библиотеки для Proguard; вместо этого вам нужно проинструктировать Proguard сохранить имена классов и некоторые другие вещи. Я сам немного поиграл с этим, и у меня получилось нечто похожее на это обсуждение :

-keepnames class org.codehaus.** { *; }
-keepattributes *Annotation*,EnclosingMethod
-dontwarn org.codehaus.jackson.**

Если вы все еще испытываете сбои - и я бы посоветовал провести энергичное тестирование!

-keep class org.codehaus.** { *; }
-keepattributes *Annotation*,EnclosingMethod
-dontwarn org.codehaus.jackson.**

(Обратите внимание, что последний создает больший файл.)

...