2011-02-09 2 views
13

Когда я пытаюсь экспортировать свою APK с Proguard Я получаю много ошибок (более 400), похожие на:Проблемы с защитой с файлами jar, как найти недостающую банку?

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 

Я использую Jackson Json library, и ошибки, как представляется, связанные к тому, что.

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

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

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

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

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

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


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


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

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

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

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

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

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


Update Опять

Так больше поиска, в сочетании с предложением Беньямина, я нашел некоторые недостающие классы были в 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
+0

В самой первой странице Джексона, которую вы указываете, конкретно говорится, что у Джексона ** нулевая ** внешняя зависимость. Вы уверены, что проблема с Jackson JSON? – SyntaxT3rr0r

+0

@Syntax, вот что я думал, но все 485 предупреждений: * org.codehaus.jackson.something: не может найти ссылочный класс something.else * Ни одна из других библиотек, которые я использую, не дает предупреждений. В ответ на ваш вопрос, хотя, нет, я не уверен, что проблема с Джексоном. На данный момент у меня нет других причин. – cottonBallPaws

ответ

5

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

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

org.joda.time (баночка внутри почтового индекса)

org.codehaus.stax2.

javax.ws.rs.

+0

Это сработало, спасибо! Я загрузил их в каталог за пределами моего проекта и добавил полный путь к ним в файле proguard.cfg, таком как * -libraryjars C: /FullPathTo/JarLocations/jar.jar*, и, наконец, он смог завершить. Я оставлю это без ответа до конца дня, если у кого-то еще есть что-то еще, чтобы добавить эту проблему. Еще раз спасибо. – cottonBallPaws

3

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

http://www.findjar.com

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

+0

@Laurel: Спасибо, что сообщили мне! –

+0

Нет проблем! Это часть [большого проекта] (http://meta.stackoverflow.com/questions/321494) для очистки коротких ссылок. Я рад, что кто-то наконец признал один из моих комментариев. – Laurel

0

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

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

Если вы по-прежнему возникают сбои —, и я хотел бы предложить тестирование энергично! — вы можете сохранить Джексона полностью нетронутыми с:

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

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