HIDL基本知识

文章目录

    • 概览
      • HIDL
        • 对于HIDL的理解
      • HAL的类型
        • 对于直通式和绑定式HAL类型的理解
      • 接口和软件包
        • 软件包
        • 版本编号
        • 接口定义
        • 导入
          • 代码样式指南
      • HIDL---C++实现
        • HIDL制作步骤
        • HAL层添加HIDL实现过程

概览

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

error: hardware/interfaces/hal/1.0/Android.bp:4:9: module "[email protected]_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 [email protected]

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

软件包前缀 位置 接口类型
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 [email protected];            // import a whole package
import [email protected]::IQuux; // import an interface and types.hal
import [email protected]::types; // import just types.hal
代码样式指南
### 接口哈希
### 服务和数据转移
### 快速消息队列
### 使用Binder IPC
### 使用MemoryBlock
### 数据类型
.....

HIDL—C++实现

HIDL制作步骤

HAL层添加HIDL实现过程

小笔记

对于Composer.hal最后查找的动态库是[email protected],调用函数集是HIDL_FETCH_IComposer
各个.hal文件,首先会注册到HwServiceManager里面,然后由HwServiceManager再统一注册进ServiceManager中!

你可能感兴趣的:(Android,system,android,HIDL)