⚠️ First proper release build. Until 1.1.8, every shipped APK was a debug build with applicationId
com.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.
⚠️ AMD64 inside ARM64 TCG is double emulation — fine for build tooling, painful for daemons.
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.