CameraService服务管理:Android相机资源的“大管家“

张开发
2026/4/9 5:26:44 15 分钟阅读
CameraService服务管理:Android相机资源的“大管家“
引言:谁来仲裁相机资源争夺战?想象这样一个场景:你正在用第三方相机 APP 录制 4K 视频,这时微信来了一个视频通话请求。你接了通话——这时候,系统需要把相机从录像 APP "抢"过来交给微信。这场"争夺战"怎么判定胜负?凭什么微信就能赢?被抢走的录像 APP 怎么感知到这件事?抢走后如何安全地交接给新的使用者?这一切,都是CameraService负责的事情。CameraService 是 Android 相机体系的核心服务,运行在独立的cameraserver进程中,扮演着"相机资源大管家"的角色。它:管理所有物理相机设备的状态仲裁多应用竞争相机的冲突连接 Java 层 Camera2 API 与底层 HAL Provider控制相机权限和隐私指示器应对温度过高时的 Thermal 限流本文是Android 15 视频子系统系列第 2 篇,深入剖析 CameraService 的服务架构和资源管理机制。本文内容:CameraService 整体架构与模块组成CameraProviderManager 与 HAL Provider 管理多应用相机资源仲裁机制(核心!)相机权限与隐私保护性能、功耗与 Thermal 管理调试工具完全指南一、CameraService 整体架构1.1 进程与启动CameraService 运行在cameraserver独立进程中,在系统启动时由init进程拉起:# frameworks/av/camera/cameraserver/cameraserver.rc service cameraserver /system/bin/cameraserver class main user cameraserver group audio camera input drmrpc ioscheduler rt 4 writepid /dev/cpuset/camera-daemon/tasks /dev/stune/top-app/tasks// frameworks/av/camera/cameraserver/main_cameraserver.cppintmain(intargc __unused,char**argv __unused){signal(SIGPIPE,SIG_IGN);// 设置进程优先级hardware::configureRpcThreadpool(5,false);spProcessStateproc(ProcessState::self());spIServiceManagersm=defaultServiceManager();// 注册 CameraService 到 ServiceManagerCameraService::instantiate();// 注册 Android SensorsSensorService::instantiate();ProcessState::self()-startThreadPool();IPCThreadState::self()-joinThreadPool();}注意cameraserver进程以cameraserver用户身份运行(非 root),并且加入了camera组,这是 SELinux 权限控制的一部分。1.2 四大核心模块CameraService 内部由四个核心模块组成,各司其职:模块对应类核心职责Binder 服务端CameraDeviceClient接收 App 的 Camera2 API 调用,通过 Binder 暴露给 Java 层Provider 管理器CameraProviderManager管理所有 Camera HAL Provider,枚举相机设备,查询设备能力客户端管理器ClientManager跟踪所有已连接的相机客户端,实施优先级仲裁和抢占权限管理器CameraService::PermissionHandler校验 CAMERA 权限,触发隐私指示器,实施 Thermal 限流frameworks/av/services/camera/libcameraservice/ ├── CameraService.cpp # 主服务入口,多应用仲裁 ├── CameraService.h ├── common/ │ └── CameraProviderManager.cpp # Provider 管理 ├── api2/ │ └── CameraDeviceClient.cpp # Camera2 API 服务端 ├── utils/ │ └── ClientManager.cpp # 客户端优先级管理 └── device3/ └── Camera3Device.cpp # Camera3 设备实现二、CameraProviderManager:HAL 的"中间人"2.1 Provider 是什么?Camera HAL3 的架构中,ICameraProvider是芯片厂商(高通/MTK/三星)向 Android 框架暴露相机能力的接口。一台设备上可能有多个 Provider:Provider 类型类名说明内置相机 ProviderInternalCameraProvider管理前置/后置摄像头,最常见外接相机 ProviderExternalCameraProvider管理 USB 外接摄像头,支持热插拔旧版兼容 ProviderLegacyCameraProvider为 HAL1/HAL3 以下设备提供兼容层// frameworks/av/services/camera/libcameraservice/common/CameraProviderManager.cppstatus_tCameraProviderManager::initialize(wpStatusListenerlistener,ServiceInteractionProxy*proxy){// 通过 AIDL/HIDL 发现所有已注册的 CameraProviderautomanager=hardware::camera::provider::V2_4::ICameraProvider::getService("legacy/0");if(manager!=nullptr){addProviderLocked("legacy/0",manager);}// 监听新 Provider 的动态注册(USB 相机热插拔时触发)// ...returnOK;}2.2 相机设备枚举当 App 调用CameraManager.getCameraIdList()时,最终调用的是:// frameworks/av/services/camera/libcameraservice/CameraService.cppStatusCameraService::getCameraIds(std::vectorstd::string*ids){Mutex::Autolockl(mServiceLock);// 从 CameraProviderManager 获取所有可用相机 IDautoproviderManager=mCameraProviderManager;providerManager-getCameraDeviceIds(ids);// 过滤掉当前进程无权访问的相机(权限检查)autocaller=CameraThreadState::getCallingPid();// ...returnStatus::ok();}2.3 相机特性查询CameraCharacteristics数据从 HAL Provider 一路流上来:// 查询流程:Java 层 → CameraService → CameraProviderManager → HAL ProviderStatusCameraService::getCameraCharacteristics(conststd::stringcameraId,inttargetSdkVersion,CameraMetadata*characteristics){// 1. 通过 ProviderManager 找到对应的 ProviderspCameraProviderManager::ProviderInfo::DeviceInfodeviceInfo;mCameraProviderManager-getCameraCharacteristics(cameraId,characteristics);// 2. 追加 CameraService 层的补充特性(如 HAL 支持的最大连接数)// ...returnStatus

更多文章