当前位置: 首页 > news >正文

关于virtual camera

本人不了解android 15后引入的virtual camera模块,通过chatgpt生成以下内容,以下内容未得到验证,仅作参考。

一、源码路径 / Where is it in AOSP?

  • 核心实现目录
    frameworks/av/services/camera/virtualcamera/(包含 Android.bp、service/main、Provider/Device/Session 等实现)(Android Git Repositories)

  • 可执行与 init 脚本
    可执行名:virtual_camera(由 main.cc 构建)
    init 脚本:virtual_camera.hal.rc(定义成一个 init 服务,并声明 AIDL 接口与 Camera Provider 实例)(Android Git Repositories)

  • AIDL 接口(虚拟相机服务对上层 System Server/管理方暴露的接口)
    frameworks/av/services/camera/virtualcamera/aidl/android/companion/virtualcamera/*.aidl,其中 IVirtualCameraService.aidl 支持注册/反注册虚拟相机、按 token 查询 cameraId 等。(Android Git Repositories)

  • SELinux(域与策略)
    sepolicy 中新增了 virtual_camera 域与相关权限,位于 system/sepolicy(私有策略里有 virtual_camera.te 等变更)。(Android Git Repositories)

  • CameraService 与虚拟相机的协作痕迹
    CameraService 侧有对“虚拟相机不可被 injection 替换”的逻辑,说明框架已识别这一路径。(Android Git Repositories)

  • 变更/特性开关
    框架提交里可见该特性受 flag 控制(android.companion.virtual.flags.virtual_camera),并支持“非数字的 cameraId(带前缀)”以避免与其他 HAL 冲突。(Android Git Repositories)


二、它是如何“导通”到系统里的? / How does it plug into the camera stack?

  • 作为一个 AIDL Camera Provider 实例挂载:
    virtual_camera.hal.rc 把服务声明为:

    • AIDL 接口 virtual_camera
    • Camera Provider 实例:android.hardware.camera.provider.ICameraProvider/virtual/0
      这意味着它以 provider 的形式被 CameraService 发现并纳入相机枚举与打开流程。脚本片段(简述):
    service virtual_camera /system/bin/virtual_cameraclass core...interface aidl virtual_camerainterface aidl android.hardware.camera.provider.ICameraProvider/virtual/0oneshotdisabled
    

    disabled + oneshot:默认不自启,需要受控拉起;每次运行一次性生存期。)(Android Git Repositories)

  • 对上层的管理面接口:
    通过 IVirtualCameraService.aidl,系统组件(主要是 Companion Virtual Device 相关服务)可以:

    • registerCamera(token, config) 注册一个虚拟相机
    • unregisterCamera(token) 反注册
    • getCameraId(token) 获取对应的框架侧 cameraId
      这些接口是 @hide 的系统内部接口,并非普通三方 App 直接使用。(Android Git Repositories)
  • 安全 / 策略:
    SELinux 为 virtual_camera 定义了独立域与能力,确保它在系统域内受控运行。(Android Git Repositories)


三、怎么在你的 AOSP 构建里启用 / 构建?

How to enable/build it in your AOSP build?

下面以普通 handheld/product 为例,给出“最小可用”的思路;具体还需结合你设备/产品的分区与 VINTF 约束做适配。

  1. 把可执行加入产品包
    在你的 device/<vendor>/<product>/<product>.mk(或 product.mk)里加上:
PRODUCT_PACKAGES += virtual_camera

这会把 frameworks/av/services/camera/virtualcamera/Android.bp 里定义的可执行 virtual_camera 以及依赖编进 /system/bin/virtual_camera。(Android Git Repositories)

  1. (通常不需要)VINTF/Manifest
    virtual_camera.hal.rc 已声明为 AIDL provider 接口实例;大多数 AOSP 参考设备(如 Cuttlefish)通过产品包清单打进系统即可识别,不必像传统 HIDL HAL 那样手改 manifest。你若做强一致 VINTF 校验,请按设备策略评估。(构建系统里也能看到把该二进制纳入系统镜像的条目痕迹。)(Android Git Repositories)

  2. 策略与权限
    系统 sepolicy 已包含 virtual_camera 域的 policy 片段,通常无需你另行添加域;若你要扩展访问外设/文件等,再追加本机策略 overlay。(Android Git Repositories)

  3. (可能需要)打开特性 Flag
    有提交显示该特性受 android.companion.virtual.flags.virtual_camera gating。若你的分支默认关闭,需要在设备 overlay 或 DeviceConfig/flags 体系中打开对应开关,确保系统服务端能调用 IVirtualCameraService 完成注册。(Android Git Repositories)


四、如何在设备上启动与验证?

How to start & verify on device?

由于 virtual_camera 在 rc 里是 disabled + oneshot,通常由系统服务在需要时拉起。你也可以手动验证:

  1. 手动拉起服务(root/eng):
adb root && adb shell setprop log.tag.VirtualCameraService DEBUG
adb shell start virtual_camera

logcat(关键 tag/类名里常见 “VirtualCamera*”),确认 provider 实例已注册。然后:

adb shell dumpsys media.camera

在 provider 列表里检查是否有 ICameraProvider/virtual/0 及相机枚举项。(Android Git Repositories)

  1. 框架侧验证
  • 运行相关测试:

    atest virtual_camera_tests
    atest CtsVirtualDevicesCameraTestCases
    

    提交记录里也用这些测试名做过验证。(Android Git Repositories)

  • CameraService 侧也有针对“虚拟相机不可被注入替换”的保护逻辑,dumpsys media.camera 可侧面看到 provider 和 device 的可见性。(Android Git Repositories)

  1. 应用侧可见性
    虚拟相机一旦注册成功,会以 不与物理相机 ID 冲突 的形式挂到框架(可能带前缀/非纯数字 ID)。应用通过 CameraManager#getCameraIdList() 能看见新 ID(具体暴露策略随分支/flag 而变动)。(Android Git Repositories)

五、和谁配合? / Who drives it in framework?

  • 该模块与 Companion Virtual Device(虚拟设备管理) 路线有关:从目录与 OWNERS 可见,frameworks/base/services/companion/virtual 团队参与,AIDL 包路径也在 android.companion.virtualcamera 名下。(Android Git Repositories)

  • 更广泛的 Camera 文档与版本差异、HAL 结构可以参考官方说明(中/英文都有),便于理解它在整体 Camera 栈的定位。(Android Open Source Project)


常见踩坑 / Tips

  • 别把它当传统 HAL 去改 HIDL/manifest:它是 AIDL provider,按 rc 与服务拉起即可被 CameraService 识别。(Android Git Repositories)
  • Flag gating:若你“能编过、拉得起、却看不到任何虚拟相机”,先检查分支上是否启用 android.companion.virtual.flags.virtual_camera。(Android Git Repositories)
  • 权限与域:自带 virtual_camera SELinux 域;自定义访问时再扩展策略,避免把它放进不安全域。(Android Git Repositories)

参考 / References

  • AOSP 代码(virtualcamera 目录、bp、rc、AIDL):(Android Git Repositories)
  • sepolicy 变更(virtual_camera 域):(Android Git Repositories)
  • CameraService 侧相关逻辑:(Android Git Repositories)
  • 特性/提交说明(非数字 ID、flag 名):(Android Git Repositories)
  • 官方相机文档(英/中):(Android Open Source Project)

TL;DR(中文)

  • 源码frameworks/av/services/camera/virtualcamera/
  • 角色:以 AIDL Camera Provider 实例ICameraProvider/virtual/0)接入。
  • 启用PRODUCT_PACKAGES += virtual_camera,必要时打开 android.companion.virtual.flags.virtual_camera
  • 验证start virtual_cameradumpsys media.camera / 运行 atest virtual_camera_tests

TL;DR (English)

  • Source: frameworks/av/services/camera/virtualcamera/.
  • How it plugs in: registers an AIDL Camera Provider instance (ICameraProvider/virtual/0).
  • Enable: add virtual_camera to PRODUCT_PACKAGES; ensure the feature flag android.companion.virtual.flags.virtual_camera is on if your branch gates it.
  • Verify: start virtual_camera, check with dumpsys media.camera, and run atest virtual_camera_tests.
http://www.dtcms.com/a/353724.html

相关文章:

  • UE5 PCG 笔记(三) Height To Density 节点
  • UE5 查找组件
  • UE5多人MOBA+GAS 55、基于 Python 协调器与 EOS 的会话编排
  • 嵌入式Linux自学不走弯路!670+讲课程!系统学习路线:入门+应用+ARM+驱动+移植+项目 (STM32MP157开发板)
  • 快速入门PowerDesigner-Database
  • 软件开发整体介绍和Swagger介绍和使用步骤
  • Dubbo加标签方式
  • Ubuntu 22.04 插入光驱后磁盘满启动故障clean, ...files, ...blocks
  • Proxmox VE 中启用 CentOS 虚拟机的串口终端(xterm.js 控制台)
  • MAX系列FPGA型号对比及低功耗特性分析
  • 服务器类型与TCP并发服务器构建(SELECT)
  • 冬天的思念
  • 数模笔记day01(数据预处理、K-means聚类、遗传算法、概率密度分布)
  • SqlHelper类库的使用方法
  • 关于DTO、DO、BO、VO
  • Linux系统性能优化全攻略:从CPU到网络的全方位监控与诊断
  • [实战] 半导体工厂生产网络项目案例分享
  • 遥感语义分割消融实验+对比实验
  • AI驱动的前端性能优化:从监控到自动化修复
  • SymPy 与 NumPy 混合编程:解决矩阵类型转换与数学函数兼容性问题
  • 计算机视觉全流程(基础知识)
  • 耐达讯自动化Profibus 集线器:变送器连接的神秘王牌
  • SCDN如何保护敏感内容不被非法访问?
  • 【PyTorch从入门到实战】全面解析PyTorch框架:安装、原理、MNIST实战与核心组件
  • 数据采集如何选择移动代理IP?合理避免网站封禁实战经验
  • Agno Agent​​
  • 需求变更的影响如何评估
  • AI Agent 发展趋势与架构演进
  • 神经网络|(十六)概率论基础知识-伽马函数·上
  • PowerShell下vim编辑文件时产生的额外文件