2. Android Camera 系统整体架构:从 App 层到 HAL 层的完整数据流与组件分层

Android Camera 系统采用分层解耦的架构设计,从上至下依次为 Application(应用层)、Framework(框架层)、HAL(硬件抽象层) 和 Kernel(内核层)。每一层都承担明确的职责,并通过标准化的接口进行通信。理解这一分层结构是掌握 Camera HAL3 架构的基础。

核心要点: Camera 系统的设计哲学是“接口隔离,职责单一”。应用层不关心底层硬件细节,HAL 层不关心上层业务逻辑,两者通过 Framework 层的标准化服务进行桥接。

2.1 四层架构总览

下表总结了 Camera 系统各层的核心组件与主要职责:

层级 核心组件/进程 主要职责 关键接口/协议
Application Camera App (如系统相机、第三方应用) 调用 Camera API2 发起拍照/录像请求,处理预览帧与结果 android.hardware.camera2 API
Framework CameraService, CameraProviderManager 管理 Camera 设备生命周期,协调 Capture Session,分发请求与结果 AIDL / Binder
HAL Camera HAL3 实现 (Provider 进程) 实现 Camera 设备抽象,处理 Framework 下发的 Capture Request,返回 Result HIDL / AIDL (Treble)
Kernel V4L2, ISP Driver, Sensor Driver 驱动硬件传感器、ISP 图像信号处理器,完成原始数据采集 V4L2, I2C, SPI
架构演进: 自 Android 8.0 (Treble) 起,HAL 层与 Framework 层之间强制使用 HIDL 接口进行通信,实现了 Framework 与 Vendor 实现的完全解耦。Android 13 及之后版本开始逐步迁移至 AIDL HAL,但分层思想与数据流模型保持不变。

2.2 完整数据流与组件分层详解

一次典型的 Camera 预览或拍照流程,数据从应用层发起请求,经过 Framework 层封装与调度,到达 HAL 层驱动硬件,最终将图像数据逐层回传。下图展示了这一完整的数据流与组件交互关系:

Android Camera 系统四层架构与数据流图 Camera 系统四层架构与数据流图 Application 层 (应用层) Camera App (系统相机 / 第三方应用) 调用 CameraCaptureSession.capture() / setRepeatingRequest() Capture Request (AIDL) Framework 层 (框架层) CameraService / CameraProviderManager 管理 CameraDevice / CaptureSession / 流配置 将 Request 转换为 HAL 可识别的 CaptureRequest HIDL / AIDL HAL 接口 HAL 层 (硬件抽象层) Camera HAL3 实现 (Provider 进程) 实现 processCaptureRequest() / getCaptureResult() 管理 ISP / Sensor 抽象接口 V4L2 / Ioctl Kernel 层 (内核层) Camera Sensor Driver / ISP Driver / V4L2 框架 Raw Data / Metadata CaptureResult / Buffer TotalCaptureResult / Image 说明:实线箭头表示请求下发路径,虚线红色箭头表示数据回传路径。HAL 层与 Framework 层之间通过 HIDL/AIDL 接口跨进程通信。

2.3 各层组件职责与关键交互

2.3.1 Application 层

  • 入口: 应用通过 CameraManager.openCamera() 获取 CameraDevice 实例。
  • 请求发起: 创建 CaptureRequest.Builder,配置输出目标(Surface)、参数(AE/AWB/AF 模式等),调用 CameraCaptureSession.capture() 或 setRepeatingRequest() 提交请求。
  • 结果接收: 通过 CameraCaptureSession.CaptureCallback 接收 onCaptureCompleted() 回调,获取 TotalCaptureResult 和图像 Buffer。
常见误区: 应用层直接操作的是 CameraCaptureSession 而非 CameraDevice。一个 CameraDevice 可以创建多个 CameraCaptureSession,但同一时间只能有一个活跃的 Session。

2.3.2 Framework 层

Framework 层是 Camera 系统的“大脑”,运行在 cameraserver 进程中。其核心组件包括:

  • CameraService: 核心服务,负责 Camera 设备的枚举、打开、关闭管理,以及权限校验。
  • CameraProviderManager: 管理 HAL Provider 进程,通过 HIDL/AIDL 接口与 HAL 层通信。
  • Session 管理: 维护 CameraDevice 与 CaptureSession 的状态机,确保请求串行化与正确性。
  • Buffer 管理: 协调 Surface 与 GraphicBuffer 的分配与流转,通过 BufferQueue 机制将图像数据传递给应用层。

2.3.3 HAL 层

HAL 层是硬件厂商的实现核心,运行在独立的 android.hardware.camera.provider 进程中。HAL3 规范要求实现以下关键接口:

HAL 接口 功能描述 关键方法
ICameraDevice Camera 设备抽象 open(), close(), flush()
ICameraDeviceSession Capture Session 抽象 processCaptureRequest(), flush(), close()
ICameraProvider Provider 管理 getCameraIdList(), isSetTorchModeSupported()

2.3.4 Kernel 层

Kernel 层负责与物理硬件交互,主要涉及:

  • V4L2 (Video for Linux 2): 标准视频设备驱动框架,提供 open/ioctl/mmap/poll 等操作接口。
  • ISP 驱动: 图像信号处理器驱动,负责 RAW 数据到 YUV/JPEG 的转换、3A 统计信息采集。
  • Sensor 驱动: 控制图像传感器的曝光、增益、帧率等参数,通过 I2C/SPI 总线通信。

2.4 关键数据流路径总结

一次完整的 Capture 请求数据流可以归纳为以下步骤:

  1. App 发起请求: 应用层通过 Camera API2 构建 CaptureRequest,包含目标 Surface 列表和参数设置。
  2. Framework 封装: CameraService 将请求封装为 HAL 层的 CaptureRequest,并通过 HIDL/AIDL 跨进程发送给 HAL Provider。
  3. HAL 处理: HAL 实现解析请求,调用底层驱动(V4L2)配置 Sensor 和 ISP,启动曝光与数据采集。
  4. 数据回传: Kernel 层通过 DMA 将图像数据写入预分配的 Buffer,HAL 层填充 CaptureResult 元数据,通过 HIDL 回调返回给 Framework。
  5. App 接收: Framework 将 TotalCaptureResult 和图像 Buffer 通过 Binder 回调传递给应用层的 CaptureCallback。
性能关键点: 整个数据流中,跨进程通信(Binder/HIDL)和 Buffer 拷贝是主要性能瓶颈。HAL3 通过 StreamBuffer 机制和 BufferQueue 实现零拷贝传递,减少内存开销。

2.5 分层架构的优势

  • 解耦: 应用层与硬件实现完全解耦,同一套 Camera API 可适配不同厂商的硬件。
  • 可测试性: 每一层都可以独立进行单元测试和模拟测试(如使用 CameraServiceTest 或 VtsHalCameraProviderTest)。
  • 稳定性: 分层隔离了错误传播,HAL 层的崩溃不会直接导致 Framework 层或应用层崩溃。
  • 可扩展性: 新增 Camera 特性(如多帧合成、HDR+)只需在 HAL 层实现,不影响上层接口。