Ошибка работы с пост-обфускацией библиотеки Джексона с помощью Proguard - PullRequest
20 голосов
/ 06 декабря 2011

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

У меня довольно стандартное приложение для Android, которое использует вызовы REST на основе JSON для обмена данными. Я использую библиотеку Jackson для анализа данных JSON. Все работало безупречно, пока мы не решили включить обфускацию для наших сборок релиза, используя Proguard. Разобравшись с миром проблем, связанных с обратным вызовом, я, наконец, столкнулся с проблемой, связанной с библиотекой Джексона.

в принципе, строка ObjectMapper om = new ObjectMapper() - просто не работает! Я продолжаю получать следующую ошибку в этой строке:

Caused by: java.lang.ExceptionInInitializerError
    at org.codehaus.jackson.map.ObjectMapper.<clinit>(Unknown Source)
    ... 8 more
Caused by: java.lang.NullPointerException
    at org.codehaus.jackson.map.introspect.VisibilityChecker$Std.<init>(Unknown Source)
    at org.codehaus.jackson.map.introspect.VisibilityChecker$Std.<clinit>(Unknown Source)
    ... 9 more

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

Различные вещи, которые я включил в мой файл proguard.cfg ради Джексона -

-dontskipnonpubliclibraryclassmembers
-dontoptimize
-dontshrink
-libraryjars xtraLibs/joda-time-1.6.2.jar;xtraLibs/xml-apis.jar;xtraLibs/jsr311-api-0.8.jar;xtraLibs/stax2-api-3.0.0.jar;xtraLibs/httpmime-4.0.1.jar

среди них я переключил флаги dontoptimize и dontshrink. Тем не менее, результат всегда был одинаковым.

За все время, которое я потратил на решение этой проблемы, я был поражен и потрясен тем усилием, которое было вложено в библиотеку Proguard. Просто когда что-то не работает, оно немного запутано .

Версия Proguard - 4.6

1 Ответ

39 голосов
/ 07 декабря 2011

Это не очевидно из трассировки стека, но Джексону нужны некоторые аннотации, которые ProGuard удаляет по умолчанию. ЧФР. Руководство по ProGuard> Примеры> Обработка аннотаций :

-keepattributes *Annotation*,EnclosingMethod

Кроме того, как предполагает зловещее имя пакета org.codehaus.jackson.map.introspect, Джексон выполняет самоанализ анализируемых классов, чтобы найти методы получения и установки. Не зная ничего лучшего, ProGuard может удалять или переименовывать их, потому что ваш код может явно их не использовать. Возможно, вам придется их явно хранить, например ::1006

-keep public class mydatapackage.** {
  public void set*(***);
  public *** get*();
} 
...