Fout bij het werken met Jackson-bibliotheek na obfuscatie met behulp van Proguard

na het doorzoeken van allerlei vragen met betrekking tot problemen met obfuscatie met Proguard, ben ik op het punt gekomen dat ik het gevoel heb dat ik de enige is die dit specifieke probleem heeft. Vandaar de post.

Ik heb een vrij standaard Android-app die gebruikmaakt van JSON-gebaseerde REST-oproepen om gegevens uit te wisselen. Ik maak gebruik van de bibliotheek Jackson om de JSON-gegevens te ontleden. Alles werkte foutloos, totdat we besloten om obfuscation op te nemen voor onze release-builds met Proguard. Na het oplossen van een wereld van callback-gerelateerde problemen, zit ik eindelijk vast met een probleem met betrekking tot de Jackson-bibliotheek.

eigenlijk, de regel ObjectMapper om = new ObjectMapper() - werkt gewoon niet! Ik krijg steeds de volgende foutmelding op die regel:

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

Na het lezen van een groot aantal andere berichten gerelateerd aan het opnemen van externe bibliotheken, waardoor proguard de bibliotheeklessen van Jackson negeert, optimalisatie en krimpende vlaggen in- en uitschakelt, heb ik nu meteen een idee.

De verschillende dingen die ik heb opgenomen in mijn proguard.cfg -bestand omwille van Jackson -

-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

hiervan heb ik de dontoptimize en dontshrink vlaggen omgedraaid. Het resultaat is echter altijd hetzelfde gebleven.

In al de tijd die ik heb besteed aan het oplossen van dit probleem, ben ik verbaasd en onder de indruk geraakt van de inspanningen die zijn geleverd in de Proguard-bibliotheek. Alleen als dingen niet werken, zijn ze een beetje verduisterd .

Proguard version - 4.6

19

1 antwoord

It's not obvious from the stack trace, but Jackson needs some annotations, which ProGuard removes by default. Cfr. ProGuard manual > Examples > Processing annotations:

-keepattributes *Annotation*,EnclosingMethod

Bovendien, zoals de onheilspellende pakketnaam 'org.codehaus.jackson.map.introspect' suggereert, voert Jackson introspectie uit op parseercursussen om doorhalers en setters te vinden. Zonder beter te weten, kan ProGuard deze verwijderen of hernoemen, omdat uw code deze niet expliciet zou kunnen gebruiken. U moet ze misschien expliciet houden, bijvoorbeeld:

-keep public class mydatapackage.** {
  public void set*(***);
  public *** get*();
} 
38
toegevoegd
toegevoegd de auteur Hugo Gresse, de bron
Geweldige reacties. Ik had dit ook nodig: -keepclassmembers public final enum org.codehaus.jackson.annotate.JsonAutoDetect $ Visibility {public static final org.codehaus.jackson.annotate.JsonAutoDetect $ Zichtbaarheid *; }
toegevoegd de auteur Sean, de bron
Met Jackson 2.1.4 had ik deze nodig naast de bovenstaande attributen: -keepattributes Signature , -keepnames class com.fasterxml.jackson. ** {*; } , -dontwarn com.fasterxml.jackson.databind. **
toegevoegd de auteur ashughes, de bron
De bovenstaande code zal geen booleaanse getters bewaren, u moet public boolean is * (); toevoegen aan de configuratie getters/setters.
toegevoegd de auteur Denis Kniazhev, de bron
eric lafortune - heel erg bedankt ! voor iedereen die met deze situatie geconfronteerd wordt, zoek dan de oplossing van de hele postketen op het sourceforge forum - sourceforge.net/projects/proguard/forums/forum/182456/topic/‌ & hellip;
toegevoegd de auteur anirvan, de bron