Android HIDL(1) ---- 概述

1.HIDL背景

Android 8.0(Android O) 重新设计了 Android 操作系统框架(在一个名为“Treble”的项目中),由于Google由于版本太多,Android版本的碎片化越来越严重,而且系统的更新又是一个耗时和复杂的过程,Google试图来解决这个问题而引入了Treble.

在这里插入图片描述

注意,这里的Framework是vendor修改过的,这样子的话,这四部分都耦合在一起,因为Google每次更新Android大版本,基本上都是framework的升级,与vendor改的代码理论上是可以独立开来的,所以Google尝试通过Treble来独立更新system.img来帮助vendor更快的移植新的Android版本。

在这种新架构中,HAL 接口定义语言(HIDL,发音为“hide-l”)指定了 HAL 和其用户之间的接口,让用户无需重新构建 HAL,就能替换 Android 框架。在 Android 10 中,HIDL 功能已整合到 AIDL 中。

利用新的供应商接口,Treble 将供应商实现(由芯片制造商编写的设备专属底层软件)与 Android 操作系统框架分离开来。供应商或 SOC 制造商构建一次 HAL,并将其放置在设备的 /vendor 分区中;框架可以在自己的分区中通过无线下载 (OTA) 更新进行替换,而无需重新编译 HAL。

旧版 Android 架构与当前基于 HIDL 的架构之间的区别在于对供应商接口的使用:

  • Android 7.x 及更低版本中没有正式的供应商接口,因此设备制造商必须更新大量 Android 代码,才能将设备更新到新版 Android 系统:
    图片2在这里插入图片描述

  • Android 8.0 及更高版本提供了一个稳定的新供应商接口,因此设备制造商可以访问 Android 代码中特定于硬件的部分,这样一来,设备制造商只需更新 Android 操作系统框架,即可跳过芯片制造商直接提供新的 Android 版本:
    在这里插入图片描述

在Android O中使用的Treble的架构,只需要升级framework,而无需再次将HAL 部分加入编译、升级,去除了HAL 与framework 之间的耦合性。

这样device makers 只需要维护framework 与HAL 之间的vendor interface(HIDL存在的意义)即可。HAL和 framework不需要一起编译,system和vendor是分开的两个partition。

2.HIDL简介

HIDL 是用于指定 HAL 与其用户之间接口的一个接口描述语言(Interface Description Language),它允许将指定的类型与函数调用收集到接口(Interface)和包(Package)中。更广泛地说,HIDL 是一个可以让那些独立编译的代码库(Libraries)之间进行通信的系统。

HIDL 实际上是用于进行进程间通信(Inter-process Communication,IPC)的。进程间的通信可以称为 Binder 化(Binderized)。对于必须连接到进程的库,也可以使用 passthough 模式(但在Java中不支持)。

HIDL 将指定的数据结构与方法签名组织到接口中,这些接口又会被收集到包中以供使用。它的语法与 C++、JAVA 是类似的,不过关键字集合不尽相同。其注释风格与 JAVA 是一致的。

以前HAL是以so的形式存在的,作为一堆标准接口,供Android framework调用,无论是通过jni还是别的途径,如果要被framework调用,那这些so就一定要存在于system分区,但是我们现在要把system分区独立开来,这样子,vendor修改的代码全部要在vendor分区,所以,引入了HIDL来解决这个问题,vendor设计的HAL都以独立的service存在,每一个HAL模块都是一个独立的binder server进程,Android framework想用调用HAL的接口就必须作为binder的client来调用.

3.HIDL设计

设计 HIDL 这个机制的目的,主要是想把框架(framework)与 HAL 进行隔离,使得框架部分可以直接被覆盖、更新,而不需要重新对 HAL 进行编译。HAL 的部分将会放在设备的 /vendor 分区中,并且是由设备供应商(vendors)或 SOC 制造商来构建。这使得框架部分可以通过 OTA 方式更新,同时不需要重新编译 HAL。

直通式HAL( Passthrough 模式)和 绑定式 HAL (Binderized模式)

为了将以往设备的 Android 版本更新到 Android O,开发者需要将传统的 HAL 封装到新的 HIDL 接口中,这个接口为 HAL 提供了 Binder 化以及 Passthrough 模式。这个封装过程对 HAL 以及 Android Framework 都是透明的。

  • 直通式HAL: 以 HIDL 封装的传统 HAL 或旧版 HAL。这些 HAL 封装了现有的 HAL,可在绑定模式和 Same-Process(直通)模式下使用。
    编译 .hal 文件时,除用于 Binder 通信的头文件之外,hidl-gen 还会生成一个额外的直通式头文件 BsFoo.h;此头文件定义了要执行 dlopen 操作的函数。由于直通式 HAL 会在调用它们的同一进程中运行,因此在大多数情况下,直通方法由直接函数调用(同一线程)调用。oneway 方法在自身的线程中运行,因为它们不需要等待 HAL 来进行处理(这意味着,在透传模式下使用 oneway 方法的所有 HAL 都必须满足线程安全要求)

  • 绑定式 HAL: 以 HAL 接口定义语言 (HIDL) 表示的 HAL。这些 HAL 取代了早期 Android 版本中使用的传统 HAL 和旧版 HAL。在绑定式 HAL 中,Android 框架和 HAL 之间通过 Binder 进程间通信 (IPC) 调用进行通信。所有在推出时即搭载了 Android 8.0 或后续版本的设备都必须只支持绑定式 HAL。
    您可以将支持直通模式的 HAL 实现 Binder 化。如果有一个 HAL 接口 a.b.c.d@M.N::IFoo,系统会创建两个软件包:

(1)a.b.c.d@M.N::IFoo-impl。该软件包包含 HAL 的实现,并提供函数 IFoo* HIDL_FETCH_IFoo(const char* name)。在旧版设备上,此软件包经过 dlopen 处理,且实现使用 HIDL_FETCH_IFoo 进行了实例化。您可以使用 hidl-gen、-Lc+±impl 和 -Landroidbp-impl 生成基础代码。
生成文件的指令, 设置的生成文件在device/xxx/common/interfaces 下
cat hidl-gen.sh

PACKAGE=vendor.xxx.tt@1.0
LOC=device/xxx/common/interfaces/tt/1.0/default
hidl-gen -o $LOC -Lc+±impl -rvendor.honeywell:device/xxx/common/interfaces -randroid.hidl:system/libhidl/transport $PACKAGE
hidl-gen -o $LOC -Landroidbp-impl -rvendor.xxx:device/xxx/common/interfaces -randroid.hidl:system/libhidl/transport $PACKAGE

(2)a.b.c.d@M.N::IFoo-service。打开直通式 HAL,并将其自身注册为 Binder 化服务,从而使同一 HAL 实现能够同时以直通模式和 Binder 化模式使用。

官网介绍: https://source.android.com/devices/architecture/hidl?hl=zh-cn

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值