2. CameraProvider服务角色:进程模型、服务注册与发现机制、与CameraService的关系

在Android Camera HAL架构中,CameraProvider是连接CameraService与底层硬件驱动的核心桥梁。它运行在独立的进程中,通过HIDL / AIDL接口向CameraService提供统一的相机设备访问能力。理解CameraProvider的进程模型、服务注册与发现机制以及它与CameraService的协作关系,是进行HAL层调试的基础。

2.1 CameraProvider进程模型

CameraProvider采用多进程、多实例的部署模型,每个Provider进程可以管理一个或多个Camera设备(如后置主摄、前置广角、深度传感器等)。这种设计实现了进程隔离,即使某个Provider崩溃,也不会影响CameraService或其他Provider的运行。

关键设计原则: CameraProvider进程与CameraService进程分离,Provider进程由cameraserver或hwservicemanager按需启动,生命周期独立管理。

2.1.1 进程模型架构

下图展示了CameraProvider在Android系统中的进程布局:

CameraProvider 进程模型架构 CameraService 进程: cameraserver Provider 进程 1 管理: 后置主摄 + 广角 Provider 进程 2 管理: 前置摄像头 HAL 实现层(SoC 厂商提供) Camera HAL 3.x / 4.x 实现 内核驱动层 V4L2 / ISP 驱动 / 传感器驱动 每个 Provider 进程独立管理一组 Camera 设备,通过 HIDL/AIDL 与 CameraService 通信

2.1.2 进程生命周期管理

阶段 触发条件 动作
启动 CameraService 首次请求该 Provider 管理的设备 hwservicemanager 按需 fork 或 exec Provider 进程
运行 持续提供相机服务 进程保持活跃,维护设备状态机
空闲超时 所有设备关闭且超过空闲阈值 Provider 进程自行退出,释放资源
异常崩溃 HAL 层 crash 或 watchdog 超时 CameraService 检测到死亡通知,标记设备不可用
调试提示: 使用 ps -A | grep camera 可以查看当前运行的 CameraProvider 进程列表。每个 Provider 进程通常以 android.hardware.camera.provider@2.x-service-xxx 命名。

2.2 服务注册与发现机制

CameraProvider 使用 Android 的 hwservicemanager(HIDL 服务管理器)或 servicemanager(AIDL 服务管理器)进行服务注册与发现。这是 Android Treble 架构的核心组件,实现了框架与 HAL 的解耦。

2.2.1 注册流程

  1. Provider 进程启动:初始化 HAL 实现,加载对应 Camera 设备。
  2. 创建服务实例:实例化 ICameraProvider 接口对象。
  3. 注册到 hwservicemanager:调用 defaultServiceManager()->addService() 注册服务名。
  4. 服务名规范:格式为 android.hardware.camera.provider@2.x::ICameraProvider/<instance_name>。
  5. 等待客户端连接:进入服务循环,等待 CameraService 调用。
// 注册示例(HIDL 方式)
using android::hardware::camera::provider::V2_4::ICameraProvider;
using android::hardware::defaultServiceManager;

sp<ICameraProvider> provider = new CameraProviderImpl();
status_t status = defaultServiceManager()->addService(
    "android.hardware.camera.provider@2.4::ICameraProvider/legacy/0",
    provider);
if (status != OK) {
    ALOGE("Failed to register CameraProvider service: %d", status);
}

2.2.2 发现流程

CameraService 启动后,通过以下步骤发现所有可用的 CameraProvider:

CameraProvider 服务发现流程 CameraService 启动 查询服务列表 hwservicemanager 返回已注册服务列表 匹配服务名 过滤 camera.provider 连接 Provider 获取服务代理 调用 getCameraIdList() 获取设备列表 每个 Provider 返回其管理的 Camera 设备 ID 列表 构建全局 Camera 设备映射表 Provider 实例 ↔ Camera ID ↔ 设备状态 发现过程在 CameraService 初始化阶段完成,后续通过死亡通知机制监控 Provider 存活状态

2.2.3 多实例与命名规范

实例类型 服务名示例 说明
默认后置 .../ICameraProvider/legacy/0 传统 HAL 实现,管理后置摄像头
默认前置 .../ICameraProvider/legacy/1 传统 HAL 实现,管理前置摄像头
外部 USB .../ICameraProvider/external/0 外部 USB 摄像头 Provider
虚拟设备 .../ICameraProvider/virtual/0 模拟器或虚拟摄像头 Provider

2.3 CameraProvider 与 CameraService 的关系

CameraService 是 Android 相机框架的核心服务,而 CameraProvider 是 HAL 层的服务提供者。两者之间是客户端-服务端关系,通过 HIDL/AIDL 接口进行跨进程通信。

2.3.1 职责划分

组件 职责 关键接口
CameraService
  • 管理应用层 Camera API 请求
  • 协调多个 Camera 设备的使用
  • 权限检查与策略执行
  • Provider 生命周期管理
ICameraService
CameraProvider
  • 封装 HAL 实现细节
  • 管理 Camera 设备状态机
  • 提供设备能力查询
  • 处理底层硬件操作
ICameraProvider

2.3.2 通信接口层次

CameraService 与 CameraProvider 之间的通信链路如下:

CameraService ↔ CameraProvider 通信接口层次 应用层 (Camera2 API / Camera1 API) CameraService (ICameraService) HIDL / AIDL 接口层 (ICameraProvider) CameraProvider 实现 (HAL 层)

2.3.3 关键交互流程

典型交互场景: 当应用打开相机时,CameraService 通过以下步骤与 CameraProvider 协作:
  1. CameraService 根据 Camera ID 查找对应的 Provider 实例。
  2. 调用 ICameraProvider::getCameraDeviceInterface() 获取设备接口。
  3. 通过返回的 ICameraDevice 接口下发 capture request。
  4. Provider 将 request 转换为 HAL 调用,驱动底层硬件。
  5. 结果通过回调接口返回 CameraService,再传递给应用。

2.3.4 死亡通知与恢复机制

CameraService 通过 linkToDeath() 机制监控 Provider 进程状态:

  • 正常退出:Provider 调用 unlinkToDeath() 通知 CameraService 释放资源。
  • 异常崩溃:CameraService 收到死亡回调,标记该 Provider 管理的所有设备为 STATUS_NOT_AVAILABLE。
  • 恢复策略:CameraService 尝试重新发现 Provider(通过 hwservicemanager 的 registerForNotifications()),但不会自动重启崩溃的 Provider 进程。
调试注意: 在调试过程中,如果手动 kill 了 CameraProvider 进程,CameraService 会立即检测到死亡事件。此时需要重新启动 Provider 进程(通常通过 adb shell start 或重启 cameraserver),否则相机应用会持续报错 CAMERA_ERROR_SERVER_DIED。

2.4 本章小结

知识点 核心要点
进程模型 多进程独立部署,每个 Provider 管理一组 Camera 设备,进程隔离保障稳定性
服务注册 通过 hwservicemanager 注册,服务名遵循 package@version::interface/instance 规范
服务发现 CameraService 启动时查询所有 camera.provider 服务,构建设备映射表
通信关系 客户端-服务端模式,通过 HIDL/AIDL 接口跨进程通信,支持死亡通知机制