एआईडीएल अवलोकन

एंड्रॉइड इंटरफेस डेफिनिशन लैंग्वेज (एआईडीएल) एक ऐसा उपकरण है जो उपयोगकर्ताओं को आईपीसी को दूर करने देता है। एक इंटरफेस (एक में निर्दिष्ट देखते हुए .aidl फ़ाइल), विभिन्न निर्माण प्रणाली का उपयोग aidl क्रम या bitness वहाँ की परवाह किए बिना, द्विआधारी सी ++ या जावा बाइंडिंग का निर्माण करने के लिए इतना है कि इस इंटरफेस प्रक्रियाओं में इस्तेमाल किया जा सकता।

AIDL का उपयोग Android में किसी भी प्रक्रिया के बीच किया जा सकता है: प्लेटफ़ॉर्म घटकों के बीच या ऐप्स के बीच। हालाँकि, इसे कभी भी ऐप्स के लिए API के रूप में उपयोग नहीं किया जाता है। उदाहरण के लिए, एआईडीएल का उपयोग मंच में एसडीके एपीआई को लागू करने के लिए किया जा सकता है, लेकिन एसडीके एपीआई सतह में सीधे एआईडीएल एपीआई नहीं होते हैं। कैसे सीधे एप्लिकेशन के बीच AIDL का उपयोग करने के बारे में दस्तावेज़ीकरण के लिए, इसी को देखने से Android डेवलपर प्रलेखन । AIDL मंच घटकों, जैसे कि apexes के रूप में है कि अलग से अपडेट किया जाता है के बीच प्रयोग किया जाता है या HALs (एंड्रॉयड 10 में शुरू) (एंड्रॉयड 11 में शुरू), वर्ज़निंग रूप में जाना जाता प्रणाली स्थिर AIDL इस्तेमाल किया जाना चाहिए।

उदाहरण

एआईडीएल इंटरफ़ेस का एक उदाहरण यहां दिया गया है:

    package my.package;

    import my.package.Baz; // defined elsewhere

    interface IFoo {
        void doFoo(Baz baz); // synchronous method
        oneway void doFoo(int a); // async method
    }

Android 10 और उच्चतर समर्थन पार्सल योग्य घोषणाएं। उदाहरण के लिए:

    package my.package;

    import my.package.Boo;

    parcelable Baz {
        @utf8InCpp String name = "baz";
        Boo boo;
    }

Android 11 और उच्चतर समर्थन एनम घोषणाएं। उदाहरण के लिए:

    package my.package;

    enum Boo {
        A = 1 * 4,
        B = 3,
    }

Android 12 और उच्चतर समर्थन संघ घोषणाएं। उदाहरण के लिए:

    package my.package;

    import my.package.FooSettings;
    import my.package.BarSettings;

    union Settings {
        FooSettings fooSettings;
        BarSettings barSettings;
        @utf8InCpp String str;
        int number;
    }

एंड्रॉइड टी (एओएसपी प्रयोगात्मक) और उच्च समर्थन नेस्टेड प्रकार की घोषणाएं। उदाहरण के लिए:

    package my.package;

    import my.package.Baz;

    interface IFoo {
        void doFoo(Baz.Nested nested);  // defined my/package/Baz.aidl
        void doBar(Bar bar);            // defined below

        parcelable Bar { ... }          // union/enum types can be nested, while
                                        // an interface can't.
    }

एक सर्वर प्रक्रिया एक अंतरफलक पंजीकृत करता है और यह करने के लिए कॉल में कार्य करता है, और एक ग्राहक प्रक्रिया उन इंटरफेस के कॉल करता है। कई मामलों में, एक प्रक्रिया क्लाइंट और सर्वर दोनों के रूप में कार्य करती है क्योंकि यह कई इंटरफेस को संदर्भित कर सकती है। इन इंटरफेस का उपयोग करने के लिए उपलब्ध विभिन्न runtimes के बारे में अधिक जानकारी के लिए, AIDL बैकेंड । इस प्रकार की घोषणाएँ किसी दी गई भाषा में वर्ग घोषणा की तरह होती हैं, लेकिन वे सभी प्रक्रियाओं में काम करती हैं।

यह काम किस प्रकार करता है

AIDL कॉल करने के लिए बाइंडर कर्नेल ड्राइवर का उपयोग करता है। जब आप कॉल करते हैं, तो एक विधि पहचानकर्ता और सभी ऑब्जेक्ट्स को बफर पर पैक किया जाता है और रिमोट प्रक्रिया में कॉपी किया जाता है जहां एक बाइंडर थ्रेड डेटा पढ़ने के लिए प्रतीक्षा करता है। एक बार जब एक बाइंडर थ्रेड लेन-देन के लिए डेटा प्राप्त करता है, तो थ्रेड स्थानीय प्रक्रिया में एक देशी स्टब ऑब्जेक्ट को देखता है, और यह वर्ग डेटा को अनपैक करता है और स्थानीय इंटरफ़ेस ऑब्जेक्ट पर कॉल करता है। यह स्थानीय इंटरफ़ेस ऑब्जेक्ट वह है जिसे सर्वर प्रक्रिया बनाता है और पंजीकृत करता है। जब एक ही प्रक्रिया और एक ही बैकएंड में कॉल किए जाते हैं, तो कोई प्रॉक्सी ऑब्जेक्ट मौजूद नहीं होता है, और इसलिए कॉल बिना किसी पैकिंग या अनपैकिंग के सीधे होते हैं।

डिवाइस पर सेवाओं के साथ सहभागिता

डिवाइस पर सेवाओं के साथ इंटरैक्ट करने की अनुमति देने के लिए एंड्रॉइड कुछ कमांड के साथ आता है। प्रयत्न:

    adb shell dumpsys --help # listing and dumping services
    adb shell service --help # sending commands to services for testing