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

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

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

उदाहरण

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

    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 in my/package/Baz.aidl
        void doBar(Bar bar);            // defined below

        parcelable Bar { ... }          // nested type definition
    }

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

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

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

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

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

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