2. HAL架构基础:Android HAL架构回顾、Camera HAL3核心接口、HIDL与AIDL在Camera HAL中的应用
在深入多Camera同步的HAL实现之前,必须牢固掌握Android HAL架构的演进脉络与核心接口。本章从Android HAL整体架构出发,重点剖析Camera HAL3的关键接口设计,并对比HIDL与AIDL两种接口描述语言在Camera HAL中的实际应用场景与迁移策略。
2.1 Android HAL架构回顾
Android硬件抽象层(HAL)是位于Android Framework与底层内核驱动之间的中间层,其核心目的是将硬件厂商的实现细节与上层系统解耦。HAL定义了一套标准接口,使得Android系统无需关心具体硬件实现,即可调用摄像头、传感器、音频等设备功能。
- 传统HAL(libhardware): 基于共享库(.so)加载,模块通过hw_module_t/hw_device_t结构体暴露接口,每个硬件模块一个独立库。
- HIDL HAL(Android 8.0+): 引入Treble架构,HAL与Framework通过HIDL接口通信,实现系统分区与厂商分区的严格分离,支持无源码升级。
- AIDL HAL(Android 11+): 逐步统一接口描述语言,AIDL作为稳定、类型安全的IPC方案,开始替代HIDL在新设备中的位置。
2.2 Camera HAL3核心接口
Camera HAL3是Android Camera子系统当前的主流HAL版本,相比HAL1提供了更灵活的请求-结果流水线模型,支持每帧级别的参数控制,是多Camera同步的基础。HAL3的核心接口围绕 camera3_device_t 和 camera3_callback_ops_t 展开。
2.2.1 核心数据结构与操作函数
| 接口/结构体 | 作用 | 关键字段/方法 |
|---|---|---|
camera3_device_t |
代表一个Camera设备实例,HAL层操作入口 | ops 指向操作函数表 |
camera3_device_ops_t |
设备操作函数表,包含所有HAL回调 | initialize(), configure_streams(), process_capture_request(), flush() |
camera3_callback_ops_t |
Framework向HAL注册的回调,用于返回结果 | process_capture_result(), notify() |
camera3_stream_t |
描述一个数据流(预览、拍照、视频等) | stream_type, width, height, format, usage |
camera3_capture_request_t |
一次捕获请求,包含所有配置参数 | frame_number, settings, input_buffers, output_buffers |
process_capture_request() 是同步控制的入口。在多Camera场景下,Framework会为每个Camera设备独立下发请求,HAL层需要根据硬件能力(如硬件同步信号、共用ISP)决定是否将多个请求合并处理,并保证返回的 camera3_capture_result_t 中时间戳对齐。
2.2.2 请求-结果流水线模型
HAL3采用异步流水线模型:Framework下发请求(Capture Request),HAL处理完成后通过回调返回结果(Capture Result)。每个请求携带唯一的 frame_number,用于匹配请求与结果。
2.3 HIDL与AIDL在Camera HAL中的应用
接口描述语言的选择直接影响HAL层的开发效率、稳定性与可维护性。HIDL与AIDL在Camera HAL中的定位与使用场景存在显著差异。
2.3.1 HIDL在Camera HAL中的应用
HIDL(HAL Interface Definition Language)是Treble架构的核心,用于定义Framework与HAL之间的稳定二进制接口。在Camera HAL中,HIDL接口定义在 android.hardware.camera 包下,典型接口包括:
ICameraDevice:Camera设备操作接口,对应HAL3的camera3_device_t。ICameraDeviceSession:会话管理接口,处理流配置与请求下发。ICameraProvider:Camera服务提供者,负责枚举与打开Camera设备。
// HIDL 接口示例:ICameraDeviceSession.hal
package android.hardware.camera@3.4;
interface ICameraDeviceSession {
/**
* 配置数据流,返回配置结果
*/
configureStreams(StreamConfiguration config)
generates (Status status, StreamConfigurationOut output);
/**
* 下发捕获请求,支持批量提交
*/
processCaptureRequest(vec<CaptureRequest> requests,
vec<BufferCache> cachesToRemove)
generates (Status status, uint32_t numRequestProcessed);
/**
* 刷新所有待处理请求
*/
flush() generates (Status status);
};
2.3.2 AIDL在Camera HAL中的应用
从Android 11开始,Google推动使用AIDL(Android Interface Definition Language)统一HAL接口。AIDL相比HIDL的优势在于:
| 对比维度 | HIDL | AIDL |
|---|---|---|
| 语言支持 | C++ 为主,Java 有限 | Java、C++、NDK 全支持 |
| 类型系统 | 自定义类型系统,学习成本高 | 与Java类型系统一致,更易用 |
| 版本管理 | 通过包版本号(@3.x)管理 | 通过接口继承与稳定AIDL管理 |
| 稳定性 | 稳定,但版本膨胀快 | 稳定,接口更简洁 |
| 工具链 | hidl-gen 专用工具 | aidl 工具,与Framework统一 |
| 多Camera支持 | 通过 @3.4+ 扩展接口支持 | 原生支持多Camera逻辑Camera |
// AIDL 接口示例:ICameraDeviceSession.aidl
package android.hardware.camera;
interface ICameraDeviceSession {
/**
* 配置数据流,返回配置结果
*/
StreamConfigurationOut configureStreams(in StreamConfiguration config);
/**
* 下发捕获请求,支持批量提交
*/
int processCaptureRequest(in CaptureRequest[] requests,
in BufferCache[] cachesToRemove);
/**
* 刷新所有待处理请求
*/
void flush();
}
2.3.3 迁移策略与多Camera同步影响
对于多Camera同步场景,接口描述语言的选择直接影响同步机制的实现方式:
- HIDL 方案: 多Camera同步通常通过
ICameraDeviceSession的扩展接口实现,例如在 @3.4 版本中增加configureStreamsWithSync()方法,传入同步组ID。 - AIDL 方案: 利用AIDL的稳定接口继承机制,定义
IMultiCameraSession继承自ICameraDeviceSession,增加同步配置与同步触发方法,接口更清晰。