在IServiceManager.cpp
文件中,我看到了BnServiceManager::onTransact
函数定义。
在该函数内部,有一个对“ addService
”、“ listServices
”等的调用。
我找不到这些函数的实现(在 IServiceManager 下声明)。
有人可以告诉我,在哪里可以找到 BnServiceManager 的实现。
在IServiceManager.cpp
文件中,我看到了BnServiceManager::onTransact
函数定义。
在该函数内部,有一个对“ addService
”、“ listServices
”等的调用。
我找不到这些函数的实现(在 IServiceManager 下声明)。
有人可以告诉我,在哪里可以找到 BnServiceManager 的实现。
它位于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);
。然后你总是可以从 binder 获得该服务。
所以当其他服务想使用服务管理器列出、查找或添加服务时,它会defaultServiceManager
调用IServiceManager.cpp
. 该方法将查找句柄 0 以获取 BpServiceManager。使用BpServiceManager->addService
时不会调用BnServiceManager
,这与CameraService等其他服务略有不同。binder 会直接解析交易代码并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 会启动一个 binder 事务,binder 事务最终会被 BnCameraService 处理,也就是 CameraService。
你可以搜索整个AOSP,没有BnServiceManager的实现,所以它是不可能被调用的。