在AOSP中,ServiceManager实现在哪里

时间:2013-03-19 11:10:55

标签: android android-source android-binder

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

在该功能中,有一个呼叫" addService"," listServices"等。

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

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

1 个答案:

答案 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的实现,因此无法调用它。