4. Camera HAL 源码结构:AOSP 中的代码路径与接口

在 AOSP 中,Camera HAL 的源码集中存放在 hardware/interfaces/camera 路径下。该目录是 Camera HAL 开发的核心战场,包含了从底层驱动接口到上层 Framework 通信的全部定义与实现。本章将深入剖析该路径的目录结构、关键文件作用,以及 HIDL 与 AIDL 两种接口定义语言的差异与演进关系。

4.1 核心代码路径:hardware/interfaces/camera

AOSP 的 Camera HAL 源码遵循 Treble 架构设计,将 HAL 接口与 Framework 解耦。主路径结构如下:

hardware/interfaces/camera/
├── common/          # 公共定义(类型、宏、辅助函数)
│   ├── 1.0/
│   └── ...
├── device/          # Camera 设备 HAL 实现
│   ├── 1.0/
│   ├── 3.0/
│   ├── 3.2/
│   ├── 3.3/
│   ├── 3.4/
│   ├── 3.5/
│   ├── 3.6/
│   └── 3.7/
├── metadata/        # Camera 元数据定义(static/camera_metadata)
│   └── ...
├── provider/        # Camera Provider HAL(服务注册与发现)
│   ├── 2.4/
│   ├── 2.5/
│   └── 2.6/
└── ...
开发提示: 实际开发中,device/ 目录下的版本号(3.0 ~ 3.7)对应 Camera HAL3 的接口版本。每个版本会新增或废弃部分功能,务必确认目标平台的 Android 版本所支持的 HAL 版本。

4.2 关键目录与文件说明

下表列出了各核心目录及其关键文件的作用:

目录/文件 说明 关键文件示例
common/1.0/ 公共类型定义,如 CameraStatus、StreamType、BufferStatus 等枚举与结构体 types.hal
device/3.x/ Camera 设备核心接口,定义 open、close、configureStreams、processCaptureRequest 等关键方法 ICameraDevice.hal、ICameraDeviceSession.hal
device/3.x/default/ Google 提供的默认实现(参考实现),可作为移植起点 CameraDevice.cpp、CameraDeviceSession.cpp
metadata/ Camera 元数据(static/camera_metadata)的 HIDL 定义,包含所有控制参数与结果元数据 camera_metadata_tags.h、camera_metadata.h
provider/2.x/ Camera Provider 接口,负责枚举设备、创建 CameraDevice 实例 ICameraProvider.hal
provider/2.x/default/ Provider 默认实现,包含服务注册逻辑 CameraProvider.cpp
关键文件解读:
  • ICameraDevice.hal:定义 Camera 设备生命周期管理(open、close、flush)。
  • ICameraDeviceSession.hal:定义一次 Capture Session 的配置与请求处理(configureStreams、processCaptureRequest、processCaptureResult)。
  • ICameraProvider.hal:定义 Provider 如何向 ServiceManager 注册,以及如何返回可用 Camera 设备列表。

4.3 HIDL 与 AIDL 接口:演进与对比

Android 从 8.0(Treble)开始引入 HIDL(HAL Interface Definition Language)作为 HAL 与 Framework 之间的 IPC 通信语言。从 Android 14 开始,Google 逐步推动将 HIDL 接口迁移到 AIDL(Android Interface Definition Language),以实现更统一的跨进程通信架构。

4.3.1 HIDL 接口特点

  • 独立定义语言:使用 .hal 文件定义接口,通过 hidl-gen 生成 C++/Java 代码。
  • 基于 Binder 的 IPC:HIDL 服务通过 hwservicemanager 注册与发现。
  • 版本化严格:每个接口都有明确的 major.minor 版本号,如 @3.4。
  • 仅支持 C++ 客户端:Java 端无法直接调用 HIDL 服务(需通过 JNI 桥接)。

4.3.2 AIDL 接口特点

  • 统一语言:使用 .aidl 文件定义接口,与 Android Framework 其他 AIDL 服务一致。
  • 基于 Binder 的 IPC:AIDL 服务通过 servicemanager 注册与发现。
  • 版本化通过 @VintfStability 注解:不再使用目录版本号,而是通过注解标记稳定性。
  • 支持 Java 与 C++ 客户端:Framework 端可以直接用 Java 调用 Camera AIDL 服务。

4.3.3 对比表格

对比维度 HIDL AIDL
定义文件后缀 .hal .aidl
代码生成工具 hidl-gen aidl(内置在 Android 构建系统中)
服务注册中心 hwservicemanager servicemanager
版本管理方式 目录版本号(如 3.4) @VintfStability 注解 + 接口版本号
Java 客户端支持 不支持(需 JNI) 原生支持
典型路径 hardware/interfaces/camera/device/3.4/ hardware/interfaces/camera/aidl/
当前状态 Android 14 之前为主流,逐步废弃 Android 14+ 推荐使用,逐步替代 HIDL
迁移注意事项: 如果你的项目基于 Android 14 及以上版本,建议优先使用 AIDL 接口开发新 Camera HAL。对于已有 HIDL 实现,Google 提供了 hidl2aidl 迁移工具,但需要手动适配部分接口差异(如回调机制、内存管理方式)。

4.4 Camera HAL 源码结构总览图

下图展示了 AOSP Camera HAL 源码的核心目录层级与接口关系:

Camera HAL 源码结构总览 Camera HAL 源码结构总览(hardware/interfaces/camera) hardware/interfaces/camera/ common/ device/ metadata/ provider/ 1.0/ types.hal 3.4/ 3.7/ camera_metadata_tags.h 2.5/ 2.6/ 说明: HIDL 接口位于 device/ 和 provider/ 目录下,按版本号组织;AIDL 接口位于 aidl/ 目录下(Android 14+)。

4.5 HIDL 与 AIDL 接口演进关系图

下图展示了从 HIDL 到 AIDL 的演进路径,以及两者在 Android 版本中的共存关系:

HIDL 到 AIDL 演进路径 HIDL → AIDL 接口演进路径 Android 8 HIDL 引入 Android 10 HIDL 成熟 Android 14 AIDL 推荐 Android 15+ AIDL 主流 当前状态: Android 14 及以下:HIDL 仍被广泛使用;Android 14+:Google 推荐新开发使用 AIDL,HIDL 接口逐步冻结。 共存策略: 同一设备可以同时注册 HIDL 和 AIDL 服务,通过 VINTF 清单声明兼容性。
开发建议:
  • 新项目(Android 14+)优先使用 AIDL 接口,减少后续迁移成本。
  • 维护旧项目时,先确认目标 Android 版本,再决定是否迁移。
  • 无论使用 HIDL 还是 AIDL,hardware/interfaces/camera/ 下的核心逻辑(设备管理、流配置、请求处理)基本一致,接口定义语言只是 IPC 层的变化。