关于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_camera
      class core
      ...
      interface aidl virtual_camera
      interface aidl android.hardware.camera.provider.ICameraProvider/virtual/0
      oneshot
      disabled

    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)里加上:
make 复制代码
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):
sh 复制代码
adb root && adb shell setprop log.tag.VirtualCameraService DEBUG
adb shell start virtual_camera

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

sh 复制代码
adb shell dumpsys media.camera

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

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

    sh 复制代码
    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


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.
相关推荐
雨白3 小时前
Drawable 与 Bitmap 的区别、互转与自定义
android
程序员江同学3 小时前
Kotlin 技术月报 | 2025 年 8 月
android·kotlin
雨白6 小时前
Android 自定义 View:属性动画和硬件加速
android
hellokai7 小时前
React Native新架构源码分析
android·前端·react native
真西西7 小时前
Koin:Kotlin轻量级依赖注入框架
android·kotlin
CYRUS_STUDIO10 小时前
手把手教你改造 AAR:解包、注入逻辑、重打包,一条龙玩转第三方 SDK!
android·逆向
CYRUS_STUDIO10 小时前
Android 源码如何导入 Android Studio?踩坑与解决方案详解
android·android studio·源码阅读
前端赵哈哈11 小时前
初学者入门:Android 实现 Tab 点击切换(TabLayout + ViewPager2)
android·java·android studio
一条上岸小咸鱼15 小时前
Kotlin 控制流(二):返回和跳转
android·kotlin