2013-03-19 9 views
5

IServiceManager.cpp फ़ाइल में, मुझे BnServiceManager::onTransact फ़ंक्शन परिभाषा दिखाई देती है।एओएसपी में, सर्विसमैनेजर कहां लागू किया गया है

कि समारोह के अंदर, वहाँ एक फोन है करने के लिए "addService", "listServices" आदि

मैं उन कार्यों (जो IServiceManager के तहत घोषित कर रहे हैं) के लिए कार्यान्वयन नहीं पा सके।

क्या कोई मुझे बता सकता है, BnServiceManager के कार्यान्वयन को कहां खोजें।

उत्तर

8

यह फ्रेमवर्क/बेस/सेमीडीएस/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 का कोई कार्यान्वयन नहीं है, इसलिए इसे कॉल करना संभव नहीं है।

+0

हाय, उत्तर के लिए धन्यवाद। मैं service_manager.c फ़ाइल के माध्यम से चला गया। मैं देखता हूं कि सेवा प्रबंधक प्रबंधक को हैंडल '0' के साथ खुद को पुनर्निर्मित करता है, यह निर्दिष्ट करने के लिए कि यह सेवा प्रबंधक है। तो, जब कोई servie अनुरोध (getService) BpServiceManager पर जाता है, क्या आप कहने का मतलब है कि बाइंडर BnServiceManager :: onTransact को कॉल नहीं करेगा, इसके बजाय service_manager.c में पंजीकृत svcmgr_handler को कॉल करें? उस स्थिति में, क्या मुझे पता चलेगा कि BnServiceManager को क्यों परिभाषित किया गया था? अगर मेरी समझ गलत है, तो कृपया मुझे सही करें। – Chakkra

+0

अच्छी व्याख्या के लिए धन्यवाद – Chakkra

+0

BnServiceManager का अस्तित्व मुझे भी परेशान करता है। आपके सुरुचिपूर्ण और स्पष्ट स्पष्टीकरण के लिए धन्यवाद। ~~ –

संबंधित मुद्दे