4. Android Camera 框架概览:Camera HAL3 架构、Camera Service、Camera Provider 分层
ZSL(零延迟快门)拍照模式的实现,依赖于 Android Camera 框架各层之间的紧密协作与高效数据通路。本章将系统梳理 Camera 框架的三大核心分层:Camera HAL3(硬件抽象层)、Camera Service(相机服务)与 Camera Provider(相机提供者),并阐明各层在 ZSL 流程中的职责与交互关系。
4.1 整体分层架构
Android Camera 框架采用 C/S(客户端-服务端)架构,自顶向下分为应用层、框架层、服务层与硬件抽象层。ZSL 拍照的数据流需要跨越所有层级,因此理解分层边界与接口契约是优化零延迟的关键前提。
4.2 Camera HAL3 架构详解
Camera HAL3 是 Android 从 HAL1 升级后的核心硬件抽象层,专为 ZSL、高速连拍、多帧融合 等高级特性设计。HAL3 引入了 Pipeline(流水线)模型,将拍照分解为可并行处理的请求-结果循环。
4.2.1 HAL3 关键接口与数据结构
| 接口 / 结构体 | 作用 | ZSL 相关性 |
|---|---|---|
camera3_device_t |
HAL 设备句柄,提供操作函数表 | 初始化流配置 |
camera3_capture_request_t |
单次捕获请求,包含输出 buffer 列表、设置参数 | ZSL 请求需携带 reprocess 标记 |
camera3_stream_t |
定义数据流类型(预览/拍照/分析) | ZSL 需要同时配置 preview + still capture 流 |
process_capture_request() |
HAL 处理请求的入口函数 | ZSL 要求此函数在 1 帧内返回 |
flush() |
清空所有待处理请求 | ZSL 场景下用于快速重置 pipeline |
4.2.2 HAL3 Pipeline 模型与 ZSL 数据流
HAL3 内部维护一个 多级 Pipeline,每个请求经过 Sensor → ISP → Post-processor 三个阶段。ZSL 模式下,HAL3 需要维持一个 环形 buffer(Ring Buffer),持续缓存最近 3~5 帧的原始数据,当用户按下快门时,直接从 buffer 中取出对应帧进行 reprocess,而非等待新的 Sensor 曝光。
process_capture_request() 必须支持 同步 reprocess 模式,即输入 buffer 来自之前缓存的帧,输出 buffer 直接写入 JPEG 编码器。这要求 HAL 实现者维护帧序号与时间戳的映射表。
4.3 Camera Service 架构与职责
Camera Service 运行在 cameraserver 进程中,是 Android 相机框架的 中枢神经。它负责管理客户端连接、权限校验、会话生命周期、以及向 Camera Provider 下发配置指令。
4.3.1 Camera Service 内部模块
- CameraManager:对外暴露
getCameraIdList()、openCamera()等 API,维护相机设备列表。 - CameraDeviceClient:每个打开的相机设备对应一个 Client,负责创建 CaptureSession 和 CaptureRequest。
- CameraMetadata:静态/动态元数据管理,ZSL 模式下需查询
REQUEST_AVAILABLE_CAPABILITIES是否包含PRIVATE_REPROCESSING。 - PermissionController:在 ZSL 场景下,需确保应用已获取
CAMERA权限且在前台运行。
4.3.2 ZSL 场景下的 Service 关键流程
- 会话配置阶段:Service 将应用请求的
SessionConfiguration转换为 HAL3 的camera3_stream_configuration_t,ZSL 要求至少包含一个CAMERA3_STREAM_OUTPUT类型的预览流和一个CAMERA3_STREAM_OUTPUT类型的拍照流。 - 请求提交阶段:Service 将
CaptureRequest序列化后通过 Binder 传递给 Camera Provider,ZSL 请求需设置CONTROL_ENABLE_ZSL为TRUE。 - 结果回调阶段:HAL3 返回的
CaptureResult经 Service 解析后回调给应用,ZSL 模式下需确保SHUTTER_TIMESTAMP与 Ring Buffer 中的帧时间戳对齐。
4.4 Camera Provider 分层与进程模型
Camera Provider 是 Android 8.0 引入的 Treble 架构产物,将 HAL 实现从 Camera Service 中解耦,放入独立进程(android.hardware.camera.provider@2.x-service)。Provider 层负责加载 HAL 库、管理设备生命周期、以及转发 Service 的请求到 HAL3。
4.4.1 Provider 分层结构
| 层级 | 进程 | 职责 | ZSL 影响 |
|---|---|---|---|
| Camera Service | cameraserver |
权限、会话、元数据 | 请求序列化与校验 |
| Camera Provider | provider@2.x |
HAL 加载、设备枚举、接口转换 | HIDL 转 HAL3 调用 |
| Camera HAL3 | Provider 进程内 | 硬件控制、Pipeline 处理 | Ring Buffer 与 reprocess |
4.4.2 HIDL / AIDL 接口与 ZSL 数据传递
Provider 层使用 HIDL(Android 8~10)或 AIDL(Android 11+)与 Service 通信。ZSL 场景下,关键接口包括:
ICameraDeviceSession::processCaptureRequest():接收序列化的请求列表,ZSL 要求支持 同步提交多个请求(Burst)。ICameraDeviceSession::flush():清空 Provider 内部队列,ZSL 切换场景时需快速调用。ICameraDeviceCallback::notify():传递SHUTTER事件,ZSL 模式下需携带准确的曝光开始时间戳。
4.5 分层协作:ZSL 拍照的完整调用链
综合以上三层,ZSL 拍照的完整调用链可归纳为以下步骤:
- 应用层 通过 Camera2 API 创建
CaptureRequest,设置CONTROL_ENABLE_ZSL = TRUE,并提交到 Camera Service。 - Camera Service 校验权限与元数据后,将请求通过 HIDL/AIDL 传递给 Camera Provider。
- Camera Provider 将请求转换为 HAL3 的
camera3_capture_request_t,调用process_capture_request()。 - HAL3 从 Ring Buffer 中取出最近一帧原始数据,执行 reprocess(重处理)流程,输出 JPEG 或 YUV 结果。
- 结果 沿原路径返回:HAL3 → Provider → Service → Application,应用层收到
CaptureResult中的 JPEG buffer。
4.6 本章小结
- Camera HAL3 是 ZSL 的核心执行层,通过 Pipeline 模型和 Ring Buffer 实现零延迟 reprocess。
- Camera Service 作为中枢,负责权限、会话与元数据管理,是 ZSL 请求的入口与出口。
- Camera Provider 实现进程隔离与接口桥接,是 Service 与 HAL3 之间的桥梁,其 IPC 效率直接影响 ZSL 延迟。
- 理解三层之间的接口契约与数据流方向,是后续章节深入分析 ZSL 优化策略的基础。