2026-05-16 09:53:25 +02:00
2026-05-16 09:53:25 +02:00
2026-05-16 09:53:25 +02:00
2026-05-16 09:53:25 +02:00
2026-05-16 09:53:25 +02:00
2026-05-14 19:22:48 +02:00
2026-05-14 19:22:48 +02:00
2026-05-14 19:22:48 +02:00

Virtual Camera HAL — KernelSU Module

Replaces physical cameras on Pixel 9A (Android 16) with virtual cameras backed by v4l2loopback, fed via RTSP stream or MP4 file.

Architecture

Boot → post-fs-data.sh → insmod v4l2loopback.ko → /dev/video0
                        → copy binary + AIDL .so files → /data/local/tmp/
                        → start virtual_camera_provider with LD_LIBRARY_PATH
                          → registers ICameraProvider/virtual/0
                            → cameraserver discovers 2 virtual cameras

Files

Path Purpose
module.prop KernelSU metadata
post-fs-data.sh Boot startup (insmod, copy, start)
service.sh Watchdog (30s delay)
sepolicy.rule SELinux permissions
v4l2loopback.ko Kernel module (0x440 struct, ARM64)
vendor/bin/virtual_camera_provider AOSP-built AIDL HAL3 binary
vendor/lib64/*.so AIDL NDK shared libraries (V3)
system/etc/vintf/manifest/*.xml VINTF manifest overlay
vendor/etc/vintf/manifest/*.xml VINTF manifest overlay (vendor)
control.sh WebUI backend
rtsp_feeder.sh RTSP/MP4 → /dev/video0 bridge
webui/ KSU WebUI (index.html, style.css, script.js)

Usage

  1. Install module via KernelSU app or ksud module install
  2. Reboot
  3. Open KernelSU → Modules → Virtual Camera → WebUI
  4. Configure RTSP URL or MP4 file path
  5. Tap "Start" (provides 2 virtual cameras at IDs 10 and 11)

Verification

# Check provider registered
adb shell su -c 'service list | grep camera.provider'
# Expected: ICameraProvider/virtual/0

# Check virtual cameras
adb shell su -c 'dumpsys media.camera | grep "Number of camera"'
# Expected: Number of camera devices: 4

# Check camera characteristics
adb shell su -c 'dumpsys media.camera | grep -A25 "virtual/10"'

Building

cd /mnt/opslag/aosp-16-platform
export TARGET_RELEASE=bp2a
source build/envsetup.sh
lunch aosp_arm64-bp2a-userdebug
cd external/virtualcam && mma -j10

Key Fixes

  • -3 registration error: Overrode createBinder() to skip AIBinder_markVintfStability which caused STATUS_BAD_VALUE
  • CANNOT LINK: Bundled AIDL V3 .so files with module
  • AOSP build memory: Use -j10 for 10 cores max, incremental builds are fast after initial Soong analysis
S
Description
No description provided
Readme 785 KiB
Languages
Shell 60.9%
JavaScript 19.7%
CSS 10.6%
HTML 8.8%