HIDL基本知识

概览

因为Android 10开始不支持创建新的HIDL,所以后续从AIDL切入。

error: hardware/interfaces/hal/1.0/Android.bp:4:9: module "android.hardware.hal@1.0_interface": name: No more HIDL interfaces can be added to Android. Please use AIDL.
10:19:03 soong bootstrap failed with: exit status 1

HIDL

  1. HAL 接口定义语言或 HIDL 是一种接口描述语言 (IDL),用于指定 HAL 与其用户之间的接口。
  2. HIDL 全称是 Hardware Interface Definition Language。在 Android 8.0 中被全面使用。其诞生目的是:框架可以在无需重新构建 HAL 的情况下进行替换。
  3. HAL将由供应商或SOC 制造商构建,放置在设备的 /vendor 分区中,这样一来,框架就可以在其自己的分区中通过 OTA 进行替换,而无需重新编译 HAL。
  4. HIDL 允许指定类型和方法调用,收集到接口和包中。更广泛地说,HIDL 是一种用于在可以独立编译的代码库之间进行通信的系统。从 Android 10 开始,HIDL 已被弃用,Android 正在迁移以在任何地方使用AIDL 。
  5. HIDL 旨在用于进程间通信 (IPC)。使用 HDL 创建的 HALS 称为绑定 HAL,因为它们可以使用绑定程序进程间通信 (IPC) 调用与其他架构层进行通信。 Binderized HAL 在与使用它们的客户端不同的进程中运行。对于必须链接到进程的库,也可以使用直通模式(Java 中不支持)。
对于HIDL的理解
  • 便于给硬件厂商定义一套规范标准
  • 隔离FWK和BSP部分代码,BSP硬件部分改变引起的软件代码改变,不会影响标准接口。

HAL的类型

为了更好地实现模块化,Android 8.0 对 Android 操作系统底层进行了重新架构。运行 Android 8.0 的设备必须支持绑定式或直通式 HAL:

  1. 绑定式 HAL(Binder HAL): 以 HAL 接口定义语言 (HIDL) 表示的 HAL。在绑定式 HAL 中,Android 框架和 HAL 之间通过 Binder 进程间通信 (IPC) 调用进行通信。
    所有在推出时即搭载了 Android 8.0 或后续版本的设备都必须只支持绑定式 HAL。(这个是趋势)
  2. 直通式 HAL(Passthrough HAL)。以 HIDL 封装的传统 HAL 或旧版 HAL。这些 HAL 封装了现有的 HAL,可在绑定模式和 Same-Process(直通)模式下使用。升级到 Android 8.0 的设备可以使用直通式 HAL。
    通过 dlopen 方式加载库,也就是在同一进程直接调用。这里需要注意,默认情况下通常会使用 *Binder 化直通式 HAL *,也就是说最后仍然是跨进程 Binder 通信。
对于直通式和绑定式HAL类型的理解
  1. 直通模式仅适用于 C++ 客户端和实现。运行早期版本的 Android 的设备没有用 Java 编写的 HAL,因此 Java HAL 自然而然经过 Binder 化。
  2. 所以直通式HAL类型(JAVA中不支持)

HIDL 指定数据结构和方法签名,这些数据结构和方法签名以接口(类似于类)进行组织,这些接口被收集到包中。 HIDL 的语法对于 C++ 和 Java 程序员来说看起来很熟悉,但使用了一组不同的关键字。 HIDL 还使用 Java 样式的注释。

接口和软件包

HIDL 围绕接口构建而成,而接口是在面向对象的语言中用来定义行为的抽象类型。每个接口都是软件包的一部分。

软件包

软件包名称可以具有子级,如 package.subpackage。已发布的 HIDL 软件包的根目录为 hardware/interfaces 或 vendor/vendorName(例如,对于 Pixel 设备,根目录为 vendor/google)。软件包名称在根目录下形成一个或多个子目录;定义同一个软件包的所有文件都位于同一目录下。例如,您可以在 hardware/interfaces/example/extension/light/2.0 下找到 package android.hardware.example.extension.light@2.0。

下表列出了软件包前缀和位置:

软件包前缀位置接口类型
android.hardware.*hardware/interfaces/*HAL
android.frameworks.*frameworks/hardware/interfaces/*frameworks/ 相关
android.system.*system/hardware/interfaces/*system/ 相关
android.hidl.*system/libhidl/transport/*核心

软件包目录中包含扩展名为 .hal 的文件。每个文件均必须包含一个指定文件所属的软件包和版本的 package 语句types.hal 文件(如果存在)并不定义接口,而是定义软件包中每个接口可以访问的数据类型。

版本编号

软件包分版本,用两个整数表示: major.minor :
Major 版本不向后兼容 : 递增 Major 版本号将会使 Minor 版本号重置为 0 。
Minor 版本向后兼容 : 如果递增 Minor 版本号,则意味着较新版本完全向后兼容之前的版本。可以添加新的数据结构和方法,但不能更改现有的数据结构或方法签名。
可同时在一台设备上提供 HAL 的多个 Major 或 Minor 版本。不过 Minor 版本应优先于 Major 版本,因为与之前的 Minor 版本接口一起使用的客户端代码也适用于同一接口的后续 Minor 版本。

接口定义
导入
import android.hardware.nfc@1.0;            // import a whole package
import android.hardware.example@1.0::IQuux; // import an interface and types.hal
import android.hardware.example@1.0::types; // import just types.hal
代码样式指南
### 接口哈希
### 服务和数据转移
### 快速消息队列
### 使用Binder IPC
### 使用MemoryBlock
### 数据类型
.....

HIDL—C++实现

HIDL制作步骤
HAL层添加HIDL实现过程

小笔记

对于Composer.hal最后查找的动态库是android.hardware.graphics.composer@2.1-impl.so,调用函数集是HIDL_FETCH_IComposer
各个.hal文件,首先会注册到HwServiceManager里面,然后由HwServiceManager再统一注册进ServiceManager中!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

多维不语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值