एआईडीएल के बारे में खास जानकारी

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

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

उदाहरण

यहां AIDL इंटरफ़ेस का उदाहरण दिया गया है:

    package my.package;

    import my.package.Baz; // defined elsewhere

    interface IFoo {
        void doFoo(Baz baz);
    }

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

यह कैसे काम करता है

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

डिवाइस पर मौजूद सेवाओं के साथ इंटरैक्ट करना

Android में कुछ कमांड होते हैं, जिनकी मदद से डिवाइस पर मौजूद सेवाओं के साथ इंटरैक्ट किया जा सकता है. ऐसा करके देखें:

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