2011-12-06 205 views
19

在使用Proguard瀏覽各種有關問題和混淆的查詢後使用Jackson庫後混淆的錯誤,我已經到了讓我覺得我可能只是只有一個具有此特定問題。因此,這個職位。使用Proguard使用Proguard

我有一個相當標準的android應用程序,它使用基於JSON的REST調用來交換數據。我利用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 

在這些,我已經切換了dontoptimizedontshrink標誌。但結果始終如一。

在我一直試圖解決這個問題的時候,我一直對進入Proguard圖書館的努力感到驚訝和敬畏。只是當事情不起作用時,他們有點混淆

Proguard的版本 - 4.6

回答

38

這不是從堆棧跟蹤顯而易見的,但傑克遜需要一些註釋,其中的ProGuard刪除默認。 (CFR)。 ProGuard的手冊>實施例>Processing annotations

-keepattributes *Annotation*,EnclosingMethod 

此外,作爲不祥包名稱「org.codehaus.jackson.map.introspect」所暗示的,Jackson的解析類執行內省找到getter和setter。沒有更好的瞭解,ProGuard可能會刪除或重命名這些內容,因爲您的代碼可能不會明確使用它們。您可能必須明確保留,例如:

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

eric lafortune - 非常感謝你**非常**! 面對這種情況的任何人,請在sourceforge論壇尋找整個郵件鏈的解決方案 - https://sourceforge.net/projects/proguard/forums/forum/182456/topic/4867948/index/page/1 – anirvan

+22

隨着傑克遜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 $ Visibility { public static final org.codehaus.jackson.annotate.JsonAutoDetect $ Visibility *; } – Sean