2011-12-06 22 views
19

sau khi quét qua tất cả các loại truy vấn liên quan đến vấn đề w/obfuscation bằng Proguard, tôi đã đến thời điểm tôi cảm thấy mình là chỉ có vấn đề. Do đó, bài đăng.Lỗi khi làm việc với thư viện sau obfuscation của Jackson bằng cách sử dụng Proguard

Tôi có một ứng dụng Android khá chuẩn, sử dụng các cuộc gọi REST dựa trên JSON để trao đổi dữ liệu. Tôi sử dụng thư viện Jackson để phân tích cú pháp dữ liệu JSON. Tất cả mọi thứ đã được làm việc hoàn hảo, cho đến khi chúng tôi quyết định kết hợp obfuscation cho bản phát hành của chúng tôi xây dựng bằng cách sử dụng Proguard. Sau khi phân loại ra một thế giới của các vấn đề liên quan đến gọi lại, cuối cùng tôi đã mắc kẹt với một vấn đề liên quan đến thư viện Jackson.

về cơ bản, dòng ObjectMapper om = new ObjectMapper() - không hoạt động! Tôi tiếp tục nhận được lỗi sau tại dòng đó:

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 

Sau khi đọc một loạt bài đăng khác liên quan đến thư viện bên ngoài, bật và tắt tối ưu hóa và thu hẹp cờ, tôi chỉ không biết gì ngay bây giờ.

Những điều khác nhau tôi đã bao gồm trong tập tin proguard.cfg của tôi vì lợi ích của 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 

giữa này, tôi đã bật các dontoptimizedontshrink cờ. Tuy nhiên, kết quả luôn luôn giống nhau.

Trong suốt thời gian tôi đã bỏ ra để cố giải quyết vấn đề này, tôi đã ngạc nhiên và lo lắng bởi những nỗ lực đi vào thư viện Proguard. Chỉ khi mọi thứ không hoạt động, chúng hơi bị làm mờ.

phiên bản Proguard - 4,6

Trả lời

38

Nó không rõ ràng từ vết đống, nhưng Jackson cần một số chú thích, mà ProGuard loại bỏ theo mặc định. Cfr. ProGuard thủ công> Ví dụ>Processing annotations:

-keepattributes *Annotation*,EnclosingMethod 

Bên cạnh đó, như tên gói đáng ngại 'org.codehaus.jackson.map.introspect' cho thấy, Jackson thực hiện mẫn trên lớp phân tích cú pháp để tìm getter và setter. Nếu không biết rõ hơn, ProGuard có thể xóa hoặc đổi tên chúng, vì mã của bạn có thể không sử dụng chúng một cách dễ dàng. Bạn có thể phải giữ chúng rõ ràng, ví dụ:

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

eric lafortune - cảm ơn bạn rất nhiều **! cho bất kỳ ai khác phải đối mặt với tình huống này, vui lòng tìm giải pháp từ toàn bộ chuỗi thư tại diễn đàn sourceforge - https://sourceforge.net/projects/proguard/forums/forum/182456/topic/4867948/index/page/1 – anirvan

+22

Với Jackson 2.1.4 tôi cần những điều này ngoài các thuộc tính trên: '-keepattributes Signature',' -keepnames class com.fasterxml.jackson. ** {*; } ',' -dontwarn com.fasterxml.jackson.databind. ** ' – ashughes

+0

Nhận xét tuyệt vời. Tôi cũng cần điều này: -keepclassmembers public enum org.codehaus.jackson.annotate.JsonAutoDetect $ Visibility { public static final org.codehaus.jackson.annotate.JsonAutoDetect $ Visibility *; } – Sean

Các vấn đề liên quan