• Binder 域


    多个 Binder 域

    android12-release

    Binder系列1-Binder Driver
    Binder系列2-ServiceManager
    Binder系列3-framework层


    1. Binder域:binder,hwbinder,vndbinder

    在这里插入图片描述

    都是Binder IPC,查看 Binder系列1-Binder Driver binder_init() -> init_binder_device(device_name) 注册misc设备节点
    对应设备节点:/dev/binder/dev/hwbinder/dev/vndbinder

    drivers/android/binder.c
    kernel/configs/android-base.config
    char *binder_devices_param = CONFIG_ANDROID_BINDER_DEVICES;
    CONFIG_ANDROID_BINDER_DEVICES=binder,hwbinder,vndbinder
    在这里插入图片描述

    2. init.rc文件启动ServiceManager

    上边是kernel底层misc设备节点添加

    2.1 /dev/binder 框架/应用进程之间的 IPC,使用 AIDL 接口

    Binder系列2-ServiceManager

    frameworks/native/cmds/servicemanager/servicemanager.rc

    • 进程名:servicemanager
    • bin文件:/system/bin/servicemanager
    • 对应启动入口:frameworks/native/cmds/servicemanager/main.cpp

    2.2 /dev/hwbinder 框架/供应商进程之间的 IPC,使用 HIDL 接口;供应商进程之间的 IPC,使用 HIDL 接口

    system/hwservicemanager/hwservicemanager.rc

    • 进程名:hwservicemanager
    • bin文件:/system/bin/hwservicemanager
    • 对应启动入口:system/hwservicemanager/service.cpp

    2.3 /dev/vndbinder 供应商/供应商进程之间的 IPC,使用 AIDL 接口

    与/dev/binder是同一入口,通过rc文件参数区分const char* driver = argc == 2 ? argv[1] : "/dev/binder";
    /dev/vndbinder是两个参数service vndservicemanager /vendor/bin/vndservicemanager /dev/vndbinder

    frameworks/native/cmds/servicemanager/vndservicemanager.rc

    • 进程名:vndservicemanager
    • bin文件:/vendor/bin/vndservicemanager
    • 对应启动入口:frameworks/native/cmds/servicemanager/main.cpp

    3. defaultServiceManager获取

    • /dev/binder获取方法defaultServiceManager(),如mediaserver.rc启动通过binder/IServiceManager.hdefaultServiceManager()(frameworks/native/libs/binder/IServiceManager.cpp)

    frameworks/av/media/mediaserver/mediaserver.rc
    frameworks/av/media/mediaserver/main_mediaserver.cpp
    frameworks/av/media/libmediaplayerservice/MediaPlayerService.cpp

    #include 
    #include 
    #include 
    #include 
    
    void MediaPlayerService::instantiate() {
        defaultServiceManager()->addService(
                String16("media.player"), new MediaPlayerService());
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • /dev/hwbinder获取方法defaultServiceManager()(system/libhidl/transport/ServiceManagement.cpp)
    sp<IServiceManager1_0> defaultServiceManager() {
        return defaultServiceManager1_2();
    }
    sp<IServiceManager1_1> defaultServiceManager1_1() {
        return defaultServiceManager1_2();
    }
    sp<IServiceManager1_2> defaultServiceManager1_2() {
        using android::hidl::manager::V1_2::BnHwServiceManager;
        using android::hidl::manager::V1_2::BpHwServiceManager;
    
        static std::mutex& gDefaultServiceManagerLock = *new std::mutex;
        static sp<IServiceManager1_2>& gDefaultServiceManager = *new sp<IServiceManager1_2>;
    
        {
            std::lock_guard<std::mutex> _l(gDefaultServiceManagerLock);
            if (gDefaultServiceManager != nullptr) {
                return gDefaultServiceManager;
            }
    
            if (access("/dev/hwbinder", F_OK|R_OK|W_OK) != 0) {
                // HwBinder not available on this device or not accessible to
                // this process.
                return nullptr;
            }
    
            waitForHwServiceManager();
    
            while (gDefaultServiceManager == nullptr) {
                gDefaultServiceManager =
                    fromBinder<IServiceManager1_2, BpHwServiceManager, BnHwServiceManager>(
                        ProcessState::self()->getContextObject(nullptr));
                if (gDefaultServiceManager == nullptr) {
                    LOG(ERROR) << "Waited for hwservicemanager, but got nullptr.";
                    sleep(1);
                }
            }
        }
    
        return gDefaultServiceManager;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • /dev/vndbinder获取方法defaultServiceManager(),从上面2.3查看与/dev/binder共用一套libbinder,这里通过ProcessState::self()ProcessState::initWithDriver("/dev/vndbinder")切换,默认kDefaultDriver = "/dev/binder";因此两者使用时,每次只能指定一个设备节点,不能同时使用。左图mediaserver.rc启动,右图CameraProvider进程启动(CameraProvider进程-Android12
      在这里插入图片描述 在这里插入图片描述
  • 相关阅读:
    sqlalchemy expire_all 方法详解,强制刷新会话缓存
    Mybatis--关联关系映射
    运维工程师怎么找兼职?什么样的兼职合适?
    如何在SOLIDWORKS中更改单位-硕迪科技
    java计算机毕业设计VUE商场库存管理系统源码+数据库+系统+lw文档
    选举
    MySQL执行查询语句时出现停滞状态,出现Waiting for table metadata lock的问题
    水库大坝安全管理主要问题和维护措施
    【js】日时分秒倒计时
    基于隐式神经网络表达的数据压缩
  • 原文地址:https://blog.csdn.net/qq_23452385/article/details/126331353