1. Android Camera 整体架构概览:从 App 到 HAL 的完整数据流
Android Camera 软件栈采用分层架构设计,从上至下依次为 应用层、框架层、HAL 层 和 内核驱动层。每一层都封装了特定的职责,并通过明确定义的接口进行通信。理解这一完整数据流是进行 Camera HAL 开发的基础。
核心要点: 整个架构的核心目标是实现“一次编写,多平台适配”。Google 通过定义标准的 HAL 接口,将上层框架与底层硬件解耦,OEM 厂商只需实现 HAL 接口即可完成相机功能的适配。
1.1 四层架构总览
下图展示了从用户点击拍照按钮到最终图像数据返回的完整数据流,以及各层之间的关键交互接口。
1.2 各层职责详解
| 层级 | 核心职责 | 关键组件/接口 | 典型工作 |
|---|---|---|---|
| 应用层 | 提供用户交互界面,发起拍照/录像请求,处理最终图像数据 | Camera2 API、CameraX API、SurfaceView/TextureView | 创建 CaptureRequest、设置预览/拍照参数、接收 JPEG/YUV 数据 |
| 框架层 | 管理相机资源、协调多应用访问、封装 HAL 接口、提供标准 API | CameraService、CameraProvider、CameraDeviceClient | 权限校验、流配置协商、Request 分发、Result 回调 |
| HAL 层 | 屏蔽硬件差异,将框架层的标准请求转换为硬件特定的操作序列 | camera3_device_t、camera3_callback_ops_t | 配置 ISP 管线、下发 Sensor 增益/曝光、返回 RAW/YUV 帧 |
| 内核驱动层 | 直接操作硬件寄存器,完成图像数据采集和传输 | V4L2 框架、Sensor 驱动、CSI 接收器驱动 | MIPI 数据接收、DMA 传输、中断处理 |
1.3 关键术语解析
在 Camera 开发中,以下三个术语是理解硬件和图像处理的基础,也是 HAL 开发中频繁打交道的对象。
1.3.1 ISP (Image Signal Processor)
ISP 是图像信号处理器的缩写,负责将 Sensor 输出的原始 RAW 数据转换为高质量的 YUV 或 JPEG 图像。ISP 通常是一个独立的硬件模块,也可以集成在 SoC 中。其核心处理管线包括:
- 黑电平校正 (BLC):消除 Sensor 暗电流噪声。
- 去马赛克 (Demosaic):将 Bayer 格式的 RAW 数据插值成 RGB 图像。
- 自动白平衡 (AWB):校正不同光源下的色偏。
- 自动曝光 (AE):调整增益和曝光时间以控制亮度。
- 自动对焦 (AF):通过对比度或相位检测驱动镜头马达。
- 降噪 (NR):去除亮度和色度噪声。
- 边缘增强 (Sharpness):提升图像细节清晰度。
开发提示: HAL 层需要为 ISP 提供正确的 tuning 参数(如 AWB 增益矩阵、AE 目标亮度、NR 强度等)。这些参数通常由 Tuning 工程师在实验室中通过调试获得,并固化在配置文件中。HAL 开发人员需要确保这些参数能够正确加载并下发给 ISP。
1.3.2 Sensor (图像传感器)
Sensor 是相机的“眼睛”,负责将光信号转换为电信号。常见的 Sensor 类型包括 CMOS 和 CCD,目前移动设备几乎全部使用 CMOS Sensor。Sensor 的关键参数包括:
| 参数 | 说明 | 典型值 |
|---|---|---|
| 分辨率 | 有效像素阵列大小 | 6400万、1.08亿 |
| 像素尺寸 | 单个像素的物理大小 | 0.8μm、1.0μm、1.4μm |
| 帧率 | 每秒输出的帧数 | 30fps、60fps、120fps |
| 输出格式 | RAW 数据的 Bayer 排列方式 | BGGR、RGGB、RCCB |
| 动态范围 | 能同时记录的最亮和最暗细节的能力 | 60dB、80dB、120dB (HDR) |
1.3.3 Tuning (图像调优)
Tuning 是一个持续迭代的过程,目的是为特定的 Sensor + ISP + 镜头组合找到最优的图像处理参数集。Tuning 工程师使用专用的调试工具(如高通 Chromatix、联发科 Camera Tuning Tool)在标准光源箱中拍摄测试图卡(如 ColorChecker、SFR 测试卡),然后调整 ISP 各模块的参数,直到图像质量达到目标。
常见误区: 很多初学者认为 HAL 开发只需要实现接口即可,Tuning 是另一个团队的事。实际上,HAL 层是 Tuning 参数与 ISP 硬件之间的桥梁。如果 HAL 层在配置流时没有正确设置 Tuning 模式,或者加载了错误的参数文件,即使 Tuning 数据再完美,也无法得到好的图像效果。HAL 开发者必须理解 Tuning 参数的结构和加载机制。
1.4 完整数据流示例:一次拍照请求
以下是一个典型的拍照流程,展示了数据在各层之间的传递顺序:
- 应用层:App 通过 Camera2 API 创建一个
CaptureRequest,设置 AE/AWB/AF 模式、输出格式(JPEG)、输出目标(Surface)。 - 框架层:CameraService 收到请求后,进行权限校验和参数验证,然后将请求封装为 HAL 可识别的
camera3_capture_request_t,通过 HAL 接口的processCaptureRequest方法下发。 - HAL 层:HAL 解析请求,根据请求中的参数(如 AE 模式)和当前 Tuning 配置,计算出 Sensor 的曝光时间、增益,以及 ISP 各模块的参数。然后通过内核驱动接口(如 V4L2 的
ioctl)配置 Sensor 和 ISP 寄存器。 - 内核驱动层:驱动将 HAL 下发的配置写入硬件寄存器,启动 Sensor 曝光和 ISP 处理。Sensor 输出 RAW 数据,ISP 处理后生成 YUV 或 JPEG 数据,通过 DMA 写入预先分配的内存缓冲区。
- 数据返回:内核驱动通过中断通知 HAL 数据就绪。HAL 将填充好的缓冲区通过回调函数
process_capture_result返回给框架层。框架层再将结果回调给应用层,App 最终在 Surface 上显示或保存为文件。
1.5 本章小结
Android Camera 架构通过清晰的分层设计,实现了应用功能与硬件实现的解耦。作为 HAL 开发者,你的工作主要集中在 HAL 层,需要深刻理解:
- 如何实现
camera3_device_ops_t中的各个接口函数。 - 如何管理 Camera 管线(Pipeline)的配置和状态。
- 如何与底层的 Sensor 和 ISP 驱动交互。
- 如何加载和传递 Tuning 参数。