7

IServiceManager.cpp文件中,我看到了BnServiceManager::onTransact函数定义。

在该函数内部,有一个对“ addService”、“ listServices”等的调用。

我找不到这些函数的实现(在 IServiceManager 下声明)。

有人可以告诉我,在哪里可以找到 BnServiceManager 的实现。

4

1 回答 1

10

它位于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的实现,所以它是不可能被调用的。

于 2013-03-20T00:37:08.533 回答