关于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_camera → dumpsys 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 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台3 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone3 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc3 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo3 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077003 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼3 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone3 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen3 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone3 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui