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

Ошибка при работе с библиотекой Jackson после обфускации с использованием Proguard

после просеивания всех видов запросов, связанных с проблемами с обфускацией с использованием 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 игнорировать классы библиотеки Jackson, включать и выключать оптимизацию и уменьшать флаги, я сейчас просто не знаю.

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

-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

4b9b3361

Ответ 1

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

-keepattributes *Annotation*,EnclosingMethod

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

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