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在新设备中的位置。
Android HAL架构演进对比 Android HAL架构演进对比 传统HAL时代 Android 1.0 ~ 7.x • libhardware 共享库 • hw_module_t 结构体 • 直接加载 .so 文件 • 系统/厂商强耦合 • 升级需整包OTA HIDL HAL时代 Android 8.0 ~ 10.x • Treble 架构引入 • HIDL 接口描述 • 系统/厂商分区隔离 • 支持独立厂商镜像 • 无源码升级可行 AIDL HAL时代 Android 11+ 至今 • 统一接口描述语言 • 类型安全、稳定 • 逐步替代HIDL • 支持Java/C++/NDK • 新设备首选方案

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
多Camera同步关键点: HAL3的 process_capture_request() 是同步控制的入口。在多Camera场景下,Framework会为每个Camera设备独立下发请求,HAL层需要根据硬件能力(如硬件同步信号、共用ISP)决定是否将多个请求合并处理,并保证返回的 camera3_capture_result_t 中时间戳对齐。

2.2.2 请求-结果流水线模型

HAL3采用异步流水线模型:Framework下发请求(Capture Request),HAL处理完成后通过回调返回结果(Capture Result)。每个请求携带唯一的 frame_number,用于匹配请求与结果。

Camera HAL3 请求-结果流水线 Camera HAL3 请求-结果流水线模型 Camera Framework • 下发 Capture Request • 包含 frame_number • 设置参数 & buffer • 注册回调接口 Camera HAL3 • process_capture_request • 硬件驱动处理 • 生成 metadata • 填充 buffer 结果回调 • process_capture_result • 返回 frame_number • 返回 metadata • 返回 buffer handle 每个请求通过 frame_number 唯一标识,HAL 保证请求与结果的一一对应

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);
};
HIDL 使用注意: HIDL接口一旦发布(@3.x版本号),必须保持向后兼容。新增字段只能通过扩展接口(@3.4、@3.5等)实现,不能修改已有接口签名。这导致Camera HAL的HIDL接口版本膨胀较快,维护成本上升。

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,增加同步配置与同步触发方法,接口更清晰。
实践建议: 新项目建议直接使用AIDL HAL,利用其更简洁的类型系统和更好的工具链支持。对于已有HIDL实现的项目,可采用“双栈共存”策略逐步迁移:先在新功能模块使用AIDL,再逐步替换旧HIDL接口。
HIDL vs AIDL 在Camera HAL中的架构对比 HIDL vs AIDL 在Camera HAL中的架构对比 HIDL Camera HAL 架构 Camera Provider @3.4 Camera Device @3.4 Device Session @3.4 Device Session @3.5 (扩展) AIDL Camera HAL 架构 Camera Provider AIDL 稳定版 Camera Device AIDL 稳定版 Device Session AIDL 稳定版 MultiCamera Session 继承自 Device Session AIDL 通过接口继承实现多Camera扩展,HIDL 通过版本号扩展,AIDL 架构更简洁

2.4 本章小结