2011-12-06 14 views
19

Proguardを使用して問題が発生した場合のすべての種類のクエリを精査した後、私はしか持っていないと感じています問題。したがって、ポスト。Proguardを使用してJacksonライブラリのポスト難読化でエラーが発生しました

JSONベースのREST呼び出しを使用してデータを交換する、かなり標準的なAndroidアプリがあります。私はJacksonライブラリを使ってJSONデータを解析します。 Proguardを使用してリリースビルドに難読化を組み込むことを決定するまで、すべてが完璧に動作していました。コールバック関連の問題の世界を整理した後、ついにジャクソンのライブラリに関連する問題に悩まされています。

基本的には、ObjectMapper om = new ObjectMapper()のラインは機能しません。私は、フラグを最適化オンオフや縮小、ProGuardのは、ジャクソンライブラリクラスを無視すること、を含む外部ライブラリに関連する他の記事のホストを読んだ後

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.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 

は、私がdontoptimizedontshrinkフラグを切り替えました。しかし、結果は常に同じでした。

私はこの問題を解決しようと努力していましたが、私はProguardライブラリに取り組んできたことに驚くようになりました。事がうまくいかないときは、ちょっとちょっとだよ。は、難読化されたです。

ProGuardのバージョン - 4.6

答えて

38

これは、スタックトレースから明らかではないが、ジャクソンは、ProGuardのがデフォルトで削除され、いくつかの注釈を、必要とします。 Cfr。 ProGuardのマニュアルには>例>Processing annotations:不吉なパッケージ名「org.codehaus.jackson.map.introspect」のとおり

-keepattributes *Annotation*,EnclosingMethod 

さらに、ジャクソンはゲッターとセッターを見つけるために、解析されたクラスにイントロスペクションを実行します。 ProGuardはコードを明示的に使用しない可能性があるため、これ以上のことを知らなくても、これらの名前を削除したり、名前を変更したりしている可能性があります。あなたは、例えば、明示的にそれらを維持する必要があります。:

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

エリックlafortune - **どうもありがとうございましたので、**! このような状況に直面している方は、sourceforgeフォーラム(https://sourceforge.net/projects/proguard/forums/forum/182456/topic/4867948/index/page/1)のメールチェーン全体から解決策を探してください。 – anirvan

+22

Jackson 2.1.4では、上記の属性に加えて、これらを必要としました: '-keepattributes Signature'、' -keepnames class com.fasterxml.jackson。** {*; } '、' -dontwarn com.fasterxml.jackson.databind。** ' – ashughes

+0

素晴らしいコメント。私もこれが必要でした: -keepclassmembers public final enum org.codehaus.jackson.annotate.JsonAutoDetect $可視性{ public static final org.codehaus.jackson.annotate.JsonAutoDetect $ Visibility *; } – Sean

関連する問題