Android-Aktivität im OSGI-Bundle

Ich arbeite an der Entwicklung von OSGI-Bundles, die Android voll unterstützen. Bisher konnte ich anhand meiner vorherigen Fragen die Android-API im OSGI-Bundle verwenden. Es funktioniert gut und ich habe es versucht. Ich benutze Felix Framework.

Ich stecke jetzt jedoch bei der Mission fest, ein OSGI-Bundle zu erstellen, um eine Android-Aktivität zu haben und diese Aktivität zu starten. Ich benötige diese Aktivitäten auch, um Berechtigungen anfordern zu könnenAndroidManifest.xml im OSGI-Bundle.

Während einer Recherche konnte ich nur eine Person finden, die seine Erfahrung darin beschreibt, dies zu erreichen. Leider sind die Schritte, die er erwähnt hat, für mich nicht eindeutig.

In seiner Frage"Volle Android-Unterstützung für OSGI" Folgendes sagte er:

I have found a way to start activities owned by android bundles:

•the android bundle MUST be an APK which can be created using Eclipse Android Project
•add a Reference Library entry to the project Build Path for your OSGi framework (in my case framework.jar)
•edit bundle.manifest describing the bundle. The file is not part of the APK but will be used on build
•the bundle's code, especially the Activator class, MUST be in the same package as defined in AndroidManifest.xml AND the symbolic name of the bundle MUST be the package name as well. If these conditions are met then all of the classes will be correctly loaded. If not, it will result in seeing java.lang.NoClassDefFoundError on runtime
•Use Android Tools > Export Unsigned Android Package
•copy bundle.manifest in the unsigned APK as META-INF/MANIFEST.MF
•sign the APK using whatever certificate you want
•install the signed APK like any standard android application. Installation is required in order to have the Activity resolved. Without this the activity won't resolve and the bundle will fail
•have the OSGi framework load the bundle APK

Wo er sagt:

•edit bundle.manifest describing the bundle. The file is not part of the APK but will be used on build

Ich habe nur ein Android-Projekt (APK) erstellt und die ersten beiden Schritte ausgeführt. Aber bei diesem dritten Schritt oben konnte ich nicht finden"bundle.manifest" um es zu bearbeiten. Es ist überhaupt nicht da, wie kommt es, dass er sagt, es zu bearbeiten?

Auch wenn ichExport Unsigned Android PackageVon wo nach wo soll ich die Manifest-Datei kopieren?

Ist die endgültig signierte APK-Datei mein Bundle, das vom Framework geladen werden soll? Dies scheint seltsam, weil es nicht einmal eine JAR-Datei ist.

Wenn diese Schritte mir nicht helfen würden, kann mich dann jemand in die richtige Richtung führen? Vielen Dank.

AKTUALISIEREN:

Niemand beantwortet meine Frage, deshalb habe ich Folgendes getan:

1- In meinem Android-Anwendungsprojekt (das ich als Bundle verwenden möchte) habe ich meine Activator-Klasse in dasselbe Paket aufgenommen, das in der AndroidManifest.xml erwähnt wird. Hier ist meinsActivator.java Klasse:

package com.example.patient;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

public class Activator implements BundleActivator {

    private static BundleContext context;

    static BundleContext getContext() {
        return context;
    }


    public void start(BundleContext bundleContext) throws Exception {
        Activator.context = bundleContext;

   //I WOULD LIKE TO START THE ACTIVITY HERE TO DISPLAY THE TOAST MESSAGE
        System.out.println("Android APK Bundle Started");

    }


    public void stop(BundleContext bundleContext) throws Exception {
        Activator.context = null;



    }

}

und hier ist meineAndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.patient"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.patient.View_Patient_File_Activity"
            android:label="View Patient File" >


        </activity>
        <activity
            android:name="com.example.patient.Enter_Patient_ID_Activity"
            android:label="View Patient File" >

                        <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>
        </activity>
    </application>

</manifest>

2- Ich habe dem Projekt-Erstellungspfad für mein OSGi-Framework (felix.jar) einen Referenzbibliothekseintrag hinzugefügt.

3- Ich habe mit Android Tools eine nicht signierte Kopie meines Projekts erstellt.

4- Ich habe einen Ordner zum Stammverzeichnis der genannten nicht signierten Kopie hinzugefügtMETA-INF, und in diesem Ordner habe ich eine Datei namens hinzugefügtMANIFEST.MFUnten ist der Inhalt dieser Datei:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Patient
Bundle-SymbolicName: com.example.patient
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: com.example.patient.Activator
Import-Package: org.osgi.framework;version="1.3.0"
Bundle-RequiredExecutionEnvironment: OSGi/Minimum-1.0

5- Ich habe die nicht signierte Kopie manuell mit dem Kommandozeilen- und Jar-Signer-Tool signiert. So etwas wie:

jarsigner -verbose -keystore /path_to_keystore/mykeystore.keystore my_application.apk my_keystore_alias 

6- Ich habe die signierte Kopie auf meinem PC und auf meinem Tab installiert.

7- Schließlich starte ich meine Anwendung und lasse das OSGI-Framework dieselbe signierte Apk-Datei laden.

KEINE VERWENDUNGObwohl der Bundle-Status aktiv ist, wird die Meldung in der Methode activator start () NICHT angezeigt. Dies bedeutet, dass mein Bundle nicht korrekt geladen wurde. Wo bin ich hingegangen? Bitte helfen Sie.

UPDATE 25-11-2013

Ich habe dafür gesorgt, dass die Schritte korrekt ausgeführt wurden, und jetzt habe ich Folgendes:

11-25 17:54:08.600: W/System.err(2714): org.osgi.framework.BundleException: Not found: com.example.patient.Activator
11-25 19:22:36.590: W/System.err(6652): Caused by: java.lang.ClassNotFoundException: com.example.patient.Activator not found by com.example.patient

Das bedeutet, dass mein Bundle nicht die Activator-Klasse enthält, aber ich bin mir sicher, dass dies der Fall ist. Was könnte falsch sein?

UPDATE 26-11-2013

Ich habe die signierte APK mit WinZip geöffnet. Ich habe festgestellt, dass das signierte APK im Gegensatz zu den Bundles, die ich erstellt habe, keine .class-Dateien enthält, einschließlich der "Activator.class". Deshalb habe ich das com-Verzeichnis kopiert, das alle .class-Dateien des Projekts enthält, und es eingefügt in der signierten APK. Als nächstes habe ich diese APK erneut signiert. Wenn ich jetzt das APK installiere, erhalte ich das folgende Protokoll, das viele Fehler enthält:

11-25 23:16:25.651: D/dalvikvm(5617): DexOpt: --- BEGIN 'bundle.jar' (bootstrap=0) ---
11-25 23:16:26.271: D/dalvikvm(5617): DexOpt: --- END 'bundle.jar' (success) ---
11-25 23:16:26.271: D/dalvikvm(5617): DEX prep '/sdcard/felix-cache-1472376252.tmp/bundle1/version0.0/bundle.jar': unzip in 102ms, rewrite 620ms
11-25 23:16:26.271: W/dalvikvm(5617): Class resolved by unexpected DEX: Lcom/example/patient/Activator;(0x4074fa08):0x18a7b8 ref [Lorg/osgi/framework/BundleActivator;] Lorg/osgi/framework/BundleActivator;(0x40714410):0xbd630
11-25 23:16:26.271: W/dalvikvm(5617): (Lcom/example/patient/Activator; had used a different Lorg/osgi/framework/BundleActivator; during pre-verification)
11-25 23:16:26.271: I/dalvikvm(5617): Failed resolving Lcom/example/patient/Activator; interface 902 'Lorg/osgi/framework/BundleActivator;'
11-25 23:16:26.271: W/dalvikvm(5617): Link of class 'Lcom/example/patient/Activator;' failed
11-25 23:16:26.271: E/dalvikvm(5617): ERROR: defineClass(0x4074fa08, com.example.patient.Activator, 0x4079d468, 0, 955, 0x4073e918)
11-25 23:16:26.271: E/Zaid Log(5617): Problem installing the bundle :s
11-25 23:16:26.271: W/System.err(5617): org.osgi.framework.BundleException: Activator start error in bundle com.example.patient [1].
11-25 23:16:26.271: W/System.err(5617):     at org.apache.felix.framework.Felix.activateBundle(Felix.java:2196)
11-25 23:16:26.271: W/System.err(5617):     at org.apache.felix.framework.Felix.startBundle(Felix.java:2064)
11-25 23:16:26.271: W/System.err(5617):     at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:955)
11-25 23:16:26.271: W/System.err(5617):     at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:942)
11-25 23:16:26.271: W/System.err(5617):     at com.example.patient_application.MainActivity.onCreate(MainActivity.java:136)
11-25 23:16:26.271: W/System.err(5617):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)
11-25 23:16:26.271: W/System.err(5617):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1715)
11-25 23:16:26.271: W/System.err(5617):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1767)
11-25 23:16:26.271: W/System.err(5617):     at android.app.ActivityThread.access$1500(ActivityThread.java:122)
11-25 23:16:26.271: W/System.err(5617):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1005)
11-25 23:16:26.271: W/System.err(5617):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-25 23:16:26.271: W/System.err(5617):     at android.os.Looper.loop(Looper.java:132)
11-25 23:16:26.271: W/System.err(5617):     at android.app.ActivityThread.main(ActivityThread.java:4028)
11-25 23:16:26.271: W/System.err(5617):     at java.lang.reflect.Method.invokeNative(Native Method)
11-25 23:16:26.271: W/System.err(5617):     at java.lang.reflect.Method.invoke(Method.java:491)
11-25 23:16:26.271: W/System.err(5617):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
11-25 23:16:26.271: W/System.err(5617):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
11-25 23:16:26.271: W/System.err(5617):     at dalvik.system.NativeStart.main(Native Method)
11-25 23:16:26.271: W/System.err(5617): Caused by: java.lang.UnsupportedOperationException: can't load this type of class file
11-25 23:16:26.271: W/System.err(5617):     at java.lang.VMClassLoader.defineClass(Native Method)
11-25 23:16:26.271: W/System.err(5617):     at java.lang.ClassLoader.defineClass(ClassLoader.java:319)
11-25 23:16:26.271: W/System.err(5617):     at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.findClass(BundleWiringImpl.java:2279)
11-25 23:16:26.271: W/System.err(5617):     at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1501)
11-25 23:16:26.271: W/System.err(5617):     at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:75)
11-25 23:16:26.271: W/System.err(5617):     at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1955)
11-25 23:16:26.271: W/System.err(5617):     at java.lang.ClassLoader.loadClass(ClassLoader.java:500)
11-25 23:16:26.271: W/System.err(5617):     at org.apache.felix.framework.BundleWiringImpl.getClassByDelegation(BundleWiringImpl.java:1374)
11-25 23:16:26.271: W/System.err(5617):     at org.apache.felix.framework.Felix.createBundleActivator(Felix.java:4329)
11-25 23:16:26.271: W/System.err(5617):     at org.apache.felix.framework.Felix.activateBundle(Felix.java:2141)
11-25 23:16:26.271: W/System.err(5617):     ... 17 more

Antworten auf die Frage(3)

Ihre Antwort auf die Frage