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 层。
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(结果、事件、缓冲区) |
hw_module_t 和 hw_device_t 标准结构体与 HAL 层通信。所有硬件相关的操作都被 HAL 层封装。
1.3 Camera3Device的核心作用
Camera3Device 在 HAL3 架构中承担以下关键作用:
- 请求序列化与分发:将 Framework 下发的多个并发请求(预览、拍照、录像)按 HAL3 规范序列化为
camera3_capture_request_t,并调用process_capture_request送入 HAL。 - 结果收集与反序列化:接收 HAL 通过
process_capture_result回调返回的camera3_capture_result_t,解析 metadata 和缓冲区,上报给 Framework。 - 流(Stream)管理:管理从 Framework 请求的
Surface到 HAL 的camera3_stream_t的映射关系,在configure_streams阶段完成配置。 - 状态机维护:维护相机设备的状态(构造中、已初始化、已配置、流运行中、错误等),确保 HAL 接口调用顺序符合规范。
- 错误与事件转发:将 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() 中分配并填充 |
camera3_callback_ops_t 回调结构体,否则 HAL 无法返回结果和事件。回调函数的实现质量直接影响相机启动速度和稳定性。
1.5 Camera3Device初始化流程概览
Camera3Device 的初始化是后续所有相机操作的基础,主要步骤包括:
- 构造 Camera3Device 对象:由 CameraService 在打开相机设备时创建。
- 打开 HAL 设备:通过
camera_module_t->common.open()获取camera3_device_t。 - 初始化 HAL:调用
camera3_device_t->ops->initialize(),传入回调结构体。 - 查询静态信息:调用
getCameraCharacteristics()获取 HAL 支持的 capabilities、stream 配置等。 - 配置流:根据 Framework 请求的 Surface 列表,调用
configure_streams()设置 HAL 数据流。 - 分配请求队列:创建内部请求缓冲区池和结果处理线程。
下图展示了 Camera3Device 在 HAL3 架构中的位置及其与上下层组件的交互关系:
1.6 Camera3Device与CameraDeviceClient的关系
在 CameraService 的类继承体系中,Camera3Device 的继承关系如下:
CameraDeviceClient:基类,提供与 CameraService 交互的通用接口(如设置监听、处理错误)。Camera3Device:派生类,专门针对 HAL3 接口实现,重写initialize()、configureStreams()、submitRequestList()等核心方法。
这种设计使得 CameraService 可以统一管理不同 HAL 版本的设备,而 Camera3Device 专注于 HAL3 特有的流水线处理逻辑。
1.7 本章小结
Camera3Device 是 Android Camera HAL3 架构中承上启下的核心组件,它:
- 位于 Framework 的 CameraService 与 HAL 层之间。
- 负责 请求/结果的序列化与反序列化、流配置、状态管理、事件转发。
- 通过
camera3_device_t和camera3_callback_ops_t与 HAL 层对接。 - 初始化流程 是后续所有相机功能的基础,涉及 HAL 设备打开、回调注册、静态信息查询、流配置等关键步骤。