Android HIDL学习(5) ---- 设计要素
前面我们学习了如何使用HIDL来设计或者重构之前在HAL层的代码,而且也对比了一些高性能的编程方式,这里我们在来一下Android的HIDL在设计上的一些考虑。
HIDL指定了数据结构和方法的命名,这些命名类似于JAVA中的类,所以HIDL的语法对于C++和JAVA程序员来说是非常熟悉的,尽管有些关键字不怎么相同,HIDL还使用JAVA的注释方式。
HIDL设计目标HIDL的设计目标是为以后系统更新的时候不用重新编译HAL的模块,HALs被供应商或者SOC厂商负责被编译成vendor.img烧录到系统的/vendor 分区。这样子在后面系统更新的时候只需要更新vendor分区,不需要更新整个OTA包。
HIDL的设计理念平衡一下三个要素:可互操作性:在进程中创建可靠的可互相调用的接口,这种接口偶可以通过不同的交叉编译和和配置来编译成不同的架构。HIDL接口是通过版本来定义的,不同版本的接口可以在发布之后改变。
效率:HIDL的设计在进程通信间尽可能最小化拷贝的动作。HIDL定义的数据在C++标准布局数据结构中被传递到C++代码,这些数据结构可以在不解包的情况下使用。由于使用进程间通 ...
Android HIDL学习(4) ---- 高性能比较(HIDL, FMQ, MMAP)
写在前面公司一些方案,在Andoird P上架构必须要修改成HIDL,不然会遇到一系列的Selinux的问题,所以决定还是按照标准的Android HIDL的架构重新写了方案(因为比较机密,所以不透露具体方案代码)。但是我们的这个模块对性能的要求非常高,不然咱们的设备怎么能打败竞争对手呢,怎么屹立在世界500强呢,对吧。^_^因为我们做的工业设备,对实时性要求比较高,但是HIDL的设计毕竟是需要进程间通信来调用到比较low level的接口的,肯定会有一些性能损失,但是好在还有一些别的机制来挽回损失,本文就来探讨一下这个问题,以及对不同的方式做一下性能的比对。
几种不同的方式对比我们的需求是,应用层需要调用一些接口到kernel中的驱动,有一个HAL层封装了对驱动的操作,应用层去调用HAL层接口,其实就跟标准的AOSP的模块类似。那么问题就来了,以前是直接调用HAL接口,然后通过open/read/write/ioctl来跟驱动通信就好了,比较关心性能损耗就是系统调用到kernel中的时间损耗,其他都还好。但是一旦改成HIDL接口的写法,应用层就变成了HIDL的client端,调用 ...
Android HIDL学习(3) ---- 注册回调
回顾一下上一节我们学会了如何创建HIDL的server端和client端,对于那些没玩过Android O或者以上的BSP开发者而言,可以吹上一阵子牛逼了,毕竟比人家多了一个技能,面试的时候也可以装一下了^_^
OK,我们还知道了在Android O或者以上的Android版本上创建一个HAL模块的一般流程是如何的,我们这一节来看一个比较简单的东西,也是每个模块基本必不可少的一个玩意儿,那就是回调函数。
注册回调怎么个回事呢,我们来举一个栗子
我们把HAL独立为一个单独的进程,client也是一个单独的进程,那么对于一般的模块而言,都是需要从底层(HAL以及以下)获取数据,比如sensor,需要获取sensor数据,Camera,需要获取camera的raw、yuv等数据流,那么对于软件设计而言,如果是同步的话,很简单,我们通过getXXX()函数来获取即可,但是如果是异步的,比如底层的实现是中端的机制,你不知道他什么时候会出来数据,那么这个时候通常的,我们会通过callback来实现异步的回调。
看下面的图就比较清楚了
我们这一节就来实现简单的回调机制。
实战演练这个例子很简 ...
Android HIDL学习(2) ---- HelloWorld
写在前面程序员有个癖好,无论是学习什么新知识,都喜欢以HelloWorld作为一个简单的例子来开头,咱们也不例外。
OK,咱这里都是干货,废话就不多说啦,学习HIDL呢咱们还是需要一些准备工作和门槛的。
准备工作:
Android BSP编译环境
Android设备的BSP代码
Android设备,用来跑测试代码
我这边使用的是公司的设备,打个小广告哈,咱们是世界500强做Android工业手机的,这里使用最近的项目使用的设备,基于Qualcomm 骁龙660芯片,基于这个平台来做开发。
当然了,如果手头上没有设备的话,你也可以使用Andnroid模拟器做开发,Android模拟器的镜像可以使用官方的AOSP代码来编译,但是注意的是如果使用模拟器,kernel要去下载goldfish的代码,这个我这里就不赘述了,可以google了解一下。
Naruto我们需要给这个简单的例子起一个牛逼的名字,我这里叫Naruto,不要问我为什么,哥是一个铁打的火影迷,哈哈,就这么定了,就叫Naruto了,那么那么我们就来说一段故事吧:
咱们可是要写一个Android的HAL, ...
Android HIDL学习(1) ---- 简介
HIDLHAL接口定义语言(简称HIDL)适用于指定HAL和其用户之间的接口的一种接口描述语言(IDL)。HIDL允许指定类型和方法调用。从更更烦的意义上来说HIDL适用于在独立编程的代码库之间通信的系统。
HIDL旨在用于进程间通信(IPC)。进程之间的通信经过Binder化。对于必须与进程相关联的代码库,还可以使用直通模式。
HIDL可指定数据结构和方法签名,这些内容会整理归类到接口中,而接口会汇集到软件包中。尽管HIDL具有一系列不同的关键字,C++和JAVA程序员对HIDL的语法并不陌生。此外,HIDL还是用JAVA样式和注释。
扯淡一下好吧,上面这段HIDL的简介是从Android开发者官网抄过来的https://source.android.com/devices/architecture/hidl/,大家读上去可能会比较别扭,没办法本来英文挺好的,被翻译成中文就是这个鸟样了,我不是说中文不好,我负责Android开发官网中文翻译的肯定是个老外,或者就是Google翻译软件自动翻译的,反正一般人是理解不了的。
OK,我也不想从官网上去炒一堆文字来忽悠大家,毕竟大家的时间 ...





