HIDL 是围绕接口进行比啊你的,接口是面向对象语言实用的一种用来定义命令行为的抽象类型。每个接口都有一个软件包。
软件包
软件包名称可以具有子级,例如 package.subpackage。发布的 HIDL 软件包的根目录是 hardware/interfaces 或 vendor/vendorName(例如 Pixel 设备为 vendor/google)
软件包名称在根目录下形成一个或多个子目录;定义软件包的所有文件都位于同一目录下。
例如:android.hardware.example.extension.light@2.0 可以在 hardware/interfaces/example/extension/light/2.0 下找到。
下表列出了软件包前缀和位置
通过Android HIDL 编程规范 知道包名的命名规则:
PACKAGE.MODULE[.SUBMODULE[.SUBMODULE[…]]]@VERSION
结合例子得到:
- PACKAGE 为android.hardware
- MODULE 为nfc
- VERSION 为1.0
其中的PACKAGE 是通过ROOT-DIRECTORY 隐射来得到的.
例子中android.hardware.nfc 路径应该是来源于hardware/interfaces/nfc,那么如何确定这个ROOT-DIRECTORY?其实这个是在编译的时候mk 或bp 设定的,例如android.hardware定义在hardware/interfaces/Android.bp 中:
hidl_package_root {
name: "android.hardware",
path: "hardware/interfaces",
}
接口
除了 types.hal 之外,其他 .hal 文件均定义一个接口。接口通常定义如下:
interface IBar extends IFoo { // IFoo is another interface
// embedded types
struct MyStruct {/*...*/};
// interface methods
create(int32_t id) generates (MyStruct s);
close();
}
导入
导入采用以下 3 种格式之一:
- 完整软件包导入:import PACKAGE-NAME;
- 部分导入:import PACKAGE-NAME::UDT;(或者,如果导入的类型是在同一个软件包中,则为 import UDT;)
- 仅类型导入:import PACKAGE-NAME::types;
完全导入:
PACKAGE-NAME 为软件包的完成名称,例如
import android.hardware.nfc@1.0;
部分导入:
import INfcClientCallback;
因为是在一个软件包中,可以直接导入接口名称。当然也可以改为:
import android.hardware.nfc@1.0::INfcClientCallback;
目录规范
函数名称、变量名称和文件名应该是描述性名称;避免过度缩写。将首字母缩略词视为字词(例如,请使用 INfc,而非 INFC)
目录结构和文件命名
- ROOT-DIRECTORY
- MODULE
- SUBMODULE
- VERSION
- Android.mk
- IINTERFACE_1.hal
- IINTERFACE_2.hal
- …
- IINTERFACE_N.hal
- types.hal
其中:
- VERSION
- SUBMODULE
- MODULE
- ROOT-DIRECTORY 为:
hardware/interfaces(如果是核心 HIDL 软件包)
vendor/VENDOR/interfaces(如果是供应商软件包),其中 VENDOR 指 SoC 供应商或原始设备制造商 (OEM)/原始设计制造商 (ODM)。 - MODULE 应该是一个描述子系统的小写字词(例如 nfc)。如果需要多个字词,请使用嵌套式
- SUBMODULE。可以嵌套多层
- VERSION 应该与版本中所述的版本完全相同 (major.minor)。
- IINTERFACE_X 应该是含有 UpperCamelCase/PascalCase 的接口名称(例如 INfc),如接口名称中所述。
例如: