Android Camera HAL从零到项目落地 - 第1节

1.1 Android Camera 整体架构

Android Camera 系统采用分层架构设计,从上至下依次为 应用层、框架层、HAL 层 和 内核驱动层。每一层都通过明确定义的接口进行通信,实现了应用与硬件的解耦。

核心设计思想: 分层抽象 + Binder IPC 跨进程通信 + 生产者-消费者缓冲区模型。

1.1.1 四层架构总览

层级 主要模块 运行空间 职责
应用层 Camera2 API / Camera1 API App 进程 (Java) 提供拍照、录像、预览等用户接口
框架层 CameraService / CameraProvider System Server (C++/Java) 权限管理、流配置、会话管理、数据分发
HAL 层 Camera HAL (HAL1/HAL2/HAL3) HAL 进程 (C/C++) 硬件抽象、设备控制、图像流生产
内核层 V4L2 / CSI / ISP 驱动 Kernel Space (C) 传感器控制、图像数据采集、MIPI 传输
Android Camera 系统四层架构 应用层 (Application Layer) Camera2 API / Camera1 API / 第三方 App 框架层 (Framework Layer) CameraService / CameraProvider / 权限管理 HAL 层 (Hardware Abstraction Layer) Camera HAL 1/2/3 实现 内核驱动层 (Kernel Driver) V4L2 / CSI / ISP / Sensor 驱动 通信机制:Binder IPC(应用↔框架)| HIDL / AIDL(框架↔HAL)| ioctl(HAL↔内核)

1.1.2 关键数据流

从传感器到屏幕的完整数据通路涉及三个关键缓冲区队列:

  1. Request Queue: 应用通过 Camera2 API 提交 CaptureRequest,描述期望的帧参数(曝光、增益、输出格式等)。
  2. Buffer Queue: HAL 从 Gralloc 分配的缓冲区中填充图像数据,通过 Dequeue/Enqueue 机制流转。
  3. Result Queue: 每一帧完成后,HAL 返回包含元数据(Metadata)的 CaptureResult 给框架层。
关键指标: 从 Request 提交到 Result 返回的完整延迟通常要求 < 33ms(30fps 场景),HAL 层处理时间需控制在 10ms 以内。

1.2 Camera HAL 在系统中的位置

Camera HAL 位于 框架层(Framework) 与 内核驱动层(Kernel) 之间,是连接 Android 系统与具体摄像头硬件的桥梁。HAL 的实现直接决定了相机的启动速度、帧率、图像质量和功能完整性。

1.2.1 HAL 的边界职责

方向 接口 HAL 职责
向上(Framework) ICameraDevice / ICameraDeviceSession 暴露设备能力、处理 Request、返回 Result
向下(Kernel) V4L2 / 自定义驱动接口 配置传感器、启动/停止流、读取帧数据
横向(其他 HAL) BufferQueue / Gralloc 与 SurfaceFlinger、Display HAL 共享图像缓冲区
Camera HAL 在系统中的位置与边界 Android Framework (CameraService) HIDL / AIDL 接口 Camera HAL (HAL1 / HAL2 / HAL3) 硬件抽象 + 流管理 + 元数据处理 ioctl / mmap / 驱动接口 Kernel Driver (V4L2 / ISP) 向上:暴露标准 Camera API 向下:屏蔽硬件差异 横向:与 SurfaceFlinger 共享 Buffer 关键:Gralloc 缓冲区分配
常见误区: HAL 层并不直接操作 I2C/SPI 寄存器,这些工作由内核驱动完成。HAL 通过 ioctl 或 v4l2 接口下发配置参数,驱动负责实际的硬件时序控制。

1.3 Camera HAL 的发展历程

Android Camera HAL 经历了三个主要版本:HAL1、HAL2 和 HAL3。每个版本都针对性能、灵活性和功耗进行了重大改进。

1.3.1 版本演进对比

特性 HAL1 (Android 4.0+) HAL2 (Android 5.0+) HAL3 (Android 7.0+)
架构模式 同步阻塞式 异步回调式 纯异步 + 流水线
流控制 单一流,应用控制 多流,HAL 控制 多流,应用通过 Request 控制
元数据 无标准元数据 有限元数据 完整 Metadata (android.*)
缓冲区管理 HAL 内部管理 Gralloc 管理 Gralloc + 应用注册
性能 低(单线程阻塞) 中(异步但串行) 高(并行流水线)
兼容性 仅支持 Camera1 API Camera1 + 部分 Camera2 完整 Camera2 API

1.3.2 HAL1 时代(Android 4.0 ~ 4.4)

HAL1 是最早期的 Camera HAL 实现,设计简单但性能受限:

  • 同步模型: 每次拍照或预览都需要等待 HAL 完成操作后才能返回,导致明显的快门延迟。
  • 单流限制: 同一时间只能支持一路输出流(预览或拍照),无法同时进行。
  • 无元数据: 应用无法精确控制曝光、增益、白平衡等参数,只能通过简单的参数传递。
  • 典型延迟: 从按下快门到获取 JPEG 数据通常需要 200~500ms。
HAL1 核心接口: camera_device_t 结构体,包含 start_preview()、take_picture()、auto_focus() 等同步函数指针。

1.3.3 HAL2 过渡期(Android 5.0 ~ 6.0)

HAL2 是为支持 Camera2 API 而设计的过渡版本,引入了异步回调机制:

  • 异步回调: 使用 camera3_callback_ops_t 回调接口,HAL 在完成操作后通知框架。
  • 多流支持: 允许同时配置预览流和拍照流,但流配置是静态的,无法动态调整。
  • 有限元数据: 引入了 camera_metadata_t,但只支持部分控制参数。
  • 兼容层: 框架层提供了 HAL1→HAL2 的兼容适配,但性能损失较大。
历史教训: HAL2 在实际产品中很少被直接实现,大多数厂商选择从 HAL1 直接跳到 HAL3。HAL2 的主要价值在于验证了异步架构的可行性。

1.3.4 HAL3 现代架构(Android 7.0+)

HAL3 是当前主流架构,也是本课程的核心内容。它彻底重构了 HAL 的设计范式:

  • 纯异步流水线: 应用提交 Request 后立即返回,HAL 在后台并行处理多帧,通过回调返回 Result。
  • Request/Result 模型: 每一帧都是一个独立的 CaptureRequest,包含完整的元数据描述;HAL 返回对应的 CaptureResult。
  • 动态流配置: 应用可以在运行过程中动态添加/删除输出流(如同时预览 + 拍照 + 视频)。
  • 完整元数据: 支持 200+ 个标准元数据标签,覆盖曝光、3A、畸变校正、HDR、多帧融合等。
  • 缓冲区注册: 应用预先注册输出缓冲区,HAL 直接填充,减少内存拷贝。
HAL3 核心架构:Request/Result 流水线模型 应用 (App) 提交 CaptureRequest 接收 CaptureResult Request HAL3 流水线 ① Request 解析 ② 传感器配置 ③ ISP 处理 ④ 填充缓冲区 Result CameraService 分发 Result 回调应用 HAL3 关键设计原则 • 每一帧独立:Request N 与 Request N+1 互不依赖,支持乱序完成 • 缓冲区外置:应用通过 DequeueBuffer 获取空闲缓冲区,HAL 只负责填充 • 元数据驱动:所有控制参数通过 Metadata 传递,不再使用固定结构体 • 并行流水线:Sensor 曝光、ISP 处理、Buffer 填充可同时进行

1.3.5 版本选择建议

场景 推荐 HAL 版本 原因
新项目开发(Android 10+) HAL3 完整 Camera2 API 支持,性能最优
低端设备兼容(Android 7~9) HAL3 即使硬件性能有限,HAL3 的流水线模型仍可优化
遗留系统维护(Android 4.x) HAL1 系统版本限制,无法升级 HAL 版本
快速原型验证 HAL3 丰富的调试工具和 Metadata 支持
课程路线图: 本课程将重点讲解 HAL3 的实现,包括 Request 处理、Metadata 管理、Buffer 流转、3A 集成等核心模块。HAL1 和 HAL2 仅作为对比参考,不再深入实现细节。