2010-02-09 42 views
6

Ứng dụng Android của tôi có thể được chia thành lớp giao diện người dùng ứng dụng và lớp API. tôi muốn triển khai chúng dưới dạng "ứng dụng" riêng biệt để lớp API có thể được sử dụng lại.Android: Cách sử dụng "sử dụng thư viện"?

Trong Eclipse, tôi viết chúng thành 2 dự án Android riêng biệt. Trong dự án UI của khách hàng, tôi khai báo dự án API trong đường dẫn xây dựng của nó (Project -> Properies -> Java Build Path -> Projects).

Khi triển khai dự án UI khách hàng thông qua Eclipse (trên điện thoại G1 thực tế của tôi), nó cũng tự động triển khai dự án API (được đóng gói thành APK).

Tuy nhiên, khi triển khai các ứng dụng giao diện người dùng của khách hàng, tôi nhấn lỗi này:

Uncaught handler: thread main exiting due to uncaught exception 
java.lang.VerifyError: myapp.android.testuiclient.Main 
    at java.lang.Class.newInstanceImpl(Native Method) 
    at java.lang.Class.newInstance(Class.java:1472) 
    at android.app.Instrumentation.newActivity(Instrumentation.java:1097) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2316) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417) 
    at android.app.ActivityThread.access$2100(ActivityThread.java:116) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:123) 
    at android.app.ActivityThread.main(ActivityThread.java:4203) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:521) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549) 
    at dalvik.system.NativeStart.main(Native Method) 

Nhìn xung quanh, nó dường như như tôi nên tuyên bố sử dụng thư viện dưới ứng dụng trong file manifest cho khách hàng UI.

Câu hỏi là, tôi nên đặt gì dưới android: tên cho sử dụng-thư viện? Hướng dẫn của Dev cho biết "tên của thư viện" nhưng tên thư viện là gì? (ý tôi là, trong ứng dụng "API" của tôi, tôi chưa từng khai báo bất kỳ tên thư viện nào.)

Trả lời

10

Tôi không tin rằng <uses-library> có liên quan ở đây.

lựa chọn của bạn là:

  1. Thực hiện "thư viện" của bạn như một JAR, được bao gồm trong các dự án khác tại thời gian biên dịch. Vì vậy, miễn là thư viện của bạn không cố gắng xác định tài nguyên, bạn đang ở trong hình dạng tốt. Xem các dự án CWAC trên github page của tôi để biết các ví dụ về cách thiết lập điều này.

  2. Triển khai "thư viện" của bạn dưới dạng APK riêng biệt chứa dịch vụ từ xa, được xác định bằng AIDL. Đừng cố gắng pha trộn các đường dẫn xây dựng của chúng như bạn hiện đang thực hiện trong Eclipse, nhưng thực hiện theo các quy tắc AIDL và mỗi dự án sử dụng một định nghĩa AIDL chung. Bạn cũng cần sắp xếp để người dùng cài đặt cả hai APK.

  3. Triển khai "thư viện" của bạn dưới dạng APK riêng biệt có chứa ContentProvider. Đừng cố gắng pha trộn các đường dẫn xây dựng của họ như bạn hiện đang làm trong Eclipse, nhưng thực hiện theo các quy tắc ContentProvider và yêu cầu khách hàng truy cập vào nhà cung cấp qua ContentResolver và Uri đã xác định. Bạn cũng cần sắp xếp để người dùng cài đặt cả hai APK.
+1

Cảm ơn! Từ giao diện của nó, tùy chọn 1 là áp dụng nhất. Tôi sẽ xem xét các dự án của bạn để tham khảo. –

+0

Hi CommonsWare, tôi đã xem xét dự án CWAC-Cache của bạn. 1. tôi có thể thấy rằng bạn sử dụng Ant build.xml để xây dựng và lắp ráp JAR. Đối với một dự án khác để sử dụng JAR đó, làm thế nào để bạn thiết lập nó trong Eclipse để (a) tại thời gian mã hóa/biên dịch, phụ thuộc được giải quyết, và (b), vào thời gian triển khai, chúng được xây dựng thành một APK duy nhất và được triển khai ? 2. tôi cho rằng CWAC-Cache không có nghĩa là chạy độc lập (am i correct?). Trong trường hợp đó, tại sao bạn vẫn cần cấu hình một Activity trong AndroidManifest.xml với một hành động CHÍNH và một loại LAUNCHER? Điều đó có cần thiết không? –

+0

Đơn giản: Tôi không sử dụng Eclipse. :-) CWAC-Cache có một hoạt động demo mẫu (nếu bạn biên dịch APK), nhưng vai trò chính của nó là mục tiêu 'ant jar' để tạo ra JAR chỉ là mã bộ nhớ đệm thực tế mà các dự án khác có thể sử dụng. Tác vụ 'ant jar' bỏ qua mã trình diễn (cô lập trong gói phụ' .demo'). – CommonsWare

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