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