<分区>
在 IServiceManager.cpp
文件中,我看到了 BnServiceManager::onTransact
函数定义。
在该函数中,调用了“addService
”、“listServices
”等。
我找不到那些函数的实现(在 IServiceManager 下声明)。
谁能告诉我,在哪里可以找到 BnServiceManager 的实现。
<分区>
在 IServiceManager.cpp
文件中,我看到了 BnServiceManager::onTransact
函数定义。
在该函数中,调用了“addService
”、“listServices
”等。
我找不到那些函数的实现(在 IServiceManager 下声明)。
谁能告诉我,在哪里可以找到 BnServiceManager 的实现。
最佳答案
它在 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 中获得该服务。
所以当其他服务要使用服务管理器来列出、查找或添加服务时,它会调用IServiceManager.cpp
中的defaultServiceManager
方法。该方法将查找句柄 0 以获取 BpServiceManager。当你使用BpServiceManager->addService
时,它不会调用BnServiceManager
,这与CameraService等其他服务略有不同。 Binder会直接解析事务代码,调用service_manager.c
中的do_add_service
方法。您可能会注意到 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的实现,所以调用是不可能的。
关于android - AOSP中,ServiceManager是在哪里实现的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15497860/
相关文章:
android - 将 TextView 放在另一个的右侧并使其始终可见
java - 为泛型父类(super class)型的类型参数创建 TypeToken
android - 使用 adb 获取 android 设备的芯片名称?
Android IPC LocalSocket 与 Binder (AIDL)
android - 使用 gradle (Android Studio) 和本地 maven repo 时无法构建应用程序
android - 在 fragment 中添加 GoogleMap 时的 NPE