本人不了解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 约束做适配。
- 把可执行加入产品包
在你的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)
-
(通常不需要)VINTF/Manifest
virtual_camera.hal.rc
已声明为 AIDL provider 接口实例;大多数 AOSP 参考设备(如 Cuttlefish)通过产品包清单打进系统即可识别,不必像传统 HIDL HAL 那样手改 manifest。你若做强一致 VINTF 校验,请按设备策略评估。(构建系统里也能看到把该二进制纳入系统镜像的条目痕迹。)(Android Git Repositories) -
策略与权限
系统 sepolicy 已包含
virtual_camera
域的 policy 片段,通常无需你另行添加域;若你要扩展访问外设/文件等,再追加本机策略 overlay。(Android Git Repositories) -
(可能需要)打开特性 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
,通常由系统服务在需要时拉起。你也可以手动验证:
- 手动拉起服务(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)
- 框架侧验证
-
运行相关测试:
shatest virtual_camera_tests atest CtsVirtualDevicesCameraTestCases
提交记录里也用这些测试名做过验证。(Android Git Repositories)
-
CameraService 侧也有针对"虚拟相机不可被注入替换"的保护逻辑,
dumpsys media.camera
可侧面看到 provider 和 device 的可见性。(Android Git Repositories)
- 应用侧可见性
虚拟相机一旦注册成功,会以 不与物理相机 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_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
toPRODUCT_PACKAGES
; ensure the feature flagandroid.companion.virtual.flags.virtual_camera
is on if your branch gates it. - Verify :
start virtual_camera
, check withdumpsys media.camera
, and runatest virtual_camera_tests
.