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

CameraProvider 是 Android Camera HAL 架构中连接 CameraService(框架层)与 HAL3(硬件抽象层实现)的核心中间件。它作为独立进程运行,通过 HIDL / AIDL 接口向 CameraService 暴露相机设备能力,并负责加载、管理底层 HAL 实现库。

1.1 架构位置与核心职责

在 Android Treble 架构下,CameraProvider 将 HAL 实现从框架进程解耦,形成清晰的 服务端-客户端 模型。其核心职责包括:

  • 设备枚举与能力查询:通过 ICameraProvider::getCameraIdList() 返回可用相机设备列表,并通过 getCameraDeviceInterface() 暴露每个设备的操作接口。
  • HAL 库生命周期管理:动态加载 camera..so 等 HAL 实现库,管理其初始化、配置与卸载。
  • 进程间通信桥接:将 CameraService 的 HIDL/AIDL 请求转换为 HAL3 函数调用,并将 HAL 返回的结果、事件、回调数据回传给框架。
  • 多摄像头协同:支持同时管理多个物理摄像头设备,包括逻辑摄像头(多摄融合)的组建设备。
关键点:CameraProvider 是 Android 相机系统中唯一直接与 HAL 实现库交互的系统组件,其稳定性直接影响相机服务的可用性。

1.2 与 CameraService、HAL3 的关系

三者构成典型的 分层调用 关系,CameraProvider 处于中间层,承担协议转换与进程隔离的职责。下表总结了各层的角色与交互方式:

组件 进程 主要接口 职责
CameraService cameraserver ICameraService / ICameraDeviceUser 管理相机权限、会话生命周期、上层 API 实现(如 Camera2)
CameraProvider 独立进程(如 android.hardware.camera.provider@2.7-service) ICameraProvider / ICameraDevice HAL 加载、设备枚举、HIDL/AIDL 到 HAL3 的协议转换
HAL3 共享库(.so) camera3_device_t / camera3_callback_ops_t 硬件操作实现:打开设备、配置流、提交请求、返回结果

1.3 进程间通信与数据流

下图展示了 CameraService 发起打开相机设备请求时,数据在三个组件间的完整流动路径:

CameraProvider 与 CameraService、HAL3 通信架构图 CameraProvider 通信架构与数据流 CameraService cameraserver 进程 CameraProvider HAL 服务进程 HAL3 实现 camera3_device_t HIDL/AIDL 函数调用 典型数据流(打开相机设备) 1. CameraService 调用 ICameraProvider::getCameraIdList() 获取可用设备 2. CameraService 调用 ICameraProvider::getCameraDeviceInterface() 获取设备操作接口 3. CameraProvider 加载 HAL3 库,调用 open() 创建 camera3_device_t 实例 回调与事件路径(异步) HAL3 通过 camera3_callback_ops_t 将结果、错误、缓冲区返回给 CameraProvider CameraProvider 通过 HIDL/AIDL 回调将数据转发至 CameraService

1.4 关键接口与协议版本

CameraProvider 的接口定义经历了从 HIDL 到 AIDL 的演进,不同 Android 版本使用的协议版本如下:

Android 版本 接口类型 Provider 版本 HAL 版本
Android 8.x - 9.x HIDL @2.4 / @2.5 HAL3
Android 10 - 12 HIDL @2.6 / @2.7 HAL3
Android 13+ AIDL aidl android.hardware.camera.provider HAL3
实践提示:在 Android 13 及以上版本中,CameraProvider 默认使用 AIDL 接口。如果设备需要兼容旧版 HIDL HAL,必须通过 camera.provider.aidl 服务配置进行桥接。

1.5 进程模型与故障隔离

CameraProvider 作为独立进程运行,带来以下关键优势:

  • 故障隔离:HAL 实现崩溃不会直接导致 CameraService 进程退出,Provider 进程可被重启恢复。
  • 权限分离:Provider 进程可以运行在独立的 SELinux 上下文中,限制对系统资源的访问。
  • 资源管理:Provider 进程可以独立管理内存、文件描述符等资源,避免与框架层资源竞争。
常见故障场景:当 CameraProvider 进程因 HAL 库崩溃而异常退出时,CameraService 会收到死亡通知(death notification)。此时所有已打开的相机设备将进入错误状态,上层应用会收到 CAMERA_ERROR_SERVER_DIED 错误码。排查时应优先检查 Provider 进程的 logcat 输出。

1.6 启动与注册流程

CameraProvider 的启动由 hwservicemanager(HIDL 时代)或 servicemanager(AIDL 时代)管理。典型启动序列如下:

  1. init.rc 启动服务:系统启动时,init 进程根据 android.hardware.camera.provider@2.7-service.rc 启动 Provider 进程。
  2. 注册到 ServiceManager:Provider 进程初始化后,调用 registerAsService() 将自身注册到 ServiceManager。
  3. CameraService 发现服务:CameraService 通过 ServiceManager 查询 CameraProvider 服务,获取代理对象。
  4. 设备枚举:CameraService 调用 getCameraIdList() 获取可用设备列表,完成初始化。
// 典型 CameraProvider 服务注册代码(HIDL 版本)
sp<ICameraProvider> provider = new CameraProvider();
status_t status = provider->registerAsService("legacy/0");
if (status != OK) {
    ALOGE("Failed to register CameraProvider service: %d", status);
    return;
}

通过以上架构设计,CameraProvider 在 Android 相机系统中承担了承上启下的关键角色,既为上层框架提供了统一的硬件抽象接口,又为底层 HAL 实现提供了稳定的运行环境。