Android 之 AIDL for HAL
Android AIDL for HAL 的作用与实现
作用:
Android AIDL for HAL(Android Interface Definition Language for Hardware Abstraction Layer)旨在统一 HAL 开发接口,替代 HIDL(Hardware Interface Definition Language),进一步简化硬件与框架的解耦,并增强接口的灵活性与兼容性。其核心目标包括:
- 统一 IPC 机制:复用 AIDL 标准(原本用于应用间通信),减少开发者的学习成本。
- 强化版本兼容性:通过更灵活的版本管理机制,支持接口的无缝演进。
- 简化开发流程:直接使用 AIDL 语法定义接口,无需额外学习 HIDL 语法,且支持更多语言(Java、C++)。
- 提高稳定性:通过接口稳定性标记(
@VintfStability
),确保 HAL 接口在系统升级中的可靠性。
实现机制
-
接口定义语言(AIDL)
- 使用
.aidl
文件定义硬件接口,语法与传统的应用层 AIDL 类似,但增加了 HAL 专用注解。 - 示例:定义一个控制 LED 的接口
ILed.aidl
:// ILed.aidl package android.hardware.led; @VintfStability // 标记接口为稳定,可供框架使用 interface ILed { boolean turnOn(); boolean turnOff(); }
- 使用
-
代码生成工具
- AIDL 编译器(如
aidl
命令)将.aidl
文件生成客户端和服务端代码(支持 Java 和 C++)。 - 生成内容:
- Proxy(代理类):客户端通过代理发送 IPC 请求(如 Binder 调用)。
- Stub(存根类):服务端继承 Stub 并实现具体硬件逻辑。
- AIDL 编译器(如
-
通信模式
- Binder IPC:默认使用 Android 的 Binder 机制跨进程通信,由
hwservicemanager
管理 HAL 服务(与 HIDL 类似)。 - 直通模式(Passthrough):服务端与客户端运行在同一进程,通过直接链接调用(用于兼容旧实现)。
- Binder IPC:默认使用 Android 的 Binder 机制跨进程通信,由
-
版本管理
- 通过接口扩展(
extend
关键字)支持版本升级,无需强制继承旧接口。 - 示例:升级到
ILed
2.0 版本,新增亮度控制:// ILed.aidl (v2.0) package android.hardware.led; @VintfStability interface ILed { boolean turnOn(); boolean turnOff(); // 扩展方法:设置亮度(新增功能) void setBrightness(int level); }
- 客户端可通过动态检测接口版本来调用新功能,保证向后兼容。
- 通过接口扩展(
示例说明:LED 控制
-
接口定义
// ILed.aidl package android.hardware.led; @VintfStability interface ILed { boolean turnOn(); boolean turnOff(); }
-
生成代码
- 运行
aidl --lang=java ILed.aidl
生成 Java 代码(或--lang=cpp
生成 C++ 代码)。 - 生成
ILed.java
,包含Proxy
和Stub
类。
- 运行
-
服务端实现
- 继承
Stub
并实现接口方法:public class LedService extends ILed.Stub { @Override public boolean turnOn() { // 实际控制 LED 硬件的代码 return true; } @Override public boolean turnOff() { // 实际控制 LED 硬件的代码 return true; } }
- 注册服务到
hwservicemanager
:LedService ledService = new LedService(); hwservicemanager.addService("android.hardware.led.ILed/default", ledService);
- 继承
-
客户端调用
// 获取 HAL 服务 ILed led = ILed.Stub.asInterface( hwservicemanager.getService("android.hardware.led.ILed/default") ); if (led != null) { led.turnOn(); }
实际应用场景
- 传感器管理:
- 框架通过
ISensorManager.aidl
接口请求传感器数据,硬件服务实现数据采集与上报。
- 框架通过
- 电源管理:
- 系统服务通过
IPower.aidl
控制设备休眠/唤醒,厂商实现底层电源状态切换逻辑。
- 系统服务通过
- 图形渲染(Gralloc):
- 图形子系统通过
IGralloc.aidl
分配内存缓冲区,驱动层实现硬件加速的内存管理。
- 图形子系统通过
与 HIDL 的对比与演进
- 语法统一性:
- HIDL 需要专用语法(类似 C++),而 AIDL 复用应用层接口定义,开发者更熟悉。
- 版本管理灵活性:
- HIDL 通过继承接口实现版本扩展,AIDL 允许直接扩展原接口(无需继承),简化升级流程。
- 语言支持:
- HIDL 主要生成 C++ 代码,AIDL 原生支持 Java 和 C++,更适合纯 Java 实现的 HAL。
- 稳定性标记:
- AIDL 通过
@VintfStability
明确标记稳定接口,HIDL 依赖版本号隐式管理。
- AIDL 通过