专栏首页人人都是极客binder,hwbinder,vndbinder之间的关系

binder,hwbinder,vndbinder之间的关系

1 前言

先复制一段来自于android官方文档的文字 https://source.android.google.cn/devices/architecture/hidl/binder-ipc

一直以来,供应商进程都使用 Binder 进程间通信 (IPC) 技术进行通信。在 Android 8 中,/dev/binder 设备节点成为框架进程的专有节点,这意味着供应商进程无法再访问此节点。供应商进程可以访问 /dev/hwbinder,但必须将其 AIDL 接口转为使用 HIDL。对于想要继续在供应商进程之间使用 AIDL 接口的供应商,Android 会按以下方式支持 Binder IPC。

Android 8 支持供供应商服务使用的新 Binder 域,访问此域需要使用 /dev/vndbinder(而非 /dev/binder)。添加 /dev/vndbinder 后,Android 现在拥有以下 3 个 IPC 域:

2 举个例子

看了上面一段文字之后,可能很多人还是比较懵逼,我来举一个例子:

假如手机中有如下3类进程

a.应用进程:

Camera APP 手电筒 APP

b.框架进程:

System Server进程

c.供应商进程:

Camera HAL进程 Light HAL进程

这些进程之间需要使用Binder机制跨进程通信,Android提供了三个Binder设备节点dev/binder,dev/hwbinder,dev/vndbinder,也就是Android系统同时提供了三个独立运行的Binder通信模块,Android团队规定每类进程使用的这三个Binder通信模块的规则如下图:

3 三种Binder介绍以及之间的联系

3.1 dev/binder

这个是我们最熟悉的Binder,App开发中,ActivityManagerService用的都是这个,Java继承Binder,C++中继承Bbbinder,然后通过servicemanager进程注册实名Binder,然后通过已经创建好的Binder接口传递匿名Binder对象,拿到BinderProxy或者BpBinder以后,就可以Binder通信了。

3.2 dev/vndbinder

其实dev/vndbinde和dev/binder使用方式基本一样而且是共用一套Binder SDK,也是Java继承Binder,C++中继承Bbbinder,但是通过vndservicemanager进程注册实名Binder,然后通过已经创建好的Binder接口传递匿名Binder对象,拿到BinderProxy或者BpBinder以后,就可以Binder通信了。如何在使用同一套Binder SDK的代码,最后访问的设备节点变成dev/vndbinder,servicemanager变成vndservicemanager。

其实和简单,只要在你这个进程初始化的时候执行下面这个代码

ProcessState::initWithDriver("/dev/vndbinder");
dev/binder和dev/vndbinder无法在一个进程中同时使用

细心的读者肯定发现上面的图中三类进程的任意一个进程无法同时使用dev/binder和dev/vndbinder,这一点不单是android官方约定,也是目前android binder sdk的限制,因为两者都是共用Binder SDK,所以只能指定一个设备节点,要么dev/binder,要么dev/vndbinder

3.3 dev/hwbinder

那么dev/hwbinder是如何解决与dev/binder或dev/vndbinder之间的共存问题?有人肯定想到了,很简单,我们把所有Binder SDK复制一套新的Hw Binder SDK,改名成dev/hwbinder,HwBinder,HwBbinder,hwservicemanager,HwProcessState,这样子不就可以和dev/binder或dev/vndbinder共存了嘛?其实android团队就会类似这样子干的。

但是他们想hwbinder是为了规范hal层,毕竟hal层是操作硬件的,所以他们不应该提供这么自由,这么麻烦的接口定义。 他们的目标有两个: 1.不能那么自由,强制所有供应商按照android官方定义的hal接口来实现 2.不能增加供应商开发人员的学习成本,学习一套复杂的Hw Binder SDK 为了达成上述的两个目标,android团队想出了HIDL这个方案。

4 HIDL是什么

具体HIDL做了什么,我不细讲了,简单描述一下: 假如Android官方定义了一个ILight.hal的HAL层接口

Interface ILight {
    void turnOn();
    void turnOff();
}

通过编译会自动生成如下两个类LightServer和LightClient的java对象和c++对象。

供应商只需要简单的继承LightServer,并实现turnOn和turnOff的抽象方法,就可以完成Light接口的实现,以及Light服务注册到hwservicemanager。

需要使用ILight接口的进程,只需要调用LightClient的turnOn和turnOff接口,就可以完成从hwservicemanager获得Light服务的Proxy对象,以及ILight的接口调用。

HIDL与AIDL的区别

看了上面的文字描述,应该明白了HIDL比AIDL做的事情更多: AIDL在Server端串联Interface和Binder或者Bbbinder,在Client端串联Interface和BinderProxy或者Bpbinder HIDL则是串联Interface->Hw Binder SDK->dev/hwbinder

5 总结

为什么Android团队要大费周章搞出那么多Binder,我觉得有以下几个原因: 1.降低各个层之间的耦合,方便Android系统的快速移植,升级,提升系统稳定性,所以以后Android系统工程师能改的东西越来越少。 2.估计这个是Android团队绞尽脑汁想出来的KPI,我猜的。

本文分享自微信公众号 - 人人都是极客(rrgeek)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-02-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android系统架构开篇

    本文作为Android系统架构的开篇,起到提纲挈领的作用,从系统整体架构角度概要讲解Android系统的核心技术点,带领大家初探Android系统全貌以及内部运...

    刘盼
  • 通过vmstat学习CPU和进程性能监控

    vmstat是一个很全面的性能分析工具,可以观察到系统的进程状态、虚拟内存使用、磁盘的IO、中断、上下文切换、CPU使用等情况。在操作系统性能分析中,能100%...

    刘盼
  • Android技术架构演进与未来

    众所周知,Android是谷歌开发的一款基于Linux的开源操作系统,每年迭代一次大版本升级。 小米、华为、OPPO、VIVO、三星等各大厂商对Android原...

    刘盼
  • aptitude指令

    aptitude update #更新可用的包列表 aptitude upgrade #升级可用的包 aptitude dist-upgrad...

    JNingWei
  • 同步服务器系统时间操作记录

    在初始化一台linux服务器后,发现这台服务器的时间不对 [root@dev ~]# date 2016年 10月 11日 星期二 07:04:34 CST L...

    洗尽了浮华
  • 一个用来保存参数的容器类

    源哥
  • QMS产品 - MasterControl 质量管理活动

    客户抱怨/申诉/投诉,OOS/OOT,不符合项,偏差等都可是调查的来源; 最终变更后,经由变更管理、培训完成。

    用户1637609
  • 再也不用的担心错过女神的消息了!!!

    课代表
  • RK61 蓝牙机械键盘配合 karabiner 软件适配 MAC 系统脚本

    RK61 蓝牙机械键盘配合 karabiner 软件适配 MAC 系统脚本 在 mac 升级到 10.12 之后,karabiner 软件就一直在开发中。以至于...

    FungLeo
  • 加入腾讯云加社区

    本文由腾讯云+社区自动同步,原文地址 http://blogtest.stackoverflow.club/article/join_tencent_yunji...

    羽翰尘

扫码关注云+社区

领取腾讯云代金券