在IServiceManager.cpp
文件中,我看到了BnServiceManager::onTransact
函数定义。
在该功能中,有一个呼叫" addService
"," listServices
"等。
我无法找到这些函数的实现(在IServiceManager下声明)。
有人可以告诉我,在哪里可以找到BnServiceManager的实现。
答案 0 :(得分:10)
它位于service_manager.c,位于frameworks / base / cmds / servicemanager下。
你可能想知道他们如何找到servicemanager,它是binder的一个特性,在systemserver启动servicemanager(在service_manager.c中调用main)之后,servicemanager将自己注册为ioctl(bs->fd, BINDER_SET_CONTEXT_MGR, 0);
的binder_manager。 。然后你总是可以从活页夹获得该服务。
因此,当其他服务想要使用服务管理器列出,查找或添加服务时,它会在defaultServiceManager
中调用IServiceManager.cpp
方法。该方法将查找句柄0以获取BpServiceManager。当您使用BpServiceManager->addService
时,它不会调用BnServiceManager
,这与其他服务(如CameraService)略有不同。绑定器将直接解析事务代码并在do_add_service
中调用service_manager.c
方法。您可能会注意到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将启动一个活页夹事务,绑定器事务最终将由BnCameraService处理,它是CameraService。
您可以搜索整个AOSP,没有BnServiceManager的实现,因此无法调用它。