android - ओएसजीआई बंडल में एंड्रॉइड गतिविधि




android-activity osgi (2)

मैं ओएसजीआई बंडल के विकास पर काम कर रहा हूं जो कि एंड्रॉइड के लिए पूर्ण समर्थन है। अब तक, मेरे पिछले प्रश्नों के अनुसार, मैं ओएसजीआई बंडल के अंदर एंड्रॉइड एपीआई का उपयोग करने में सक्षम था। यह ठीक काम करता है और मैं इसे करने की कोशिश की। मैं फ़ेलिक्स फ्रेमवर्क का उपयोग कर रहा हूँ

हालांकि, अब मैं एक ओएसजीआई बंडल बनाने के लिए एक एंड्रॉयड गतिविधि बनाने और उस गतिविधि को शुरू करने के मिशन पर फंस गया हूं। अनुमतियों का अनुरोध करने में सक्षम होने के लिए मुझे इन गतिविधियों की भी आवश्यकता है, इसलिए मुझे लगता है कि मुझे ओएसजीआई बंडल में AndroidManifest.xmlAndroidManifest.xml आवश्यकता होगी।

एक शोध करते समय, मैं इसे प्राप्त करने में अपने अनुभव का वर्णन करने वाले एक व्यक्ति को ढूंढने में सक्षम था। दुर्भाग्य से, उसने जो कदम उठाए हैं वह मेरे लिए अस्पष्ट है।

उनके प्रश्न "ओएसजीआई के लिए पूर्ण एंड्रॉइड सपोर्ट" में , यहां उन्होंने कहा है:

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

वह कहां कहता है:

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

मैंने जो किया है, वह एक एंड्रॉयड प्रोजेक्ट (एपीके) बनाने और पहले दो चरणों का पालन करना है। लेकिन उपरोक्त इस तीसरे चरण में, मुझे इसे संपादित करने के लिए "bundle.manifest""bundle.manifest" नहीं मिला। यह बिल्कुल नहीं है, तो वह कहता है कि इसे संपादित कैसे करें?

इसके अलावा, जब मैं Export Unsigned Android Package हूं, तो मुझे मेनिफ़ेस्ट फ़ाइल को कहां से कॉपी करना चाहिए?

अंत में, क्या अंतिम हस्ताक्षरित एपीके मेरी बंडल फ़ाइल है जिसे ढांचा से लोड किया जाना चाहिए? यह अजीब लगता है क्योंकि यह भी एक जार फ़ाइल नहीं है।

अगर ये कदम मेरी मदद नहीं करेंगे, तो क्या कोई मुझे सही दिशा में ले सकता है? धन्यवाद।

अद्यतन करें:

कोई भी मेरे प्रश्न का उत्तर नहीं देता, इसलिए मैंने निम्नलिखित किया:

1- मेरे एंड्रॉइड एप्लीकेशन प्रोजेक्ट में (जो मैं इसे बंडल के रूप में कार्य करने की कोशिश कर रहा हूं), मैंने एंड्रॉइडमैंनिस्ट। एक्सएमएल में उल्लिखित एक ही पैकेज में अपना ऐक्टिवेटर क्लास भी शामिल किया था। यहां मेरा Activator.java वर्ग:

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;



    }

}

और यहां मेरा AndroidManifest.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- मैंने अपने OSGi ढांचे (felix.jar) के लिए प्रोजेक्ट बिल्ड पथ में एक संदर्भ पुस्तकालय प्रविष्टि जोड़ा है

3- मैंने एंड्रॉइड टूल का इस्तेमाल करते हुए अपनी परियोजना की एक अहसास नहीं की गई प्रतिलिपि बनाई है।

4- मैंने META-INF नामक एक अहस्ताक्षरित कॉपी की जड़ निर्देशिका में एक फ़ोल्डर जोड़ा, और उस फ़ोल्डर के अंदर, मैंने MANIFEST.MF नामक एक फाइल को जोड़ा, उस फाइल की सामग्री है:

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- मैं मैन्युअल रूप से कमांड लाइन और जार साइनर उपकरण का उपयोग करके अहस्ताक्षरित प्रतिलिपि हस्ताक्षरित। कुछ इस तरह:

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

6- मैंने अपने पीसी पर और अपने टैब पर हस्ताक्षरित कॉपी स्थापित की है।

7- अंत में, मैं अपना आवेदन चलाता हूं, और ओएसजीआई ढांचे को उसी हस्ताक्षरित एपीके फ़ाइल को लोड करने दें।

इसका उपयोग नहीं है , हालांकि बंडल स्थिति सक्रिय है, लेकिन मैं सक्रियण प्रारंभ () पद्धति में संदेश नहीं देखता, जिसका अर्थ है कि, मेरा बंडल सही ढंग से लोड नहीं हुआ है। मैं कहाँ worng गया था? कृपया मदद करे।

25-11-2013 को अद्यतन करें

मैंने कदम ठीक से करने के लिए सुनिश्चित किया, और अब मुझे यह मिला:

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

जिसका अर्थ है कि मेरे बंडल में एक्टिवेटर क्लास नहीं है, लेकिन मुझे यकीन है कि यह करता है। क्या गलत हो सकता है?

26-11-2013 को अपडेट करें

मैंने WinZip का उपयोग करके हस्ताक्षरित APK खोला। मैंने देखा कि बंडलों के विपरीत मैं निर्माण करने के लिए इस्तेमाल किया था, हस्ताक्षरित एपीके में "Activator.class" सहित वर्ग फ़ाइलें शामिल नहीं हैं, इसलिए मैंने कॉम निर्देशिका की प्रतिलिपि बनाई जिसमें प्रोजेक्ट की सभी। वर्ग फाइलें थीं, और मैंने इसे चिपकाया हस्ताक्षरित एपीके में इसके बाद, मैंने फिर से एपीके पर हस्ताक्षर किए। अब, जब मैं एपीके स्थापित करता हूं, तो मुझे निम्न लॉग मिलता है जिसमें कई त्रुटियां होती हैं:

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

अंत में, क्या अंतिम हस्ताक्षरित एपीके मेरी बंडल फ़ाइल है जिसे ढांचा से लोड किया जाना चाहिए? यह अजीब लगता है क्योंकि यह भी एक जार फ़ाइल नहीं है । हाँ यही है। एपीके के रूप में, यह अभी भी संगत जार है, इसके अलावा इसमें डेक्स फाइल भी शामिल हैं

आपने जो कदम उठाए हैं वह मेरे लिए उचित लग रहा है। मेरे अनुभव के अनुसार, यह काम करना चाहिए था क्या आपके पास कोई भी लॉग-इन है जिसे हम शोषण कर सकते हैं? Knopflerfish कंसोल आपको स्टैकट्र्रेस देखने की अनुमति देता है जब मैन्युअल रूप से बंडलों को प्रारंभ और रोकना होता है। यह बहुत मूल्यवान है यहां।


बंडल का कोड, विशेष रूप से एक्टिवेटर क्लास, एंड्रॉइड मैनिफ़ेस्ट। एक्सएमएल में परिभाषित एक ही पैकेज में होना चाहिए और बंडल का प्रतीकात्मक नाम जरूरी भी पैकेज का नाम होना चाहिए। अगर ये स्थितियां पूरी होती हैं तो सभी कक्षाएं सही तरीके से लोड हो जाएंगी। यदि नहीं, तो रनटाइम पर java.lang.NoClassDefFound त्रुटि देखने में परिणाम होगा

आपको बंडल का संकेतन नाम और बंडल का कोड एंड्रॉइड एप्लिकेशन के समान पैकेज में रखने की आवश्यकता नहीं है, जब तक कि manifest.mf में निर्यात-पैकेज और आयात-पैकेज ठीक से सेट किया जाता है आप स्वचालित रूप से सही manifest.mf उत्पन्न करने में मदद करने के लिए bndtools ( http://bndtools.org ) का उपयोग कर सकते हैं (एक एंड्रॉइड एप्लिकेशन के लिए, bndtool हालांकि काम नहीं करता है। मुझे इसके अप्रचलित एक bnd.jar का उपयोग करना है नौकरी। bnd.jar यहां डाउनलोड किया जा सकता है: http://www.java2s.com/Code/Jar/b/Downloadbndjar.htm )





osgi-bundle