1. Camera3Device概述:Camera3Device在Android Camera HAL3架构中的位置与作用

1.1 什么是Camera3Device

Camera3Device 是 Android Camera HAL3 架构中 Framework 层与 HAL 层之间的核心桥接组件。它位于 frameworks/av/services/camera/libcameraservice/device3/ 目录下,继承自 CameraDeviceClient,是 CameraService 管理单个相机设备实例的关键对象。

从职责上看,Camera3Device 负责将上层(应用框架)的拍照、预览、录像等请求,转换为符合 Camera HAL3 接口规范 的捕获请求(Capture Request),并向下传递给 HAL 层处理;同时,它将 HAL 层返回的捕获结果(Capture Result)和事件回调,解析并上报给 Framework 层。

核心定位: Camera3Device 是 Android Camera HAL3 架构中“请求-结果”流水线的调度中枢,也是 Framework 与 HAL 之间协议转换和状态管理的唯一入口。

1.2 Camera3Device在HAL3架构中的位置

Android Camera HAL3 架构采用分层设计,从上到下依次为:

  • 应用层(Application):调用 Camera API2 接口。
  • Framework 层(CameraService):管理相机设备、权限、策略。
  • Camera3Device:设备级代理,封装 HAL3 接口。
  • HAL 层(Camera HAL3):硬件抽象实现,直接操作传感器、ISP 等。
  • Kernel 层(V4L2 / 传感器驱动):硬件驱动。

下表展示了 Camera3Device 在架构中的关键位置与相邻组件的交互关系:

层级 组件 与Camera3Device的关系
Framework CameraService 创建并持有 Camera3Device;下发配置、流、请求
桥接层 Camera3Device 本课程核心对象
HAL camera3_device_t 通过 HAL 接口函数指针调用(open、configure_streams、process_capture_request 等)
HAL camera3_callback_ops_t HAL 通过回调结构体通知 Camera3Device(结果、事件、缓冲区)
架构要点: Camera3Device 不直接操作硬件,它通过 HAL 接口的 hw_module_t 和 hw_device_t 标准结构体与 HAL 层通信。所有硬件相关的操作都被 HAL 层封装。

1.3 Camera3Device的核心作用

Camera3Device 在 HAL3 架构中承担以下关键作用:

  1. 请求序列化与分发:将 Framework 下发的多个并发请求(预览、拍照、录像)按 HAL3 规范序列化为 camera3_capture_request_t,并调用 process_capture_request 送入 HAL。
  2. 结果收集与反序列化:接收 HAL 通过 process_capture_result 回调返回的 camera3_capture_result_t,解析 metadata 和缓冲区,上报给 Framework。
  3. 流(Stream)管理:管理从 Framework 请求的 Surface 到 HAL 的 camera3_stream_t 的映射关系,在 configure_streams 阶段完成配置。
  4. 状态机维护:维护相机设备的状态(构造中、已初始化、已配置、流运行中、错误等),确保 HAL 接口调用顺序符合规范。
  5. 错误与事件转发:将 HAL 上报的 notify 事件(如快门、错误、请求超时)转发给 Framework 的 CameraDeviceCallback。

1.4 Camera3Device与HAL接口的对接关系

Camera3Device 通过 HAL 接口结构体 与 HAL 层对接,主要包括以下三个核心结构体:

HAL结构体 作用 Camera3Device中的对应操作
camera3_device_t HAL 设备对象,包含所有操作函数指针 通过 open() 获取,调用 ops->initialize()、ops->configure_streams() 等
camera3_callback_ops_t HAL 向 Framework 回调的接口集合 Camera3Device 实现该结构体,注册给 HAL
camera3_stream_t 描述单个数据流(预览/拍照/录像)的配置 在 configureStreams() 中分配并填充
对接关键点: Camera3Device 在初始化阶段必须正确注册 camera3_callback_ops_t 回调结构体,否则 HAL 无法返回结果和事件。回调函数的实现质量直接影响相机启动速度和稳定性。

1.5 Camera3Device初始化流程概览

Camera3Device 的初始化是后续所有相机操作的基础,主要步骤包括:

  1. 构造 Camera3Device 对象:由 CameraService 在打开相机设备时创建。
  2. 打开 HAL 设备:通过 camera_module_t->common.open() 获取 camera3_device_t。
  3. 初始化 HAL:调用 camera3_device_t->ops->initialize(),传入回调结构体。
  4. 查询静态信息:调用 getCameraCharacteristics() 获取 HAL 支持的 capabilities、stream 配置等。
  5. 配置流:根据 Framework 请求的 Surface 列表,调用 configure_streams() 设置 HAL 数据流。
  6. 分配请求队列:创建内部请求缓冲区池和结果处理线程。

下图展示了 Camera3Device 在 HAL3 架构中的位置及其与上下层组件的交互关系:

Camera3Device在HAL3架构中的位置与交互 Camera3Device 在 HAL3 架构中的位置与交互 应用层 (Camera API2) Framework (CameraService) Camera3Device (桥接层) 请求序列化 / 结果反序列化 / 流管理 / 状态机 camera3_callback_ops_t (结果/事件回调) camera3_device_t (操作函数指针) HAL 层 (camera3_device) Kernel 层 (V4L2 / 传感器驱动) Camera3Device 是 Framework 与 HAL 之间的唯一桥梁,负责协议转换与生命周期管理

1.6 Camera3Device与CameraDeviceClient的关系

在 CameraService 的类继承体系中,Camera3Device 的继承关系如下:

  • CameraDeviceClient:基类,提供与 CameraService 交互的通用接口(如设置监听、处理错误)。
  • Camera3Device:派生类,专门针对 HAL3 接口实现,重写 initialize()、configureStreams()、submitRequestList() 等核心方法。

这种设计使得 CameraService 可以统一管理不同 HAL 版本的设备,而 Camera3Device 专注于 HAL3 特有的流水线处理逻辑。

设计模式: Camera3Device 采用了“策略模式”和“适配器模式”的结合——它将 HAL3 的 C 语言接口适配为 Framework 可调用的 C++ 对象,同时封装了请求流水线的调度策略。

1.7 本章小结

Camera3Device 是 Android Camera HAL3 架构中承上启下的核心组件,它:

  • 位于 Framework 的 CameraService 与 HAL 层之间。
  • 负责 请求/结果的序列化与反序列化、流配置、状态管理、事件转发。
  • 通过 camera3_device_t 和 camera3_callback_ops_t 与 HAL 层对接。
  • 初始化流程 是后续所有相机功能的基础,涉及 HAL 设备打开、回调注册、静态信息查询、流配置等关键步骤。