Android 在AOSP中,ServiceManager在哪里实现
在Android 在AOSP中,ServiceManager在哪里实现,android,android-source,android-binder,Android,Android Source,Android Binder,在IServiceManager.cpp文件中,我看到了BnServiceManager::onTransact函数定义 在该函数中,有一个对“addService”、“listServices”等的调用 我找不到这些函数(在IServiceManager下声明)的实现 谁能告诉我,在哪里可以找到BnServiceManager的实现。在frameworks/base/cmds/servicemanager下 您可能想知道他们是如何找到servicemanager的,这是binder的一个功能,
IServiceManager.cpp
文件中,我看到了BnServiceManager::onTransact
函数定义
在该函数中,有一个对“addService
”、“listServices
”等的调用
我找不到这些函数(在IServiceManager下声明)的实现
谁能告诉我,在哪里可以找到BnServiceManager的实现。在frameworks/base/cmds/servicemanager下
您可能想知道他们是如何找到servicemanager的,这是binder的一个功能,在systemserver启动servicemanager(在service\u manager.c中调用main)之后,servicemanager将通过ioctl(bs->fd,binder\u SET\u context\u MGR,0)将自己注册为binder的上下文\u管理器代码>。然后你就可以从活页夹上得到服务了
因此,当其他服务想要使用服务管理器列出、查找或添加服务时,它将调用IServiceManager.cpp
中的defaultServiceManager
方法。该方法将查找句柄0以获取BpServiceManager。当您使用BpServiceManager->addService
时,它不会调用BnServiceManager
,这与CameraService等其他服务略有不同。活页夹将直接解析事务代码,并在service\u manager.c
中调用do\u add\u service
方法。您可能会注意到BpServiceManager使用的事务代码与svcmgr_处理程序中的事务代码完全相同
//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事务最终将由bncomeraservice处理,bncomeraservice就是CameraService
您可以搜索整个AOSP,因为没有BnServiceManager的实现,所以不可能调用它 嗨,谢谢你的回复。我浏览了service_manager.c文件。我看到服务管理器使用句柄“0”将自己重新注册到绑定器,以指定它是服务管理器。那么,当一个服务请求(getService)转到BpServiceManager时,您的意思是说绑定器不会调用BnServiceManager::onTransact,而是调用在service_manager.c中注册的svcmgr_处理程序吗?在这种情况下,我可以知道为什么要定义BnServiceManager吗?如果我的理解是错误的,请纠正我。BnServiceManager的存在也让我很不安。感谢你优雅而清晰的解释~~感谢您很久以前就回答了这个问题,但是如果有人感兴趣,BpServiceManager
已经定义好了