2013-04-03 34 views
5

Tôi có một ứng dụng dựa trên Android đang kết nối với Máy ứng dụng của Google bằng dịch vụ Rest, ứng dụng hoạt động hoàn hảo cho đến khi nó bị che khuất thông qua ProGuard trước khi phát hành.ProGuard - org.codehaus.jackson.map.JsonMappingException: Không có hàm tạo phù hợp nào được tìm thấy cho loại

Các lỗi được báo cáo trong LogCat khi chạy ứng dụng khó hiểu là:

Unable to convert a [application/json,UTF-8] representation into an object of 
    class com.enterprisemk.android.bcw.bincollection.WasteCollectionAreasContainer 

org.codehaus.jackson.map.JsonMappingException: No suitable constructor found 
    for type [simple type, class 
    com.enterprisemk.android.bcw.bincollection.WasteCollectionAreasContainer]: 
    can not instantiate from JSON object (need to add/enable type information?) 

Tôi đã sau trong Proguard-project.txt tôi file:

-keepattributes *Annotation*,EnclosingMethod 

-keep public class org.w3c.** {public private protected *;} 
-dontwarn org.w3c.** 

-keep public class org.joda.time.** {public private protected *;} 
-dontwarn org.joda.time.** 

-keep public class org.restlet.** { *; } 
-dontwarn org.restlet.** 

-keep public class org.codehaus.** { *; } 
-dontwarn org.codehaus.** 

-keepattributes Signature 
-keepnames class com.fasterxml.jackson.** { *; } 
-dontwarn com.fasterxml.jackson.databind.** 

Và lớp học của tôi lỗi đề cập đến trông giống như:

public class WasteCollectionAreasContainer { 

public List<WasteCollectionAreas> wasteCollectionAreasList; 

public List<WasteCollectionAreas> getWasteCollectionAreasList() { 
    return wasteCollectionAreasList; 
} 

public void setWasteCollectionAreasist(List<WasteCollectionAreas> wasteCollectionAreasList) { 
    this.wasteCollectionAreasList = wasteCollectionAreasList; 
} 

public WasteCollectionAreasContainer() { 
    wasteCollectionAreasList = new ArrayList<WasteCollectionAreas>(); 
} 

@JsonCreator 
public WasteCollectionAreasContainer(List<WasteCollectionAreas> wasteCollectionAreasList) { 
    this.wasteCollectionAreasList = wasteCollectionAreasList; 
} 
} 

Để nhắc lại trước khi obfuscation thông qua ProGuard ứng dụng hoạt động hoàn hảo.
Có ai giúp tôi giải quyết vấn đề này không?

+0

một số thời gian progaurd loại bỏ một số lớp khỏi đường dẫn xây dựng các dự án thư viện đặc biệt. – Ankit

+0

Âm thanh như Proguard có thể đã xóa hàm tạo mặc định, không được tham số hóa cho 'WasteCollectionAreasContainer'. Lớp đó có quá trình khởi tạo quá tải không? Có thể Proguard đang loại bỏ hàm tạo mặc định * vì * có quá tải * và * nó cho rằng hàm tạo mặc định không được sử dụng ở bất kỳ đâu - điều đó có thể xảy ra vì Proguard không thể phát hiện Jackson thực sự sử dụng/yêu cầu một hàm tạo mặc định cho POJO trong thời gian chạy. –

+0

MH - điều này đặt tôi đi đúng hướng để khắc phục sự cố - cảm ơn –

Trả lời

1

Thông báo lỗi

org.codehaus.jackson.map.JsonMappingException: No suitable constructor found for type 
    [simple type, class com.enterprisemk.android.bcw.bincollection.WasteCollectionAreasContainer]: 
    can not instantiate from JSON object (need to add/enable type information?) 

gợi ý rằng thư viện Jackson đang cố gắng deserialize lớp học của bạn sử dụng phản chiếu, với tên ban đầu của nó và constructor chú thích của nó. ProGuard không thể thấy trước điều này, vì vậy nó có thể đã loại bỏ hoặc đổi tên lớp và hàm tạo của nó. Bạn có thể cần phải giữ gìn cho họ một cách rõ ràng:

-keep class com.enterprisemk.android.bcw.bincollection.WasteCollectionAreasContainer { 
    <init>(java.util.List); 
} 

Có thể có các lớp học tương tự/lĩnh vực/phương pháp khác mà cần phải được bảo tồn vì những lý do tương tự.

+0

Eric - về cơ bản, đây là những gì tôi đã làm. Và bạn đã đúng, tôi đã có các lớp/lĩnh vực/phương pháp khác cần bảo quản tương tự. Cảm ơn bạn đã phản hồi. –

2

Thêm thông tin sau vào Proguard.config của bạn. Nó sẽ giúp bạn xác định vấn đề.

-verbose 
-dump class_files.txt 
-printseeds seeds.txt 
-printusage unused.txt 
-printmapping mapping.txt 

Tôi có sau đây trong tôi tập Proguard-project.txt

Tôi tin rằng bạn nên sử dụng proguard-android-optimize.txt, và không proguard-android.txt.

Để hoàn tất, hãy cảm ơn Riley Hassell theo số Android Security Discussions để biết các thủ thuật.

+1

Bản dựng Ant/Eclipse chuẩn đã chứa các tùy chọn-in; bạn nên tìm các tệp kết quả trong thư mục bin/proguard.Bước tối ưu hóa của ProGuard xử lý mã một số chi tiết; nó thường không giải quyết bất kỳ vấn đề cấu hình nào. Tuy nhiên, nó được khuyến khích cho kết quả tốt nhất. –

1

Một giải pháp tốt hơn, trong trường hợp bất cứ ai khác có vấn đề này, như sau:

# keep anything annotated with @JsonCreator 
-keepclassmembers public class * { 
    @com.fasterxml.jackson.annotation.JsonCreator *; 
} 

Nó giúp duy trì bất kỳ phương pháp chú thích với JsonCreator, mà có lẽ là muốn làm gì trong trường hợp này. Nếu bạn có nhiều lớp cần được tải, thì bạn có thể tránh phải chỉ định từng lớp riêng lẻ.

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