2010-02-09 6 views
6

Meine Android-Anwendung kann in eine Client-UI-Ebene und eine API-Ebene unterteilt werden. Ich möchte sie als separate "Anwendungen" bereitstellen, so dass die API-Ebene wiederverwendet werden kann.Android: Wie benutze ich "uses-library"?

In Eclipse schreibe ich sie als 2 separate Android-Projekte. Im Client-UI-Projekt deklariere ich das API-Projekt in seinem Erstellungspfad (Projekt -> Properties -> Java Build Path -> Projects).

Bei der Bereitstellung des Client-UI-Projekts über Eclipse (auf meinem tatsächlichen G1-Telefon) wird automatisch das API-Projekt (in APK verpackt) bereitgestellt.

Wenn jedoch die Client-UI Anwendung starten, ich diesen Fehler treffen:

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) 

umsah, es scheint wie ich sollte Uses-Bibliothek unter Anwendung in der Manifest-Datei für den UI-Client erklären.

Frage ist, was sollte ich unter Android setzen: Name für uses-Bibliothek? Dev Guide sagt "der Name der Bibliothek" aber wie heißt die Bibliothek? (Ich meine, in meiner API "Anwendung" habe ich keinen Bibliotheksnamen irgendwo erklärt.)

Antwort

10

Ich glaube nicht, <uses-library> ist hier relevant.

Ihre Optionen sind:

  1. Implementieren Sie Ihre „Bibliothek“ als JAR, bei der Kompilierung in anderen Projekten einbezogen werden. Solange Ihre Bibliothek nicht versucht, Ressourcen zu definieren, sind Sie in guter Verfassung. Sehen Sie die CWAC-Projekte auf meiner github page für Beispiele, wie Sie dies einrichten.

  2. Implementieren Sie Ihre "Bibliothek" als separates APK, das einen Remote-Service enthält, der mit AIDL definiert wurde. Versuchen Sie nicht, ihre Build-Pfade wie in Eclipse zu mixen, sondern folgen Sie den AIDL-Regeln und verwenden Sie für jedes Projekt eine gemeinsame AIDL-Definition. Sie müssen auch dafür sorgen, dass Ihre Benutzer beide APKs installieren.

  3. Implementieren Sie Ihre "Bibliothek" als separates APK mit einem ContentProvider. Versuchen Sie nicht, ihre Build-Pfade wie in Eclipse zu mischen, sondern folgen Sie den ContentProvider Regeln und lassen Sie den Client über eine ContentResolver und eine definierte Uri auf den Provider zugreifen. Sie müssen auch dafür sorgen, dass Ihre Benutzer beide APKs installieren.
+1

Vielen Dank! Wie es aussieht, ist Option 1 am besten anwendbar. Ich werde Ihre Projekte als Referenz betrachten. –

+0

Hallo CommonsWare, ich habe mir dein CWAC-Cache-Projekt angeschaut. 1. Ich kann sehen, dass Sie Ant build.xml verwenden, um das JAR zu erstellen und zu assemblieren. Für ein anderes Projekt, das dieses JAR verwendet, richten Sie es in Eclipse so ein, dass (a) zum Zeitpunkt des Codierens/Kompilierens die Abhängigkeit aufgelöst wird und (b) sie zum Zeitpunkt der Bereitstellung in ein einzelnes APK integriert und bereitgestellt werden ? 2. Ich nehme an, dass CWAC-Cache nicht als eigenständiges Programm ausgeführt werden soll (bin ich richtig?). Warum müssen Sie in diesem Fall noch eine Aktivität in der AndroidManifest.xml mit einer MAIN-Aktion und einer LAUNCHER-Kategorie konfigurieren? Ist das erforderlich? –

+0

Einfach: Ich benutze Eclipse nicht. :-) CWAC-Cache hat eine Beispiel-Demo-Aktivität (wenn Sie die APK kompilieren), aber seine primäre Rolle ist das 'ant jar'-Ziel, um die JAR nur des tatsächlichen Caching-Codes zu erstellen, den andere Projekte verwenden können. Die "ant jar" -Task überspringt den Demo-Code (isoliert in einem '.demo'-Unterpaket). – CommonsWare