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 传输 |
1.1.2 关键数据流
从传感器到屏幕的完整数据通路涉及三个关键缓冲区队列:
- Request Queue: 应用通过 Camera2 API 提交 CaptureRequest,描述期望的帧参数(曝光、增益、输出格式等)。
- Buffer Queue: HAL 从 Gralloc 分配的缓冲区中填充图像数据,通过 Dequeue/Enqueue 机制流转。
- 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 共享图像缓冲区 |
常见误区: 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 直接填充,减少内存拷贝。
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 仅作为对比参考,不再深入实现细节。