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 承担以下核心职责,这些职责直接决定了上层框架能否正确发现和使用相机设备:

  1. 设备枚举:向框架提供当前可用的相机设备 ID 列表,包括物理相机和逻辑相机(多摄融合)。
  2. 设备能力查询:返回每个相机设备的静态元数据(CameraCharacteristics),如传感器尺寸、支持的分辨率、AE/AWB 能力等。
  3. 设备实例创建:当框架请求打开某个相机时,Provider 创建并返回对应的 ICameraDevice 接口实例。
  4. 资源管理:跟踪设备打开/关闭状态,防止同一设备被重复打开,管理底层硬件资源。
  5. 回调通知:通过 ICameraProviderCallback 向框架通知设备热插拔、状态变化等事件。
职责边界:Provider 不处理图像数据流、不执行 3A 算法、不管理 buffer 队列——这些是 CameraDevice 和 CameraStream 层的职责。Provider 只负责“提供”和“管理”相机设备实例。
Camera Provider 核心职责结构 Camera Provider 设备枚举 能力查询 设备实例创建 资源管理 回调通知 职责分离原则 Provider 只负责设备管理和实例提供,不参与数据流处理

2.3 Camera Provider 的生命周期

Camera Provider 的生命周期从进程启动开始,到进程退出结束。其典型生命周期包含以下阶段:

阶段 触发条件 关键操作
1. 初始化 Provider 进程启动 加载 HAL 库、初始化硬件抽象层、创建内部数据结构
2. 注册 初始化完成 向 hwservicemanager 注册服务,等待框架连接
3. 服务 框架调用接口 处理设备枚举、能力查询、设备打开/关闭等请求
4. 热插拔 USB 相机插入/拔出 动态更新设备列表,通过回调通知框架
5. 销毁 进程退出或 crash 释放所有设备资源、关闭硬件、注销服务
生命周期注意事项:
  • Provider 进程崩溃会导致所有相机设备不可用,框架会尝试重新连接。
  • 热插拔场景下,Provider 必须保证设备列表更新的原子性,避免框架读到不一致状态。
  • 销毁阶段必须确保所有已打开的相机设备被正确关闭,否则可能导致硬件死锁。
Camera Provider 生命周期状态机 初始化 已注册 服务中 热插拔 销毁 注册成功 框架连接 设备热插拔 更新列表 恢复 进程退出 初始化失败 → 直接销毁

2.4 Provider 与框架的交互模型

Camera Provider 与 camera_service 之间采用 客户端-服务端 模型,通过 Binder 进行跨进程通信。以下是典型的交互流程:

  1. 服务发现:camera_service 通过 hwservicemanager 查询已注册的 Camera Provider 服务。
  2. 获取 Provider 接口:框架调用 ICameraProvider::getCameraIdList() 获取设备列表。
  3. 查询设备能力:框架遍历设备 ID,调用 getCameraDeviceInterface() 获取每个设备的接口,并读取其静态元数据。
  4. 打开设备:框架调用 ICameraDevice::open() 打开指定相机,开始数据流处理。
  5. 事件通知: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 的设备列表。