Binder, इंटरप्रोसेस कम्यूनिकेशन के लिए एक सिस्टम है. इसकी मदद से, Android डिवाइस पर मौजूद दो प्रोसेस एक-दूसरे से कम्यूनिकेट कर सकती हैं. Binder, फ़ंक्शन कॉल को किसी दूसरी प्रोसेस में एक्ज़ीक्यूट करने का तरीका उपलब्ध कराता है. यह तरीका, कॉलर के लिए पूरी तरह से पारदर्शी होता है.
बिंडर के हिसाब से, कॉल करने की प्रोसेस को क्लाइंट माना जाता है और इसके एंडपॉइंट को बिंडर प्रॉक्सी या प्रॉक्सी कहा जाता है. इसके उलट, जिस प्रोसेस को कॉल किया जा रहा है उसे सर्वर कहा जाता है. इसके एंडपॉइंट को बाइंडर नोड या नोड कहा जाता है.
हर नोड, अपने इंटरफ़ेस को दिखा सकता है और उसे लागू कर सकता है. साथ ही, प्रॉक्सी का इस्तेमाल करके क्लाइंट, नोड इंटरफ़ेस पर ऐसे तरीके लागू कर सकता है जैसे कि इनवॉकेशन, लोकल फ़ंक्शन कॉल हो. यहां दिए गए उदाहरण में, किसी तरीके को लागू करने का तरीका दिखाया गया है:
int result = someNodeInterface.foo(a, b); // someNodeInterface is a proxy object
मान लें कि foo() को कॉल करने वाला क्लाइंट, प्रोसेस A में चल रहा है और foo() को लागू करने वाला सर्वर, प्रोसेस B में चल रहा है. पहली इमेज में दिखाया गया है कि इस कॉल को कैसे एक्ज़ीक्यूट किया जाता है:
पहली इमेज. बाइंडर कॉल एक्ज़ीक्यूट किया गया.
किसी दूसरी प्रोसेस में कोई तरीका लागू करने के लिए, जैसा कि इमेज 1 में दिखाया गया है, यह होता है:
- प्रोसेस A में मौजूद क्लाइंट कोड, प्रोसेस A में मौजूद प्रॉक्सी कोड को शुरू करता है. प्रोसेस A में मौजूद प्रॉक्सी कोड, एक ऐसा लेन-देन बनाता है जिसमें ये आइटम शामिल होते हैं:
- नोड के लिए आइडेंटिफ़ायर
- नोड पर
foo()तरीके के लिए आइडेंटिफ़ायर - एक ऐसा बफ़र जिसमें
aऔरbतर्कों की कॉपी मौजूद है
- लेन-देन को बाइंडर कर्नल ड्राइवर को सबमिट किया जाता है.
- बाइंडर कर्नल ड्राइवर यह तय करता है कि प्रोसेस B, नोड को होस्ट करती है.
- कर्नल, पूरे लेन-देन को प्रोसेस B के पते की जगह पर कॉपी करता है.
- कर्नल, लेन-देन को मैनेज करने के लिए प्रोसेस B में एक थ्रेड ढूंढता है और लेन-देन को उस थ्रेड को पास कर देता है.
- यह थ्रेड, लेन-देन को अनपैक करता है, नोड ढूंढता है, और लेन-देन को नोड ऑब्जेक्ट पर भेजता है.
- नोड ऑब्जेक्ट, लेन-देन से फ़ंक्शन आइडेंटिफ़ायर हासिल करता है. साथ ही, लेन-देन बफ़र से
aऔरbको अनपैक करता है. इसके बाद,aऔरbको स्थानीय वैरिएबल में सेव करता है. - नोड ऑब्जेक्ट, प्रोसेस B में सर्वर कोड पर
foo(a, b)को कॉल करता है. - कॉल का नतीजा, जवाब के लेन-देन में मिलता है. इसे कर्नल ड्राइवर को भेजा जाता है. इसके बाद, इसे प्रोसेस A में कॉल करने वाली प्रॉक्सी को वापस भेज दिया जाता है.
- प्रॉक्सी, प्रोसेस A में कॉल करने वाले को वह नतीजा दिखाता है.
Binder के इस्तेमाल के उदाहरण
Binder का इस्तेमाल कई तरह के कामों के लिए किया जा सकता है. जैसे, अलग-अलग प्रोसेस में सॉफ़्टवेयर के बीच कम्यूनिकेशन करना. उदाहरण के लिए:
कैमरा ऐप्लिकेशन, किसी दूसरी प्रोसेस में कैमरा सर्वर से कम्यूनिकेट करने के लिए बाइंडर का इस्तेमाल करता है. इसके बाद, कैमरा सर्वर, बाइंडर का इस्तेमाल करके दूसरी प्रोसेस में मौजूद कैमरा एचएएल से कम्यूनिकेट करता है.
कोई ऐप्लिकेशन, दूसरी प्रोसेस में सिस्टम सर्वर से कम्यूनिकेट करने के लिए बाइंडर का इस्तेमाल करता है. सिस्टम सर्वर, अन्य प्रोसेस में मौजूद एचएएल से कम्यूनिकेट करने के लिए बाइंडर का इस्तेमाल करता है.
एक प्रोसेस में मौजूद ऐप्लिकेशन, दूसरी प्रोसेस में मौजूद किसी दूसरे ऐप्लिकेशन से कम्यूनिकेट करने के लिए बाइंडर का इस्तेमाल करता है.
ऐप्लिकेशन (
installd) को इंस्टॉल, अपडेट, और हटाने के लिए ज़िम्मेदार सिस्टम डेमॉन, ऐप्लिकेशन को कंपाइल करने के लिए Android रनटाइम डेमॉन ('artd') के साथ कम्यूनिकेट करने के लिए बाइंडर का इस्तेमाल करता है.
एआईडीएल और बाइंडर
प्रोग्रामिंग इंटरफ़ेस तय करने के लिए, Android इंटरफ़ेस डिज़ाइन लैंग्वेज (एआईडीएल) का इस्तेमाल करें. ये इंटरफ़ेस, आईपीसी के लिए बाइंडर का इस्तेमाल करते हैं. ज़्यादा जानकारी के लिए, AIDL की खास जानकारी देखें.