2013-02-25 7 views
16

Tôi có jar bên thứ 3 (mà tôi không thể thay đổi) có sử dụng java.beans.Introspector, java.beans.BeanInfojava.beans.PropertyDescriptor.Sử dụng lọ sử dụng java.beans lớp (Introspector, BeanInfo hoặc PropertyDescriptor)

Tôi có thể sử dụng bình đó trong ứng dụng Android của mình bằng cách nào?

Nó vẫn thất bại nạp lớp (trong đó sử dụng Introspector) từ jar bên thứ 3:

WARN/dalvikvm(780): VFY: unable to resolve static method 6325: Ljava/beans/Introspector;.getBeanInfo (Ljava/lang/Class;)Ljava/beans/BeanInfo; 
WARN/dalvikvm(780): VFY: unable to resolve exception class 962 (Ljava/beans/IntrospectionException;) 
WARN/dalvikvm(780): Verifier rejected class Lorg/thirdpartyjar/SomeClass; 
+0

Nếu thay đổi bình bên thứ 3 được cho phép, có thể sử dụng [openbeans] (http://code.google.com/p/openbeans/), mặc dù không có sẵn trên [maven central] (http: // search.maven.org/#search|ga|1|openbeans). –

+2

Có vẻ như không có giải pháp thay thế, vì vậy tôi đã tạo [một vấn đề Android để hỗ trợ java.beans] (http://code.google.com/p/android/issues/detail?id=51642). –

Trả lời

9

Giải pháp duy nhất là một cơn ác mộng duy trì: Ngã ba tất cả các lọ bên thứ 3 từ nguồn và viết lại chúng để chúng không sử dụng java.beans. * Classes (có thể bằng cách thay thế chúng cho openbeans).

Sau đó, mỗi lần một trong những lọ bên thứ 3 đó phát hành bản sửa lỗi khẩn cấp (ví dụ như một lỗi bảo mật quan trọng), hãy làm điều đó trên một lần nữa.

+1

Sao [vấn đề này] (https://code.google.com/p/android/issues/detail?id=51642) nếu bạn muốn android sửa lỗi đó. –

12

Đó là java.beans rõ ràng gói không hoàn thành trên Android. Và giải pháp phổ biến là đóng gói lại cả java.beans và jar phụ thuộc vào chúng để sử dụng tên gói khác thay vì java.beans. Đây chính xác là những gì mà Openbeans đã đề cập trước đó. Và một qoute thú vị từ thông báo lỗi android cho biết: If you find that you cannot do this, then that is an indication that the path you are on will ultimately lead to pain, suffering, grief, and lamentation.

Để tránh đường dẫn này, tôi sẽ bắt đầu bằng cách xem xét các tùy chọn thực sự sử dụng openbeans và cố buộc bên thứ ba sử dụng chúng. Từ những gì bạn đang viết nó không rõ ràng nếu bình không thể thay đổi hoặc không được phép thay đổi (bạn đề cập đến cả hai). Tôi không biết ý nghĩa pháp lý của việc thay đổi lọ, nhưng về mặt kỹ thuật, nó luôn có thể, ví dụ: thử các lớp kỹ sư đảo ngược, làm một số công cụ xây dựng thời gian với thứ gì đó như aspectj. Nếu điều này không được cho phép, tôi nghĩ rằng thiết bị đo thời gian chạy có thể được thực hiện, ví dụ: dexmaker có thể tạo proxy cho lớp bên thứ ba của bạn, đang sử dụng java.beans và bạn có thể triển khai lại một phần của lớp này.

Cũng googling một chút về chủ đề tôi thấy this. Họ chỉ sử dụng gói java.beans và biên dịch nó cho android. Điều này có vẻ mong manh đối với tôi, nhưng có vẻ như nó hoạt động.

Thật không may đây không phải là giải pháp, chỉ là ý tưởng tôi muốn chia sẻ. Hy vọng bạn tìm thấy những hữu ích.

+2

btw của ý tưởng thú vị. Thông điệp chính thức của Android thực sự bị thiển cận, vì về cơ bản chúng cấm sử dụng các thư viện Java chuẩn hóa JSR (như JAXB, JAXRS, JPA, DI, ...). Vì vậy, về cơ bản nhập khẩu javax.inject (được sử dụng bởi google guice) không hoạt động? –

+2

Cảm ơn. Vâng, guice cũng sử dụng com.google.inject. Nhưng tôi nghĩ bạn có thể đúng như googling cho thấy mọi người chỉ sử dụng tùy chọn --core-library bỏ qua cảnh báo trong thông báo lỗi, ví dụ: trước khi được đề cập [javax.inject] (https://code.google.com/p/google-guice/issues/detail?id=674) – efan

+1

Hmm, có thể "cung cấp cho dx cờ - thư viện lõi" thực sự là giải pháp cho toàn bộ vấn đề. Thú vị :) –