1. Android Camera 整体架构概览:从 App 到 HAL 的完整数据流

Android Camera 软件栈采用分层架构设计,从上至下依次为 应用层、框架层、HAL 层 和 内核驱动层。每一层都封装了特定的职责,并通过明确定义的接口进行通信。理解这一完整数据流是进行 Camera HAL 开发的基础。

核心要点: 整个架构的核心目标是实现“一次编写,多平台适配”。Google 通过定义标准的 HAL 接口,将上层框架与底层硬件解耦,OEM 厂商只需实现 HAL 接口即可完成相机功能的适配。

1.1 四层架构总览

下图展示了从用户点击拍照按钮到最终图像数据返回的完整数据流,以及各层之间的关键交互接口。

Android Camera 软件架构与数据流 应用层 (Application) Camera2 API / CameraX API 框架层 (Framework) CameraService / CameraProvider / CameraDeviceClient CaptureSession / CaptureRequest / CaptureResult HAL 层 (Hardware Abstraction Layer) Camera HAL 3.x Interface / Camera Module processCaptureRequest / configureStreams / getMetadata 内核驱动层 (Kernel Driver) V4L2 / Sensor Driver / ISP Driver 请求流 (Request) 结果流 (Result / Frame) AIDL / HIDL HIDL / AIDL ioctl / mmap

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 完整数据流示例:一次拍照请求

以下是一个典型的拍照流程,展示了数据在各层之间的传递顺序:

  1. 应用层:App 通过 Camera2 API 创建一个 CaptureRequest,设置 AE/AWB/AF 模式、输出格式(JPEG)、输出目标(Surface)。
  2. 框架层:CameraService 收到请求后,进行权限校验和参数验证,然后将请求封装为 HAL 可识别的 camera3_capture_request_t,通过 HAL 接口的 processCaptureRequest 方法下发。
  3. HAL 层:HAL 解析请求,根据请求中的参数(如 AE 模式)和当前 Tuning 配置,计算出 Sensor 的曝光时间、增益,以及 ISP 各模块的参数。然后通过内核驱动接口(如 V4L2 的 ioctl)配置 Sensor 和 ISP 寄存器。
  4. 内核驱动层:驱动将 HAL 下发的配置写入硬件寄存器,启动 Sensor 曝光和 ISP 处理。Sensor 输出 RAW 数据,ISP 处理后生成 YUV 或 JPEG 数据,通过 DMA 写入预先分配的内存缓冲区。
  5. 数据返回:内核驱动通过中断通知 HAL 数据就绪。HAL 将填充好的缓冲区通过回调函数 process_capture_result 返回给框架层。框架层再将结果回调给应用层,App 最终在 Surface 上显示或保存为文件。
一次拍照请求的完整数据流时序 时间 App (Camera2 API) Framework HAL Kernel Driver ① CaptureRequest ② processCaptureRequest ③ 配置 Sensor/ISP ④ ioctl / 寄存器操作 ⑤ 中断 / 数据就绪 ⑥ process_capture_result ⑦ onCaptureCompleted

1.5 本章小结

Android Camera 架构通过清晰的分层设计,实现了应用功能与硬件实现的解耦。作为 HAL 开发者,你的工作主要集中在 HAL 层,需要深刻理解:

  • 如何实现 camera3_device_ops_t 中的各个接口函数。
  • 如何管理 Camera 管线(Pipeline)的配置和状态。
  • 如何与底层的 Sensor 和 ISP 驱动交互。
  • 如何加载和传递 Tuning 参数。