适用于 HAL 的 AIDL

Android 11 引入了在 Android 中使用 AIDL 实现 HAL 的功能。这样就可以在不使用 HIDL 的情况下实现 Android 的部分代码。我们强烈建议尽量将 HAL 转换为只使用 AIDL(如果上游 HAL 使用 HIDL,则必须使用 HIDL)。

如果 HAL 使用 AIDL 在框架组件(例如 system.img 中的组件)和硬件组件(例如 vendor.img 中的组件)之间进行通信,则必须使用稳定的 AIDL。不过,如需在分区内进行通信(例如从一个 HAL 到另一个),则对所使用的 IPC 机制没有任何限制。

动机

AIDL 出现在 HIDL 之前,而且在 Android 框架组件之间或应用内等其他很多地方都有使用。现在,由于 AIDL 具备了稳定性支持,就可以只使用一个 IPC 运行时环境实现整个栈。此外,AIDL 的版本控制系统也优于 HIDL。

  • 只使用一种 IPC 语言意味着只需要了解、调试、优化和保护一个运行时环境。
  • AIDL 可为接口所有者提供内建的版本控制机制。
    • 所有者可以将方法添加到 Parcelable 的接口或字段的末尾。这意味着可以在持续多年的开发过程中简化对代码的版本控制,并逐年降低产生的开销(可以就地修改类型,而且更新接口版本不需要新增额外的库)。
    • 扩展接口可以在运行时附加,而不是在类型系统中附加,因此无需将下游扩展 rebase 到新版接口上。
  • 如果现有 AIDL 接口的所有者选择使其稳定化,此类接口可以直接使用。如果是在以前,必须用 HIDL 创建接口的完整副本。
### AIDL 和 HIDL 的区别及用途 #### 定义和作用范围 AIDL (Android Interface Definition Language) 主要用于在同一设备上的不同应用程序之间建立通信桥梁,尤其是在涉及跨进程调用的情况下。当一个应用想要使用某个服务时,需要绑定该服务并通过由 AIDL 生成的接口来调用其中的方法[^1]。 相比之下,HIDL (Hardware Interface Definition Language) 是一种更专门化的语言,在 Android Oreo 及更高版本中引入,旨在标准化硬件抽象层(HAL)之间的交互方式。它允许上层软件与下层驱动程序或其他低级组件进行有效的沟通,从而提高了模块间的解耦合度并简化了系统的维护工作。 #### 序列化机制 对于 AIDL 来说,其负责处理底层 IPC(Inter-Process Communication, 跨进程通讯) 细节,包括参数的数据序列化/反序列化进程;而 HIDL 则提供了更为丰富的特性集,不仅支持基本类型的传递还涵盖了复杂对象以及内存共享等功能,这使得基于 HIDL 构建的应用和服务间交流更加灵活高效。 #### 使用场景差异 由于设计初衷的不同,两者适用的具体应用场景也有所区分: - **AIDL**: 更适合于构建那些跨越多个独立APK文件但仍需保持紧密协作关系的功能模块,例如提供复杂的计算能力或是实现多实例环境下的资源共享等情形。 - **HIDL**: 面向的是整个平台级别的集成需求,特别是涉及到SoC(System on Chip)内部各子系统相互配合的工作流里扮演着重要角色,如图形渲染引擎、音频处理器等核心设施的操作控制。 ```java // 示例:简单的 AIDL 接口定义 package com.example.myapp; interface IMyService { void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString); } ``` ```cpp // 示例:HIDL 接口声明部分代码片段 namespace android.hardware.light@2.0 { interface ILight { Return<void> setLight(const LightState& state) = 0; }; } // namespace android.hardware.light@2.0 ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值