在AOSP中,ServiceManager实现在哪里

Cha*_*kra 7 android android-source android-binder

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

在该功能内部,有一个" addService"," listServices"等的调用.

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

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

Sta*_*kER 10

它位于service_manager.c中,位于frameworks/base/cmds/servicemanager下.

您可能想知道他们如何找到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等其他服务略有不同.绑定器将直接解析事务代码和调用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,
    };
Run Code Online (Sandbox Code Playgroud)

只有servicemanager这样工作,其他BpService会调用他们的BnService,例如,CameraService扩展了BnCameraService,因此它是CameraService的实际服务器端.BpCameraService将启动一个绑定器事务,绑定器事务最终将由BnCameraService处理,即CameraService.

您可以搜索整个AOSP,没有BnServiceManager的实现,因此无法调用它.