Проблемы с защитой с файлами jar, как найти недостающую банку?
Когда я пытаюсь экспортировать 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
Я использую библиотеку Jackson Json, и ошибки, похоже, связаны с этим.
Исследуя эту ошибку, я нашел следующее из Часто задаваемые вопросы по защите}:
Если есть нерешенные ссылки на классы или интерфейсы, вы, скорее всего, забыли указать важную библиотеку. Для правильной обработки необходимо указать все библиотеки, на которые ссылается ваш код, включая библиотеку времени выполнения Java. Для указания библиотек используйте параметр -libraryjars.
Поиск вокруг на SO Я нашел много неотвеченных вопросов, связанных с этим, но общий смысл заключался в том, что файл jar, который я использую (в данном случае Jackon JSON), опирается на большее количество библиотек, и их необходимо добавить в Proguard config файл каким-то образом.
Однако я не могу понять, как определить, какие банки нужны и где они находятся. В предупреждениях упоминается множество разных пакетов, таких как javax.ws.rs.ext, org.joda.time, org.codehaus.stax2, javax.xml.stream и т.д.
- Как определить, какие банки содержат эти пакеты? Например, какой jar требуется для классов javax.ws.rs.ext. **?
- Как узнать, где эти банки, и какой путь будет использоваться с -libraryjars в Proguard?
Спасибо большое
Изменить: Следует также упомянуть, что я использую Android Library Project. Банки находятся в главном проекте библиотеки, и у фактического рабочего проекта есть пути его сборки, включая банки в проекте библиотеки. Не знаю, если это имеет значение, но я думал, что должен упомянуть об этом.
Обновить. Чтобы проверить, я полностью удалил джексон далеко от пути сборки и моего кода, и теперь Proguard успешно завершен. Вопросы все еще остаются... Каков правильный подход для обработки этих ошибок?
Является ли мастер экспорта Android в Eclipse автоматически добавляет /lib/jars в proguard или все они должны быть добавлены вручную в файле конфигурации proguard следующим образом:
-libraryjars C:/Project/lib/somjar.jar
Я попробовал это для Jackson, но это не имело никакого значения. Означает ли это, что мне также нужно найти все банки, которые необходимы для классов, упомянутых в предупреждениях, и добавить их? Будут ли они в sdk или в java-установке?
Извините, если это глупые вопросы, но я пытался понять это в течение последних двух часов и понятия не имею, что делать.
Еще раз спасибо
Обновить снова
Итак, больше поиска в сочетании с предложением Бенджамина я обнаружил, что некоторые из отсутствующих классов были в rt.jar, который находится в папке jdk lib. Поэтому я добавил
-libraryjars <java.home>/lib/rt.jar
В файл proguard.cfg и вывел предупреждения с 485 до 204. Эй, я думаю, что-то... Оставшиеся предупреждения описывают классы, которые я вообще не могу найти. Приложение работает отлично, не запуская proguard, поэтому эти классы должны быть где-то в порядке? Или эти предупреждения, что я должен использовать -dontwarn
с?
Остальные классы находятся в этих пакетах:
org.joda.time.
org.codehaus.stax2.
javax.ws.rs.
Итак, теперь мне просто нужно выяснить:
- Какие банки имеют эти классы
- Где эти банки, поэтому я могу включить их в конфигурационный файл proguard
Ответы
Ответ 1
У меня были аналогичные проблемы с Proguard и аналогичными ошибками, которые я использовал osmdroid.jar, который построил OK, не искаженный. В этой банке должны быть внешние зависимости, которые мне не нужны. К счастью, авторы указали необходимые банки, и как только я их загрузил и сказал Proguard с помощью опции -libraryjars, сборка Proguard была в порядке.
Восстановите свои недостающие банки (которые вам, вероятно, не нужны, но Proguard думает, что вы могли бы!), вы должны найти их по адресу:
org.joda.time
(Ящик внутри zip)
org.codehaus.stax2.
javax.ws.rs.
Ответ 2
Я могу дать ответ только для первой части:
Дайте
http://www.findjar.com
Попробуйте, там вы можете найти имена необходимых файлов jar
вот так
Ответ 3
Вам не нужно включать библиотеки для Proguard; вам нужно вместо этого проинструктировать Proguard, чтобы сохранить имена классов и некоторые другие вещи. Я немного поиграл с ним, и у меня получилось нечто похожее на обсуждение:
-keepnames class org.codehaus.** { *; }
-keepattributes *Annotation*,EnclosingMethod
-dontwarn org.codehaus.jackson.**
Если вы все еще испытываете аварийные ситуации, и я бы предлагал тестирование энергично! Возможно, вы захотите оставить Джексона полностью неповрежденным:
-keep class org.codehaus.** { *; }
-keepattributes *Annotation*,EnclosingMethod
-dontwarn org.codehaus.jackson.**
(Обратите внимание, что последний создает файл большего размера.)