Android HIDL学习(整理1)
概述
HAL 接口定义语言(简称 HIDL,发音为“hide-l”)是用于指定 HAL 和其用户之间的接口的一种接口描述语言 (IDL)。HIDL 允许指定类型和方法调用(会汇集到接口和软件包中)。从更广泛的意义上来说,HIDL 是用于在可以独立编译的代码库之间进行通信的系统。
HIDL 旨在用于进程间通信 (IPC)。进程之间的通信采用 Binder 机制。对于必须与进程相关联的代码库,还可以使用直通模式(在 Java 中不受支持)。
HIDL 可指定数据结构和方法签名,这些内容会整理归类到接口(与类相似)中,而接口会汇集到软件包中。尽管 HIDL 具有一系列不同的关键字,但 C++ 和 Java 程序员对 HIDL 的语法并不陌生。此外,HIDL 还使用 Java 样式的注释。
详细可以了解官方参考链接
入手准备
程序员有个癖好,无论是学习什么新知识,都喜欢以HelloWorld作为一个简单的例子来开头,咱们也不例外。
OK,咱这里都是干货,废话就不多说啦,学习HIDL呢咱们还是需要一些准备工作和门槛的。
准备工作:
Android BSP编译环境, 需要做整编
Android 设备的BSP代码
Android设备,用来跑测试代码
我这边使用的是MTK的一款设备,基于Android O系统这个平台来做开发。
当然了,如果手头上没有设备的话,你也可以使用Andnroid模拟器做开发,Android模拟器的镜像可以使用官方的AOSP代码来编译,但是注意的是如果使用模拟器,kernel要去下载goldfish的代码,这个我这里就不赘述了,可以google了解一下。
实例应用
接下来我们开始第一个HIDL应用实例,我们需要给这个简单的例子起一个牛逼的名字,我这里叫Naruto,不要问我为什么,哥是一个铁打的火影迷,哈哈,就这么定了,就叫Naruto了,那么那么我们就来说一段故事吧:
咱们可是要写一个Android的HAL,大家不要把初衷搞混了,我们看看AOSP有哪些HAL:
- Camera
- Audio
- Sensor
- 等等

这些啊都是Android设备上的硬件,因为Google理论上只关心Android的框架层和上层软件,但是上层软件依赖于底层的硬件实现,但是每家手机厂商,或者说是CPU厂商底层硬件的实现都是不一样的,所以这个HAL层基本都是手机厂商或者CPU厂商去实现的,Google只是作为一个框架的指导,和Framework层API的接口定义,这些接口的实现都得由HAL去完成。
那么我们的Naruto就肩负了这个重任喽,控制底层硬件嘛,底层硬件都是由Linux kernel驱动控制的,提供文件读写就可以简单控制驱动啦,咱们这边就搞虚拟驱动好了,省略了kernel driver的实现;
等等,我们这个是HelloWorld,好吧,Naruto,你就提供一个HelloWorld的接口吧,大材小用了。目的是让我们知道写一个HIDL的流程这就够了!!!
1.HIDL接口文件定义
进入代码,我们假设Naruto作为标准AOSP的HAL,我们就把代码揉进标准HAL(hardware/interface)层去,进入代码目录创建HIDL目录:
mkdir -p hardware/interfaces/naruto/1.0/default
接着创建接口描述文件INaruto.hal,放在刚才创建的1.0/目录中:
// INaruto.hal
package android.hardware.naruto@1.0;
interface INaruto {
helloWorld(string name) generates (string result);
};
没错这是一个Google定义的语言格式具体数据类型转换请查看对应关系,C++和Java的结合体,我相信咱们搞Android BSP来发的,什么语言不会呢,对不:
- 汇编:bootloader和kernel中可能会用到
- C语言:这你丫不会,你玩毛的Linux Kernel啊
- C++:这你丫不会,你就别搞Android底层开发了,HAL和中间库
- Java:这么再不会就自杀吧,framework和app的代码都是Java的
- Python:这个不会么也没事,编译相关的
- Shell:这个不可能不会
- Makefile:肯定会的,不会跳楼吧
这里我们定义了一个INaruto接口文件,简单的添加了一个helloWorld接口,传入是一个string,返回一个string,后面我们会来实现这个接口。
2. 生成HAL相关文件
如上,hal接口文件已经定义完成,接下来我们需要继承实现这个接口,那么我们应该如何继承如何编写呢,幸运的是Google还是帮我们提供了一套工具hidl-gen来生成HAL层相关的代码框架和代码实例,这样子我们只需要关心实现部分,而不需要写一堆无用代码,浪费时间在搞Makefile和一些低级错误上。
- hidl-gen 可以自动帮我们生成hal层实例框架和Android.mk/bp编译控制
因此,系统已经帮我们提供了一个执行脚本hardware/interface/update-makefiles.sh, 如下执行将会自动为我们生成所需要的文件:
./hardware/interface/update-makefiles.sh
查看我们最新的代码目录: hardware/interface/naruto:
├── 1.0
│ ├── Android.bp //自动生成
│ ├── Android.mk //自动生成
│ ├── default
│ │ ├── Android.bp //需要自己编写
│ │ ├── android.hardware.naruto@1.0-service.rc //用于加入开机启动服务
│ │ ├── Naruto.cpp //自动生成
│ │ ├── Naruto.h //自动生成
│ │ └── service.cpp // hidl服务端注册入口程序
│ └── INaruto.hal //定义接口
└── Android.bp //自动生成
是不是so easy,我们写代码就写了一个INaruto.hal,其余代码都是自动生成的,特别是Naruto.cpp和Naruto.h这两个文件是实现接口的关键文件。
3. 实现HAL服务端的共享库
打开Naruto.h文件:
// Naruto.h
#ifndef ANDROID_HARDWARE_NARUTO_V1_0_NARUTO_H
#define ANDROID_HARDWARE_NARUTO_V1_0_NARUTO_H
#include <android/hardware/naruto/1.0/INaruto.h>
#include <hidl/MQDescriptor.h>
#include <hidl/Status.h>
namespace android {
namespace hardware {
namespace naruto {
namespace V1_0 {
namespace implementation {
using ::android::hardware::hidl_array;
using ::android::hardware

本文详细介绍HIDL(HAL接口定义语言)的基本概念与实践步骤,包括HIDL接口文件定义、生成HAL相关文件、实现HAL服务端共享库、Halserver端启动注册、HIDLClient端测试程序等,帮助读者掌握HIDL在Android开发中的应用。
最低0.47元/天 解锁文章
2万+





