Aktywność Androida w pakiecie OSGI

Pracuję nad tworzeniem pakietów OSGI, które mają pełne wsparcie dla Androida. Do tej pory, dzięki moim poprzednim pytaniom, byłem w stanie użyć android API w pakiecie OSGI. Działa dobrze i próbowałem. Używam frameworka Felix.

Jednak utknąłem teraz na misji tworzenia pakietu OSGI, aby mieć aktywność w Androidzie i rozpocząć tę aktywność. Potrzebuję również tych działań, aby móc zażądać uprawnień, więc myślę, że będę potrzebowałAndroidManifest.xml w pakiecie OSGI.

Podczas badania udało mi się znaleźć tylko jedną osobę opisującą jego doświadczenie w osiągnięciu tego. Niestety kroki, o których wspomniał, są dla mnie niejednoznaczne.

W jego pytaniu„Pełna obsługa systemu Android dla OSGI” , Oto co powiedział:

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

Gdzie mówi:

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

Wszystko, co zrobiłem, to stworzyć projekt android (APK) i wykonać pierwsze dwa kroki. Ale w tym trzecim kroku powyżej nie mogłem znaleźć"bundle.manifest" aby go edytować. W ogóle go tam nie ma, więc dlaczego on mówi, że go edytujesz?

Także, kiedy jaExport Unsigned Android Package, skąd mam skopiować plik manifestu?

Wreszcie, czy końcowy podpisany plik APK jest moim pakietem, który powinien zostać załadowany przez framework? Wydaje się to dziwne, ponieważ nie jest to nawet plik jar.

Jeśli te kroki mi nie pomogą, to czy ktoś może mnie poprowadzić we właściwym kierunku? Dziękuję Ci.

AKTUALIZACJA:

Nikt nie odpowiada na moje pytanie, więc zrobiłem co następuje:

1- W moim projekcie aplikacji dla systemu Android (który próbuję sprawić, aby działał jako pakiet) włączyłem moją klasę Activator do tego samego pakietu wymienionego w pliku AndroidManifest.xml. Oto mojaActivator.java klasa:

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;



    }

}

a oto mojaAndroidManifest.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- Dodałem wpis biblioteki referencyjnej do ścieżki budowania projektu dla mojego szkieletu OSGi (felix.jar)

3- Wygenerowałem niepodpisaną kopię mojego projektu przy użyciu narzędzi Android.

4- Dodałem folder do katalogu głównego niepodpisanej kopii o nazwieMETA-INFi wewnątrz tego folderu dodałem plik o nazwieMANIFEST.MFponiżej znajduje się zawartość tego pliku:

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- Ręcznie podpisałem niepodpisaną kopię za pomocą wiersza poleceń i narzędzia podpisującego jar. Coś jak:

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

6- Zainstalowałem podpisaną kopię na moim komputerze i na karcie.

7- Na koniec uruchamiam aplikację i pozwalam, aby struktura OSGI załadowała ten sam podpisany plik apk.

NIE UŻYWAĆ, chociaż status pakietu jest aktywny, ale NIE widzę komunikatu w metodzie start () aktywatora, co oznacza, że ​​mój pakiet nie został poprawnie załadowany. Gdzie się pogorszyłem? Proszę pomóż.

AKTUALIZACJA 25-11-2013

Upewniłem się, że wykonałem kroki poprawnie, a teraz mam to:

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

Oznacza to, że mój pakiet nie zawiera klasy Aktywatora, ale jestem pewien, że tak. Co może być nie tak?

AKTUALIZACJA 26-11-2013

Otworzyłem podpisany APK przy użyciu WinZip. Zauważyłem, że w przeciwieństwie do pakietów, które budowałem, podpisany plik APK nie zawiera plików .class, w tym „Activator.class”, więc skopiowałem katalog com zawierający wszystkie pliki .class projektu i wkleiłem go w podpisanym APK. Następnie ponownie podpisałem APK. Teraz, kiedy instaluję APK, otrzymuję następujący dziennik, który zawiera wiele błędów:

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

questionAnswers(3)

yourAnswerToTheQuestion