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系统中的进程布局:
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 注册流程
- Provider 进程启动:初始化 HAL 实现,加载对应 Camera 设备。
- 创建服务实例:实例化
ICameraProvider接口对象。 - 注册到 hwservicemanager:调用
defaultServiceManager()->addService()注册服务名。 - 服务名规范:格式为
android.hardware.camera.provider@2.x::ICameraProvider/<instance_name>。 - 等待客户端连接:进入服务循环,等待 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:
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 |
|
ICameraService |
| CameraProvider |
|
ICameraProvider |
2.3.2 通信接口层次
CameraService 与 CameraProvider 之间的通信链路如下:
2.3.3 关键交互流程
典型交互场景: 当应用打开相机时,CameraService 通过以下步骤与 CameraProvider 协作:
- CameraService 根据 Camera ID 查找对应的 Provider 实例。
- 调用
ICameraProvider::getCameraDeviceInterface()获取设备接口。 - 通过返回的
ICameraDevice接口下发 capture request。 - Provider 将 request 转换为 HAL 调用,驱动底层硬件。
- 结果通过回调接口返回 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 接口跨进程通信,支持死亡通知机制 |