1. AIDL 与 HIDL
在 Android 系统中,AIDL(Android Interface Definition Language)和 HIDL(Hardware Interface Definition Language)是用于定义和实现不同层次间接口的两种接口定义语言。它们各自有其特定的用途和特性,同时也存在一些联系和区别。
1.1 AIDL(Android Interface Definition Language)
AIDL 是 Android 接口定义语言,主要用于定义应用程序组件(如 Activity、Service 等)之间的接口。它允许应用程序在不同的进程间进行通信(IPC),通过 Binder 机制实现远程过程调用(RPC)。
特性:
- 语法:AIDL 使用类似于 Java 的语法,并支持一些特定的数据类型和标记。
- 用途:主要用于应用程序层,定义应用组件之间的接口。
- 工具支持:Android 开发工具链提供了针对 AIDL 的代码生成工具,可以根据接口定义文件生成相关的桩代码和代理代码,简化接口实现和调用的过程。
1.2 HIDL(Hardware Interface Definition Language)
HIDL 是硬件接口定义语言,用于定义和实现 Android 系统中硬件抽象层(HAL)的接口。它允许硬件供应商定义硬件功能的接口,以便应用程序开发人员可以通过标准化的接口与硬件设备进行交互。
特性:
- 语法:HIDL 使用 C++ 语法,在接口定义时可以直接使用原生 C++ 特性,如指针、引用等。
- 用途:主要用于硬件抽象层(HAL),为与硬件设备通信提供接口定义。
- 性能:相对于 AIDL,HIDL 通常更加轻量级,并具有更高的性能,适用于与底层硬件交互的场景。
- 工具支持:Android 开发工具链同样提供了针对 HIDL 的代码生成工具,如 hidl-gen,用于生成实现 HIDL 接口的桩代码和代理代码。
1.3 联系与区别
联系:
- 两者都是 Android 系统中的接口定义语言,用于定义和实现不同层次间的接口。
- 两者都支持跨进程通信(IPC),并通过Binder机制进行远程过程调用(RPC)。
- Android 开发工具链都为两者提供了代码生成工具,简化了接口实现和调用的过程。
区别:
特性 | AIDL | HIDL |
---|---|---|
用途 | 主要用于应用程序层 | 主要用于硬件抽象层(HAL) |
语法 | 类似于 Java 的语法 | 使用C++语法 |
性能 | 相对于 HIDL,性能可能稍低 | 通常更加轻量级,并具有更高的性能 |
接口提供者 | 通常由应用程序开发人员定义 | 通常由硬件供应商提供 |
支持的数据类型 | 支持一些特定的数据类型和标记 | 支持原生 C++ 数据类型和特性 |
综上所述,AIDL 和 HIDL 在 Android 系统中扮演着不同的角色,分别用于应用程序层和硬件抽象层的接口定义。它们各有其独特的特性和用途,但都为实现 Android 系统不同层次间的通信和交互提供了有力的支持。
2. 为什么谷歌鼓励从 HIDL HAL -> AIDL HAL 的升级
从 Android 14 开始,谷歌鼓励合作伙伴和 SoC 供应商将当前 HIDL HAL 实现替换为 AIDL HAL 实现。 谷歌说明链接
鼓励替换的原因:
- 优化性能
- 原先应用跟硬件 HAL 通信,需要 APP->AIDL->System->HIDL->HAL,如果硬件 HAL 也是 AIDL,则只需要 APP->AIDL->HAL,提升交互的效率。
- AIDL 不需要常驻内存,客户端数量为 0 时,AIDL 服务可以自动退出,节省资源。
- 更成熟的开发社区
- AIDL 比 HIDL 存在的时间更长,并且在 Android 框架组件之间或应用程序中有更广泛的应用。AIDL 具有更好的版本控制系统和更广泛的兼容性,这有助于减少在开发过程中遇到的兼容性问题,并提高开发效率。
适用范围
这种鼓励并不仅限于 Audio 模块,而是对 Android 内的所有组件都适用。从 Android 14 开始,Google 鼓励合作伙伴和 SoC 供应商将当前的 HIDL HAL 实现替换为 AIDL HAL 实现。这表明 Google 希望在整个 Android 生态系统中推广 AIDL HAL 的使用,以提高系统的整体性能和可维护性。
注意事项
- 在进行这种替换时,需要仔细评估现有的 HAL 实现,并确保新的 AIDL HAL 实现能够满足系统的功能需求和性能要求。
- 由于 AIDL 和 HIDL 在语法和特性上存在差异,因此替换过程可能需要一定的开发工作量和测试资源。
- 还需要考虑与现有系统的兼容性问题,以确保替换后的系统能够平稳运行。