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 源码的核心目录层级与接口关系:
4.5 HIDL 与 AIDL 接口演进关系图
下图展示了从 HIDL 到 AIDL 的演进路径,以及两者在 Android 版本中的共存关系:
开发建议:
- 新项目(Android 14+)优先使用 AIDL 接口,减少后续迁移成本。
- 维护旧项目时,先确认目标 Android 版本,再决定是否迁移。
- 无论使用 HIDL 还是 AIDL,
hardware/interfaces/camera/下的核心逻辑(设备管理、流配置、请求处理)基本一致,接口定义语言只是 IPC 层的变化。