当前位置: 首页 > 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.xdnf.cn/news/1378513.html

相关文章:

  • 【C++游记】模板升级
  • 【半导体制造流程概述】
  • windows 子系统 wsl 命令的用法
  • vue3 字符 居中显示
  • SpringBoot整合Redis:从入门到实战的完整指南
  • 关于DTO、DO、BO、VO
  • 工业 DCS 全面科普:从入门到 AI 赋能的未来
  • mybatis-plus实现苍穹外卖项目-分类操作,不定期更新-day2
  • 【和春笋一起学C++】(三十七)类的析构函数
  • 死锁产生的条件是什么? 如何进行死锁诊断?
  • leetcode 974 和可被K整除的子数组
  • 集成电路学习:什么是YOLO一次性检测器
  • 关于国产 RAC 和分布式研讨
  • 【Python学习笔记】whl包打包
  • Day14——JavaScript 核心知识全解析:变量、类型与操作符深度探秘
  • Redis实战-优惠券秒杀解决方案总结大全
  • XC6SLX75-2FGG484C Xilinx Spartan-6 LX FPGA
  • 电子电气架构 --- 软件项目复杂性的驾驭思路
  • 基于Prometheus Pushgateway与Alertmanager的自定义指标监控与告警实践指南
  • C语言 | 高级C语言面试题
  • C语言二级考试环境配置教程【window篇】
  • 数学建模——马尔科夫链(Markov Chain Model)
  • Linux初始——基础指令篇
  • 数据结构:从堆中删除元素 (Deleting from a Heap)
  • 微服务-30.配置管理-动态路由
  • 3 无重复字符的最长子串
  • 第二阶段Winfrom-8:特性和反射,加密和解密,单例模式
  • Gopher URL协议与SSRF二三事
  • 入门概念|Thymeleaf与Vue
  • 路由基础(二):路由表和FIB表