1.HIDL简介
HAL接口定义语言(简称 HIDL,发音为"hide-l")是用于指定HAL和其用户之间的接口的一种接口描述语言(IDL).HIDL允许指定类型和方法调用(会汇集到接口和软件包中).从更广泛的意义上来说,HIDL 是指用于在可以独立编译的代码库之间进行通信的系统.
HIDL旨在用于进程间通信(IPC).进程之间的通信采用Binder机制.对于必须与进程相关联的代码库,还可以使用直通模式(在Java中不受支持).
2.HIDL设计目的
HIDL 的目标是,可以在无需重新构建 HAL 的情况下替换框架.HAL 将由供应商或 SOC 制造商构建.并放置在设备的 /vendor 分区中,这样一来,就可以在框架自己的分区中通过OTA替换框架,而无需重新编译 HAL.
3.客户端和服务器实现
HIDL 接口具有客户端和服务器实现:
HIDL 接口的客户端实现是指通过在该接口上调用方法来使用该接口的代码.
服务器实现是指 HIDL 接口的实现,它可接收来自客户端的调用并返回结果(如有必要).
在从 libhardware HAL转换为HIDL HAL的过程中,HAL 实现成为服务器,而调用 HAL 的进程则成为客户端.默认实现可提供直通和Binder化HAL.
4.HIDL demo编写
基于版本:
Android9.0
进入android根目录,创建demo目录:
mkdir -p vendor/heisenberg/interfaces/hidltest/1.0
HAL代码:
vendor/heisenberg/interfaces/hidltest/1.0$ touch IHidlTest.hal
package vendor.heisenberg.hidltest@1.0;
interface IHidlTest {
//传入一个string,返回一个string
//generates:生成,表示一个返回值给客户端的接口方法
helloWorld(string name) generates (string result);
};
使用脚本update-makefiles.sh生成HAL代码对应的bp文件:
Heisenberg海森堡:~/code/android/vendor/heisenberg/interfaces$ ./update-makefiles.sh
Updating makefiles for vendor.heisenberg in /home/.../android/vendor/heisenberg/interfaces.
...
Updating vendor.heisenberg.hidltest@1.0
...
Android.bp文件:
// This file is autogenerated by hidl-gen -Landroidbp.
hidl_interface {
name: "vendor.heisenberg.hidltest@1.0",
root: "vendor.heisenberg",
srcs: [
"IHidlTest.hal",
],
interfaces: [
"android.hidl.base@1.0",
],
gen_java: true,
}
注意:
生成的Android.bp中包含这个字段:gen_java: true,这个字段的使用,使得我们在框架层和应用层不需要添加任何JAVA类,即可直接使用.
编译推包:
make -j8 vendor.heisenberg.hidltest@1.0
adb root;adb remount
adb push out/target/product/heisenberg/vendor/lib64/vendor.heisenberg.hidltest@1.0.so /vendor/lib64/
adb shell sync
接着使用hidl-gen工具生成对应的.h .cpp文件:
//先编译hidl-gen工具
make -j64 hidl-gen
//c++-impl生成hal的c++,h的标准文件:
hidl-gen -o vendor/heisenberg/interfaces/hidltest/1.0/default/ -L c++-impl -r vendor.heisenberg:vendor/heisenberg/interfaces/ -r android.hidl:system/libhidl/transport vendor.heisenberg.hidltest@1.0
HidlTest.h文件:
#ifndef VENDOR_HEISENBERG_HIDLTEST_V1_0_HIDLTEST_H
#define VENDOR_HEISENBERG_HIDLTEST_V1_0_HIDLTEST_H
#include <vendor/heisenberg/hidltest/1.0/IHidlTest.h>
#include <hidl/MQDescriptor.h>
#include <hidl/Status.h>
namespace vendor {
namespace heisenberg{
namespace hidltest