यह फ्रेमवर्क/बेस/सेमीडीएस/servicemanager के तहत service_manager.c में है।
आप कैसे वे servicemanager लगता है के बारे में सोच सकता है, यह systemserver शुरू servicemanager (service_manager.c में मुख्य कहते हैं) के बाद, servicemanager ioctl(bs->fd, BINDER_SET_CONTEXT_MGR, 0);
से बांधने की मशीन के एक context_manager रूप में खुद को पंजीकृत करेंगे बांधने की मशीन की एक विशेषता है,। फिर आप हमेशा उस सेवा को बांधने से प्राप्त कर सकते हैं।
तो जब अन्य सेवा की सूची बनाना, देखने या एक सेवा जोड़ने के लिए सेवा प्रबंधक का उपयोग करना चाहते हैं, यह IServiceManager.cpp
में defaultServiceManager
विधि कॉल करेंगे। यह विधि BpServiceManager प्राप्त करने के लिए हैंडल 0 को देखेगी। जब आप BpServiceManager->addService
का उपयोग करते हैं, तो यह BnServiceManager
पर कॉल नहीं करेगा, यह कैमरा सेवा जैसी अन्य सेवा के साथ थोड़ा अलग है। बाइंडर सीधे लेनदेन कोड का विश्लेषण करेगा और service_manager.c
में do_add_service
विधि को कॉल करेगा। आप देख सकते हैं कि BpServiceManager द्वारा उपयोग किया गया लेनदेन कोड svcmgr_handler में से एक के साथ बिल्कुल समान है।
//transaction code used by svcmgr_handler
enum {
SVC_MGR_GET_SERVICE = 1,
SVC_MGR_CHECK_SERVICE,
SVC_MGR_ADD_SERVICE,
SVC_MGR_LIST_SERVICES,
};
//transaction code used by BpServiceManager.
enum {
GET_SERVICE_TRANSACTION = IBinder::FIRST_CALL_TRANSACTION, //0x00000001
CHECK_SERVICE_TRANSACTION,
ADD_SERVICE_TRANSACTION,
LIST_SERVICES_TRANSACTION,
};
केवल servicemanager इस तरह काम करता है, अन्य BpService फोन करेगा उनके BnService, उदाहरण के लिए, CameraService BnCameraService फैली हुई है, तो यह CameraService की वास्तविक सर्वर साइड है। बीपी कैमरे सेवा एक बाइंडर लेनदेन शुरू करेगी, और बाइंडर लेनदेन अंततः बीएनकेमेरा सेवा द्वारा संभाला जाएगा, जो कैमरा सेवा है।
आप संपूर्ण एओएसपी खोज सकते हैं, BnServiceManager का कोई कार्यान्वयन नहीं है, इसलिए इसे कॉल करना संभव नहीं है।
हाय, उत्तर के लिए धन्यवाद। मैं service_manager.c फ़ाइल के माध्यम से चला गया। मैं देखता हूं कि सेवा प्रबंधक प्रबंधक को हैंडल '0' के साथ खुद को पुनर्निर्मित करता है, यह निर्दिष्ट करने के लिए कि यह सेवा प्रबंधक है। तो, जब कोई servie अनुरोध (getService) BpServiceManager पर जाता है, क्या आप कहने का मतलब है कि बाइंडर BnServiceManager :: onTransact को कॉल नहीं करेगा, इसके बजाय service_manager.c में पंजीकृत svcmgr_handler को कॉल करें? उस स्थिति में, क्या मुझे पता चलेगा कि BnServiceManager को क्यों परिभाषित किया गया था? अगर मेरी समझ गलत है, तो कृपया मुझे सही करें। – Chakkra
अच्छी व्याख्या के लिए धन्यवाद – Chakkra
BnServiceManager का अस्तित्व मुझे भी परेशान करता है। आपके सुरुचिपूर्ण और स्पष्ट स्पष्टीकरण के लिए धन्यवाद। ~~ –