Releases: ExTV/Podroid
Release list
v1.2.8
New
- Start the VM automatically when the phone boots (Settings, off by default), and start or stop it from automation apps with the
com.excp.podroid.action.START_VM/STOP_VMintents. - RAM sizes up to 16 GB. The list only offers what the phone can actually spare, so a 6 GB device still sees 512 MB to 2 GB while a 24 GB device gets the full range.
- Storage sizes up to 512 GB, again limited to the free space on the phone, and storage can now be grown after setup from Settings (never shrunk; the larger size is picked up on the next VM start).
- The port-forward list holds 2048 rules instead of 128, and
podroid-forward clean(plus a Clean button in Settings) removes every user rule at once. - The guest kernel can now serve NFS, act as an iSCSI target, and mount
binderfs.
Fixes
- The guest could not resolve hostnames on some phones even though
ping 8.8.8.8worked. The VM now uses the phone's own DNS resolver (including a VPN's) with public resolvers as fallback, soapk addandpodman pullwork on mobile data, Wi-Fi, and through a VPN. - The backend shown on the home and status screens is the one actually running, not the one selected in Settings. With the selection on Auto, a phone without AVF now correctly reports QEMU.
- Raising the storage size used to grow the disk image without the VM ever seeing the extra space; the guest now resizes its filesystem on the next start.
- The RDP and mirror-mode recipes in the guide now match what the guest actually does, and the desktop guide explains that
setup-desktopalso installs and enables a display manager (harmless here, but unnecessary) and how to switch it off. - Broad reliability and documentation hardening across networking, the Settings screen, and the guide.
Known limitations
- Starting the VM at boot keeps Podroid's foreground service running from the moment the phone starts; on phones with aggressive battery management, whitelist Podroid or the VM may be stopped in the background.
- Multi-core AVF VMs still reboot on Pixel 8 and later; the AVF backend stays single-core until the guest kernel gains the missing CPU-frequency driver. A fix is planned.
v1.2.7
Installs in place over 1.2.6. No VM reset, and containers, packages and settings are preserved.
New
- SFTP works out of the box. Any SSH client, including WinSCP and FileZilla, can browse and transfer guest files on port
9922with nothing to install and no extra port forward. - The guest system moves to Alpine 3.24.1 on Linux 7.1.5, which brings newer container tooling: Podman 5.8.3, Docker 29.5.3, LXC 7.0.0, crun 1.28, and TigerVNC 1.16.2 for the desktop.
- The software-emulation backend moves to QEMU 11.0.2.
- The port forward screen now lists the ports Podroid reserves for itself, above your own rules: SSH on
9922, and the desktop and its audio on5900and4713, both bound to the phone only. Adding a rule on a reserved port was already refused, but the reason was invisible. - The Status screen lists every address the phone can be reached on, one per interface, rather than only the one the default route uses. On a phone using mobile data while tethering, the address shown before was often the one no other machine could reach.
- The AVF diagnostic now reports whether the headless GPU declaration attached, is unsupported on the device, or failed outright, and the Home screen says so when it failed. That declaration is what gets a networked VM onto a network-capable hypervisor, so when it fails the guest comes up without an adapter, and until now that was invisible.
- Settings now says plainly that raising the vCPU count does not make the QEMU backend faster.
- The guide gained sections on sharing files (SFTP and FTP, and what the privileged-port limit rules out), reaching the desktop from another computer, connecting over RDP, and a minimal nginx container to start from.
Fixes
- A port forwarding rule that cannot bind no longer stops the VM from starting. Rules are applied once the VM is up, where one that fails is skipped and logged instead of aborting the launch. This also repairs an install that was already stuck reporting "QEMU exited with code 1" after adding rules, with no data loss and nothing to delete.
- The rule list is capped, with a clear message when it is full, instead of growing without limit.
- Programs started by a remote session, such as an xrdp login or
ssh -X, no longer open on the phone's built-in desktop. That left the remote screen black while the windows appeared on the phone. - The guest tools no longer print a cut-off reply as though it were complete.
podroid-forward listnow says when a reply is too long instead of showing part of the table as if it were all of it. - Documentation claims about CPU tuning that measurement did not support have been corrected.
- Broad reliability hardening across port forwarding, the guest host bridge, and AVF start-up diagnostics.
Known limitations
- After updating an existing VM, the guest package database still lists the previous Alpine release. Programs run from the new image, but
apkreports installed versions as older than what the repositories offer, andapk version -l "<"lists most of the base system. Runningapk upgradeinside the guest brings the database in line, at the cost of copying those packages into your persistent storage. A fix is planned so the update settles this by itself. - Windows file sharing cannot work in either direction, and an NFS server cannot run inside the guest. Both need ports below 1024, which an ordinary app cannot bind, and the guest kernel carries no NFS server or SMB client. SFTP and FTP are the supported routes, and the networking guide covers both. Mounting a remote NFS export from inside the guest does work.
v1.2.6
New
- Container backup and restore: a new screen snapshots your containers into your phone's Downloads folder and restores them later.
- Status view: a live look at CPU, memory and storage use for both the VM and your device, with an at-a-glance load graph.
- Downloads-folder sharing on hardware-accelerated (AVF) VMs: your Android Downloads folder now appears inside the guest, so files copy both ways with no extra setup.
- Load-balancing mode: an optional setting that adapts the VM's resource footprint to your device.
- The home screen now shows a clear shutting-down indicator while the VM stops.
Fixes
- Hardware-accelerated (AVF) VMs now start with working networking on devices running the newer Android virtualization stack, instead of failing to boot.
- The in-app terminal no longer hammers a dropped connection: reconnects back off, and the font size stays within a readable range.
- The update check retries shortly after a temporary network hiccup instead of waiting a full day.
- Custom QEMU argument edits in Settings now stick reliably.
- Removed a duplicate Terminal button from the home screen and tightened the status details.
- Broad reliability hardening across VM startup, storage handling, boot-progress detection, and the guest-to-Android bridge helpers.
Known limitation
- On some Tensor-based Pixels (the 8 and 9 families), hardware-accelerated (AVF) VMs fall back to fewer CPU cores to boot reliably; the VM still runs, just with fewer vCPUs. A fix is planned.
Thanks
- @ChinmayaGit for the container backup, status view, and load-balancing work (#48).
v1.2.5
New
- Android 8.0 and 8.1 support: Podroid now installs and runs on Android 8+ devices, not just Android 9 and up.
- Multi-core on the hardware-accelerated AVF backend: the CPU cores setting now takes effect on AVF, not only on QEMU.
Fixes
- AVF VMs that reset during boot with more than one core (Pixel 8 / 8a / 8 Pro and the Pixel 9 series) now start reliably. The VM automatically settles on the highest core count your device can boot and remembers it, with single core and the QEMU backend as fallbacks.
- The in-app desktop is now reachable only from the device itself: its display and audio ports are reserved and bound to loopback, so a port-forwarding rule can no longer accidentally expose the unauthenticated X session or audio stream to your local network.
- Closing the X11 desktop while it was idle could leave its connection and audio running in the background; the viewer now shuts them down cleanly every time.
- Arrow keys and other special keys now work correctly in the terminal on release builds, and the terminal recovers on its own if its session drops.
- Your saved settings are now protected against corruption that could silently reset them.
- The setup wizard back button, Material You dynamic color, X11 reconnect, and screen-reader accessibility all behave correctly again.
- Broad reliability hardening across the VM engine, the guest bridge, port forwarding, and app startup.
Known limitation
- On the Android 17 beta, AVF VMs fail to boot because the system VM manager and its bundled crosvm disagree on guest networking. Switch the backend to QEMU (TCG) in Settings until Google resolves it; a fix on our side is being investigated.
Thanks
- @vitorsaldiva for adding Android 8 (API 26) support (#42).
v1.2.4
New
- Seamless updates: the Linux system inside the VM now upgrades across app versions with no reset and no data loss. Your installed packages, files, and containers carry over when you update Podroid.
- Server mode: a one-tap full-screen black overlay that keeps the VM running headless with the screen dimmed and burn-in protected; hold to exit. Drive it from the shell with
podroid-server on|off|status. - New in-guest commands:
podroid-open <url>opens a link on Android, andpodroid-power stop|restart|statuscontrols the VM from inside the shell. - UDP port forwarding now works on the AVF backend, matching QEMU (
podroid-forward add <host> <guest> udp). - When an AVF guest fails to boot, Podroid now shows what to do next (try a single core, switch to QEMU, or retry) instead of a blank failure, and captures early-boot kernel output to help diagnose it.
- A Documentation link in Settings -> About opens the online guide.
Fixes
- On devices whose virtualization build lacks the custom-VM API, Podroid now falls back to the QEMU backend automatically instead of failing to start.
- Broad reliability hardening across the AVF backend, the guest-to-Android bridge, and server mode.
Known limitation
- With an external mouse, right-click still exits fullscreen in the X11 viewer instead of reaching the desktop. Two-finger right-click via touch works. A fix is planned.
v1.2.3
New
- USB device passthrough: plug a real USB device (Wi-Fi adapter, storage, serial adapter, audio interface) into the running VM straight from Android, with no root. Turn it on in Settings or at first-run setup; it adds a USB controller at boot, so set it while the VM is stopped (QEMU backend).
- Talk back to Android from inside the VM:
podroid-notifyposts an Android notification (with a title, priority, and--idto update one in place), andpodroid-forwardadds, lists, and removes port-forward rules without leaving the shell. Both work on the QEMU and AVF backends. - The interface is now available in 中文 (Chinese) alongside English, selectable in Settings or following your device language.
- Updated to the Linux 7.0.10 kernel.
Fixes
- Interrupting a VM control action (for example, stopping the VM while a port-forward change is still in flight) no longer surfaces a spurious failure; the operation now unwinds cleanly.
Known limitation
- With an external mouse, right-click still exits fullscreen in the X11 viewer instead of reaching the desktop. Two-finger right-click via touch works. A fix is planned.
Thanks
- @9hm2 for the USB device passthrough feature (#32).
- @guoai2015 for the Chinese translation and in-app language switching (#35).
v1.2.2
New
- LXC distro containers:
lxc-create -t downloadnow works, so you can spin up Alpine, Ubuntu, Debian and other distributions as LXC containers alongside Podman and Docker (the download template andxzare now bundled). - Online documentation site, linked from the README.
Fixes
- Stopping or restarting the VM no longer risks losing recent work. The persistent disk is now flushed durably on shutdown, and the pKVM/AVF backend syncs the guest before stopping, instead of potentially discarding the last writes.
- The VM now reaches "Running" the moment it is actually ready, instead of waiting a fixed ~60 seconds. The terminal and SSH attach at the real boot time. Most noticeable on the QEMU backend.
- Fixed an intermittent "QEMU crashed" that could kill a healthy VM shortly after the app was sent to the background.
- The terminal no longer opens to a blank screen after boot. The login prompt now appears on its own, without needing a keypress.
- X11 viewer stability: hardened the remote-framebuffer decoding and audio handling, and held mouse buttons are now released when you leave the viewer.
- pKVM/AVF backend: protected-only devices are reported as "using QEMU" rather than shown as a failure, the guest boot log is captured in full, and a dropped control channel is detected and recovered.
- Broad reliability hardening across VM start, stop and restart, network interface selection, the terminal bridge, the port-forward agent, settings reads, and the update check.
Known limitation
- With an external mouse, right-click still exits fullscreen in the X11 viewer instead of reaching the desktop. Two-finger right-click via touch works. A fix is planned.
v1.2.1
New
- Configurable X11 viewer: a live-resizable desktop (match your screen, or 720p-1440p / custom presets), direct-touch and trackpad pointer modes with adjustable sensitivity and scroll, fullscreen, and rotation lock.
- External keyboard and mouse in the X11 viewer: physical keyboard with Ctrl/Alt/Shift combinations, and mouse-wheel scrolling.
- AVF (pKVM) backend on supported Pixel devices for near-native speed, selected from the device's hypervisor capabilities with automatic QEMU fallback.
- Verbose AVF logging that captures the guest console and decoded VM lifecycle codes for bug reports.
Fixes
- Resolved the AVF "setProtectedVm must be called explicitly" startup crash by selecting the VM mode from device capabilities.
- The AVF guest console is now captured in the diagnostic log; it was previously empty, which hid boot failures.
- The X11 viewer no longer disconnects on heavier desktops and apps.
Known limitation
- With an external mouse, right-click exits fullscreen instead of reaching the desktop. Two-finger right-click via touch works. A fix is planned.
v1.2.0
New UI
Every screen restyled into one design system — dark dashboard, lime accent, Inter for chrome + JetBrains Mono for tech values. Home now shows live uptime, network and last-session details. Settings re-sectioned with proper buttons for destructive actions. Refreshed setup wizard. New Quick Settings drawer in the terminal that closes on any interaction.
Hardware acceleration on Pixel 8 / 9 / 10
Podroid now runs the VM on pKVM (your phone's real hardware virtualization) instead of software emulation. The VM boots in a few seconds and feels near-native. Auto-detected — falls back to QEMU on any device that doesn't support it.
One-time setup. From a PC with adb:
adb shell pm grant com.excp.podroid android.permission.MANAGE_VIRTUAL_MACHINE
adb shell pm grant com.excp.podroid android.permission.USE_CUSTOM_VIRTUAL_MACHINENo PC? Install Shizuku, start it, then run the same two commands in its rish shell.
Backend lock (Auto / pKVM / QEMU) lives in Settings → Advanced. Switching applies on the next VM start — no app restart.
LAN-reachable port forwarding
Forward rules now bind on your phone's actual LAN IP, not just 127.0.0.1. From your laptop on the same WiFi:
ssh root@<phone-ip> -p 9922
curl http://<phone-ip>:8080
Adding / removing rules takes effect within a second — no VM restart. The X11 and audio viewers also come up on the LAN.
Terminal auto-resize
btop, htop, vim, less etc. now resize live as you rotate the phone or slide the keyboard — on both backends.
Snappier terminal & faster guest CPU
~50 ms off every keystroke. Keyboard slide → prompt redraw ~145 ms (was ~350). TUI streams render at ~30 fps (was ~15). Faster guest CPU under load. storage.img shrinks back on fstrim instead of growing forever.
Audio fixes
- Clicking noise in Firefox / video playback is gone
- Firefox + other apps actually reach the audio sink now (was silently broken)
X11 viewer no longer crashes mid-session
Used to disconnect when the VM sent a clipboard sync. Fixed — full sessions stay up.
More headroom
Swap inside the VM is now ~1.5× RAM (was half). Firefox + a full desktop in a 2 GB VM stays smooth. If memory does run out, the browser dies — not your SSH or X11.
Cleaner Settings
- New AVF (pKVM) diagnostic dialog
- Phone IP no longer shows the cellular CLAT internal address — always the LAN IP
- Downloads sharing toggle greys out (with explanation) on AVF where it's not supported
⚠️ Heads-up: Android phantom-process killer
Android 12+ kills background native processes. If your VM dies on app-switch, run once:
adb shell "device_config put activity_manager max_phantom_processes 2147483647"
adb shell settings put global settings_enable_monitor_phantom_procs falseOr via root:
su -c /system/bin/device_config put activity_manager max_phantom_processes 2147483647
su -c setprop persist.sys.fflag.override.settings_enable_monitor_phantom_procs falseKnown limitations
- Downloads folder sharing isn't available on pKVM — it's a system-app-only API on shipping Pixel firmware. Works on QEMU.
- Default VM RAM is still 512 MB — bump to 2 GB in Settings for desktop / browser workloads.
- Android 8 still unsupported (NDK / glib blocker).
v1.1.9
⚠️ First proper release build. Until 1.1.8, every shipped APK was a debug build with applicationIdcom.excp.podroid.debugand a-debugversion suffix. 1.1.9 is a signedreleasebuild with applicationIdcom.excp.podroid. Android treats those as two different apps — to upgrade you must uninstall the old debug build first (your VM storage is in app-private storage and will be wiped). Back up anything important from inside the VM before upgrading.
The headline: in-app X11 viewer with audio
A new monitor icon next to the gear in the terminal top bar opens a full-screen X11 view backed by an always-on Xvnc server inside the VM. Anything you apk add and launch from a shell renders on your phone, with sound piped through the speaker. No setup, no DISPLAY= prefix, no environment dance.
# inside the app's terminal:
apk add xeyes
xeyes
# ...tap the monitor icon. xeyes follows your finger.What's in there:
- Hand-rolled Kotlin RFB 3.8 client (~600 LOC, Raw + CopyRect encodings) — no third-party VNC library
- Audio: 44.1 kHz stereo PCM streamed over PulseAudio's
module-simple-protocol-tcp, decoded byAudioTrackwith auto-reconnect - 1280×720 fixed framebuffer — aspect-preserving letterbox into the phone screen, pinned to the top so the soft keyboard never overlaps the content
- Soft keyboard (top-right icon): printable chars via IME diff, plus Backspace, Enter, Tab, Esc, arrows
- Extra-keys row matching the terminal: ESC, TAB, sticky-one-shot CTRL/ALT, arrows (hold-to-repeat), HOME/END, PGUP/PGDN, F1–F12 — and it slides above the IME when the keyboard opens
- Always-on at boot via the new
podroid-x11OpenRC service. Stale/tmp/.X0-lockis auto-cleaned every start, so a hard VM kill never blocks the next launch. - GPL-2 compatible end-to-end (TigerVNC, PulseAudio); no Termux-X11 dependency
Three container runtimes, ready to go
The Alpine rootfs now ships with all three pre-installed and Docker auto-starting at boot:
| Runtime | Version | State |
|---|---|---|
| Docker | 29.1.3 | Auto-starts via OpenRC, in-kernel overlay, cgroup v2 |
| Podman | 5.7.0 | rootless-friendly with crun + native overlay |
| LXC | 6.0.5 | lxcbr0 bridge up, busybox template tested end-to-end |
Plus gcompat is built in so glibc-linked binaries (e.g. some prebuilt CLI tools) run on the musl rootfs, and gzip ships so lxc-checkconfig reads /proc/config.gz cleanly.
Kernel 7.0.5 + AMD64 container support (closes #27)
CONFIG_BINFMT_MISC=y is now baked in. tonistiigi/binfmt --install amd64 works, letting you run x86_64 container images under double TCG emulation. The build verifier enforces it so it can't silently regress.
QEMU 11.0.0 stable
Bumped from 11.0.0-rc2 to the GA release. The settings screen now shows 11.0.0 instead of the rc label.
Polish
- Setup wizard advertises 2 cores (matches the actual default; was stale at 1)
- About screen drops the misleading "Container runtime: Podman + crun" row — we ship three runtimes now
- X11 fonts shipped:
font-misc-misc(fixes xterm'siso10646-1font),font-cursor-misc,ttf-dejavu
Cost of all this
Idle, no X11 viewer connected:
| Resource | Δ vs 1.1.8 |
|---|---|
| APK size | +~90 MB (TigerVNC + PulseAudio + X11 fonts + Docker + LXC + binfmt support) |
| VM RAM | +~63 MB always-on (Xvnc 47 + pulseaudio 4 + helpers 12) |
| VM CPU idle | unchanged (~0%) |
| Boot time | +1–2 s |
| Network / container performance | zero impact |
| Storage on the host overlay | unchanged (services are stateless) |
Known limitations
- Apps without a window manager open at their default size — install
openboxand start it once before launching the app, or usefirefox --kiosk. There's no WM shipped by default (deliberate — keeps the rootfs small and lets you pick). xtermdefaults to 80×24 chars at a small font; launch withxterm -fa "DejaVu Sans Mono" -fs 16 -geometry 120x36for a comfortable size.- AMD64 container emulation via binfmt is slow (see above).
- The X11 framebuffer is fixed at 1280×720 in landscape orientation. Rotate the phone to landscape for a full-screen experience.
Thanks
To @wguanwei for #27 which prompted the BINFMT_MISC kernel work.