2013-03-19 35 views
5

IServiceManager.cpp文件中,我看到了BnServiceManager::onTransact函數的定義。在AOSP中,ServiceManager實施的地方是

內部的功能,還有一種叫「addService」,「listServices」等

我無法找到這些功能(這是IServiceManager在聲明)的實施。

有人可以告訴我,在哪裏可以找到BnServiceManager的實現。

回答

8

它位於frameworks/base/cmds/servicemanager下的service_manager.c

您可能想知道他們如何找到servicemanager,這是binder的一個功能,在systemserver啓動servicemanager(service_manager.c中的main調用)之後,servicemanager將自己註冊爲binder的context_manager ioctl(bs->fd, BINDER_SET_CONTEXT_MGR, 0);。然後,您可以始終從活頁夾獲得該服務。

所以當其他服務想要使用服務管理器列出,查找或添加服務時,它會調用defaultServiceManager方法IServiceManager.cpp。該方法將查找句柄0以獲取BpServiceManager。當您使用BpServiceManager->addService時,它不會調用BnServiceManager,這與CameraService等其他服務稍有不同。活頁夾將直接解析交易代碼並在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實際的服務器端。 BpCameraService將啓動一個綁定事務,並且綁定事務最終將由BcamCameraService(CameraService)處理。

您可以搜索整個AOSP,沒有BnServiceManager的實現,所以它不可能被調用。

+0

嗨,感謝您的回覆。 我檢查了service_manager.c文件。 我看到service_manager重新綁定到綁定程序 ,句柄爲'0',以指定它是服務管理器。 因此,當服務請求(getService)進入BpServiceManager時, 是否意味着活頁夾不會調用BnServiceManager :: onTransact,而是調用在service_manager.c中註冊的svcmgr_handler? 在這種情況下,我可以知道爲什麼BnServiceManager被定義了嗎? 請糾正我,如果我的理解是錯誤的。 – Chakkra 2013-03-20 05:49:36

+0

感謝您的好解釋 – Chakkra 2013-03-20 08:27:31

+0

BnServiceManager的存在也打擾了我很多。感謝您的優雅和明確的解釋。 ~~ – 2016-03-18 18:55:08