2. Camera Provider 概念:定义、职责与生命周期
Camera Provider(相机提供者)是 Android Camera HAL 框架中连接 HAL 实现与 框架服务的核心中间层。它封装了底层硬件抽象的具体实现,并通过标准化接口向 camera_service 暴露相机设备的能力。理解 Provider 的定义、职责与生命周期,是掌握整个 Camera HAL 框架的基石。
2.1 Camera Provider 的定义
Camera Provider 是一个实现了 ICameraProvider HIDL / AIDL 接口的独立进程或服务。它负责管理一个或多个物理相机设备(如主摄、广角、长焦),并提供设备枚举、能力查询和设备实例创建等功能。
| 维度 | 说明 |
|---|---|
| 接口类型 | HIDL(Android 8~10)或 AIDL(Android 11+) |
| 进程模型 | 独立进程,与 cameraserver 分离,通过 Binder 通信 |
| 实现位置 | vendor/ 或 hardware/ 目录下的厂商 HAL 代码 |
| 注册方式 | 通过 lshal 或 hwservicemanager 注册为系统服务 |
| 核心接口 | getCameraIdList()、getCameraDeviceInterface()、setCallback() |
关键理解:Camera Provider 是“相机设备的容器”,它不直接操作硬件,而是将 HAL 实现包装成框架可调用的服务接口。每个 Provider 可以管理多个物理相机,也可以只管理一个。
2.2 Camera Provider 的职责
Camera Provider 承担以下核心职责,这些职责直接决定了上层框架能否正确发现和使用相机设备:
- 设备枚举:向框架提供当前可用的相机设备 ID 列表,包括物理相机和逻辑相机(多摄融合)。
- 设备能力查询:返回每个相机设备的静态元数据(
CameraCharacteristics),如传感器尺寸、支持的分辨率、AE/AWB 能力等。 - 设备实例创建:当框架请求打开某个相机时,Provider 创建并返回对应的
ICameraDevice接口实例。 - 资源管理:跟踪设备打开/关闭状态,防止同一设备被重复打开,管理底层硬件资源。
- 回调通知:通过
ICameraProviderCallback向框架通知设备热插拔、状态变化等事件。
职责边界:Provider 不处理图像数据流、不执行 3A 算法、不管理 buffer 队列——这些是
CameraDevice 和 CameraStream 层的职责。Provider 只负责“提供”和“管理”相机设备实例。
2.3 Camera Provider 的生命周期
Camera Provider 的生命周期从进程启动开始,到进程退出结束。其典型生命周期包含以下阶段:
| 阶段 | 触发条件 | 关键操作 |
|---|---|---|
| 1. 初始化 | Provider 进程启动 | 加载 HAL 库、初始化硬件抽象层、创建内部数据结构 |
| 2. 注册 | 初始化完成 | 向 hwservicemanager 注册服务,等待框架连接 |
| 3. 服务 | 框架调用接口 | 处理设备枚举、能力查询、设备打开/关闭等请求 |
| 4. 热插拔 | USB 相机插入/拔出 | 动态更新设备列表,通过回调通知框架 |
| 5. 销毁 | 进程退出或 crash | 释放所有设备资源、关闭硬件、注销服务 |
生命周期注意事项:
- Provider 进程崩溃会导致所有相机设备不可用,框架会尝试重新连接。
- 热插拔场景下,Provider 必须保证设备列表更新的原子性,避免框架读到不一致状态。
- 销毁阶段必须确保所有已打开的相机设备被正确关闭,否则可能导致硬件死锁。
2.4 Provider 与框架的交互模型
Camera Provider 与 camera_service 之间采用 客户端-服务端 模型,通过 Binder 进行跨进程通信。以下是典型的交互流程:
- 服务发现:
camera_service通过hwservicemanager查询已注册的 Camera Provider 服务。 - 获取 Provider 接口:框架调用
ICameraProvider::getCameraIdList()获取设备列表。 - 查询设备能力:框架遍历设备 ID,调用
getCameraDeviceInterface()获取每个设备的接口,并读取其静态元数据。 - 打开设备:框架调用
ICameraDevice::open()打开指定相机,开始数据流处理。 - 事件通知:Provider 通过回调接口
ICameraProviderCallback向框架报告设备状态变化。
多 Provider 场景:Android 系统允许同时存在多个 Camera Provider(如内置相机 Provider + USB 相机 Provider)。框架会枚举所有已注册的 Provider,合并其设备列表,对外呈现统一的相机设备集合。
2.5 Provider 实现的关键接口
以下是一个简化的 Camera Provider AIDL 接口定义示例,展示了核心方法签名:
// ICameraProvider.aidl (Android 11+)
interface ICameraProvider {
// 返回当前可用的相机设备 ID 列表
String[] getCameraIdList();
// 根据设备 ID 获取相机设备接口
ICameraDevice getCameraDeviceInterface(String cameraId);
// 设置回调,用于通知框架设备状态变化
void setCallback(ICameraProviderCallback callback);
// 查询 Provider 支持的相机设备类型
int getProviderType();
// 通知 Provider 某个设备已断开(热插拔场景)
void notifyDeviceStateChange(String cameraId, int newState);
}
接口实现注意事项:
getCameraIdList()返回的 ID 必须全局唯一,且不能包含特殊字符。getCameraDeviceInterface()在设备已被打开时应返回null或抛出异常,避免重复打开。- 回调接口必须是非阻塞的,Provider 不应在回调中执行耗时操作。
2.6 本章小结
Camera Provider 是 Camera HAL 框架的“入口点”,它定义了框架如何发现和访问底层相机硬件。理解 Provider 的定义、职责和生命周期,有助于后续章节中深入分析 Provider 注册流程和设备枚举机制。核心要点包括:
- Provider 是一个独立进程,通过 Binder 与框架通信。
- 职责聚焦于设备枚举、能力查询、实例创建和资源管理。
- 生命周期包含初始化、注册、服务、热插拔和销毁五个阶段。
- 多 Provider 共存时,框架会合并所有 Provider 的设备列表。