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

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

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

उदाहरण

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

    package my.package;

    import my.package.Baz; // defined elsewhere

    interface IFoo {
        void doFoo(Baz baz);
    }

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

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

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

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

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

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