binder,hwbinder,vndbinder之间的关系

昨天发的那篇技术文之后,这篇文章我觉得可以给大家更加耳目一新,特别是因为其中的例子和白话文。

昨天文章如下

Android-你真的懂AIDL的oneway嘛?


以下是正文



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,我猜的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467976.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

modbus协议手册_20种PLC元件编号和Modbus编号地址对应表

曾经做过单片机和以下20种PLC的Modbus RTU串口通信,现将这20种PLC输入、输出和寄存器元件与Modbus编号地址对应表分享出来。三菱FX3G-40MR/ES-A、西门子S7-200 CPU226 AC/DC/RLY、欧姆龙CP1H-X40DR-A、松下AFPX-C40R、台达DVP-12SA2、信捷XC5-48、永宏FBs-40MC、产电…

写代码获取全国疫情地图

今天在朋友圈看到一个同学写的python获取全国疫情地图,我觉得挺有意思的,这个分享给大家,如果喜欢python的,可以通过这个作为入门手段。1、安装python看这个链接来安装,非常的小白https://www.liaoxuefeng.com/wiki/10…

八大排序算法的python实现(三)冒泡排序

代码: #coding:utf-8 #author:徐卜灵 #交换排序.冒泡排序 L [1, 3, 2, 32, 5, 4] def Bubble_sort(L):for i in range(len(L)):for j in range(i1,len(L)):if L[i]>L[j]:# temp L[j]# L[j] L[i]# L[i] tempL[i], L[j] L[j], L[i]#交换顺序print L Bubble_so…

泛型类有什么作用_3 分钟带你彻底搞懂 Java 泛型背后的秘密

优质文章,及时送达作者 | 的一幕来源 | www.jianshu.com/p/dd34211f2565这一节主要讲的内容是java中泛型的应用,通过该篇让大家更好地理解泛型,以及面试中经常说的泛型类型擦除是什么概念,今天就带着这几个问题一起看下:举一个简单…

实现Linux系统的回收站

今天偶然看到一个有意思的shell脚本,用脚本实现Linux系统下的回收站,推荐给大家。今天我们利用简单的shell脚本实现Linux系统下的回收站机制。先提供脚本代码[rootqll251 ~]# vim /bin/delete1 #! /bin/bash2 [ ! -d /.recycle ] && mkdir -v /.…

RobotFramework自动化测试框架的基础关键字(五)

1.1.1 Run Keyword If判断的使用 Run Keyword If是一个常用的用来做逻辑判断的关键字,意思是如果满足了某一个判断条件,然后就会执行关键字,我们对list3中放入0,1,2三个元素,然后遍历list3,判断当取到元素为0时…

python按位翻转_Python成为专业人士笔记-位操作符

“专业人士笔记”系列目录:创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!​zhuanlan.zhihu.com按位操作符直接操作二进制的字符串,这些是最基本的操作,并直接由中央处理器所支持。在处理设备…

我看三国有感而发

三国到现在已经过去一千多年了,关羽先生应该还淹没在失去荆州的痛苦中,关羽先生出现的时候充满了一股傲气,这种站着向上仰望30度角的男人非常稀有,应该是几百年才出现一个,而且还要生于乱世,可惜啊可惜&…

pil库修改图片大小_Gvcode库:一个更简单的、华人开源的、自动生成验证码的python库...

1 说明:1.1 gvcode全称:graphic-verification-code。1.2 基本介绍,一秒搞懂。1.3 并对源码进行修改一个小bug,教您如何修改源码,解决bug。2 准备:2.1 官网:https://pypi.org/project/graphic-ve…

iOS获取某个日期后n个月的日期

一、给一个时间,给一个数,正数是以后n个月,负数是前n个月;1 -(NSDate *)getPriousorLaterDateFromDate:(NSDate *)date withMonth:(NSInteger)month2 3 {4 5 NSDateComponents *comps [[NSDateComponents alloc] init];6 …

Android-AB系统OTA升级介绍

什么是OTA升级?OTA是Over-the-Air的简称,OTA升级可以理解为用户正常使用过程中进行升级,OTA 升级旨在升级基础操作系统、系统分区上安装的只读应用和/或时区规则。什么是Android AB系统更新A/B 系统升级,也叫做无缝更新&#xff0…

python输出进度条 tqdm_python-tqdm进度条

Tqdm 进度条可视化模块2018-12-04 14:34:25 使用python Tqdm进度条库让你的python进度可视化 Tqdm在阿拉伯语表示进步,在西班牙语中表示我非常爱你.是一个快速,可扩展的Python进度条, ...Python字符进度条Python字符进度条 看看这个神奇的module from tqdm import trange from …

看完少年的你,想到少年的我

别人喜欢听故事,所以我就讲故事,我可以不是现在的我,但是我还是原来的我,我从一个很小的地方来,我小时候,家里赚钱很难,读书是一件很苦的事情,但是呢,读书又是一件非常光…

伤感网络验证系统_知网查重报告单能造假?验证报告单真伪时,知网只给了这一个办法...

这是论文屋推送的第5篇文章,论文代发寻渠道,就到论文屋。现在的修图功能太强大了有木有?除了专业的一点的AdobePhotoshop之外,任何的一款修图软件甚至手机软件都可以更改一张图的任何地方,最重要的是,技术高…

jQuery: 整理3---操作元素的内容

1.html("内容") ->设置元素的内容&#xff0c;包含html标签&#xff08;非表单元素&#xff09; <div id"html1"></div><div id"html2"></div>$("#html1").html("<h2>上海</h2>") …

安卓系统监听system property值?

预备知识-什么是system propertysystem property是系统属性&#xff0c;以key-value格式保存。可以通过以下方式读取和修改system property的值&#xff1a;1.adbadb shell getprop <key> adb shell setprop <key> <value>2.C/Cint property_get(const char…

为什么全天坐在电脑前会让你精疲力竭

Tips 原文作者&#xff1a;Katie Heaney 原文地址&#xff1a;Why Sitting at Your Computer All Day Can Wipe You Out 像大多数日子一样&#xff0c;我昨天大部分时间坐在我认为是公寓最美丽的一角&#xff0c;一直在笔记本电脑打字。 我提交了一个故事&#xff0c;转述了几个…

这届全明星,把NBA又燃回来了

第一个罚球&#xff0c;戴维斯出手后&#xff0c;听到哐当医生&#xff0c;皮球掉了出来。我又紧张了。微信群了很多人开始发消息&#xff0c;说詹姆斯队又要输了。回到比赛。戴维斯当时没有任何微笑&#xff0c;我估计他内心也是紧张的&#xff0c;他有点埋怨哈登&#xff0c;…

PYTHON__ ITERTOOLS模块

组成 总体&#xff0c;整体了解 无限迭代器 迭代器 参数 结果 例子 count() start, [step] start, startstep, start2*step, ... count(10) --> 10 11 12 13 14 ... cycle() p …

redis分布式锁java代码_基于redis实现分布式锁

“ 在上一篇文章中介绍了动态配置定时任务&#xff0c;其中的原理跟spring 定时任务注解Scheduled一样的&#xff0c;都是通过线程池和定义执行时间来控制。来思考一个问题&#xff0c;如果我们的定时任务在分布式微服务里面呢&#xff1f;在分布式微服务里面一个微服务肯定可以…