您可以通过转换 hardware/libhardware/include/hardware
中的标头,将预先存在的 HAL 模块更新为 HIDL HAL 模块。
使用 c2hal
c2hal
工具可处理大部分转换工作,从而减少所需的手动更改次数。例如,要为 NFC HAL 生成 HIDL .hal
文件,请执行以下操作:
make c2hal
c2hal -r android.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport -p android.hardware.nfc@1.0 hardware/libhardware/include/hardware/nfc.h
这些命令会在 hardware/interfaces/nfc/1.0/
中添加文件。从 $ANDROID_BUILD_TOP
目录运行 hardware/interfaces/update-makefiles.sh
还会将所需的 makefile 添加到 HAL。从这里开始,您可以进行手动更改以完全转换 HAL。
c2hal 活动
当您运行 c2hal
时,标头文件中的所有内容都将传输到 .hal
文件。
c2hal
会识别提供的标头文件中包含函数指针的结构体,并将每个结构体转换为单独的接口文件。例如,alloc_device_t
会转换为 IAllocDevice
HAL 模块(在文件 IAllocDevice.hal
中)。
所有其他数据类型都将复制到 types.hal
文件中。磅定义将移至枚举,而 HIDL 中不包含或不可转换的项目(例如静态函数声明)将复制到标有文本“NOTE
”的注释中。
手动活动
当 c2hal
工具遇到某些构造时,它不知道该怎么做。例如,HIDL 没有原始指针的概念;因此,当 c2hal
在标头文件中遇到指针时,它不知道应将指针解释为数组还是对另一个对象的引用。Void 指针也同样不透明。
在转换到 HIDL 期间,必须手动删除 int reserved[7]
等字段。应将返回值名称等项更新为更具意义的名称;例如,将 NFC 中 write
等方法的返回参数从自动生成的 int32_t write_ret
转换为 Status status
(其中 Status
是包含可能 NFC 状态的新枚举)。
实现 HAL
创建 .hal
文件以表示您的 HAL 后,您必须生成 makefile(Make 或 Soong),以在 C++ 和 Java 中创建语言支持(除非 HAL 使用 Java 不支持的功能)。./hardware/interfaces/update-makefiles.sh
脚本可以自动为位于 hardware/interfaces
目录中的 HAL 生成 makefile(对于其他位置的 HAL,只需更新脚本即可)。
当 makefile 为最新时,您就可以生成头文件并实现方法了。 有关实现生成的接口的详细信息,请参阅 HIDL C++(用于 C++ 实现)或 HIDL Java(用于 Java 实现)。