android - AOSP中,ServiceManager是在哪里实现的

标签 android android-source android-binder

<分区>

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 O HIDL 不可用

android - 使用 adb 获取 android 设备的芯片名称?

Android IPC LocalSocket 与 Binder (AIDL)

android - 使用 gradle (Android Studio) 和本地 maven repo 时无法构建应用程序

android - 在 fragment 中添加 GoogleMap 时的 NPE

Android AOSP——android源码中扫描间隔和扫描窗口的定义

android - 广播接收器 - 调用者验证

android - 没有IPC的Android进程默认有Binder线程池吗?