Skip to content

v1.1.9

Choose a tag to compare

@ExTV ExTV released this 09 May 16:54
· 233 commits to main since this release

⚠️ First proper release build. Until 1.1.8, every shipped APK was a debug build with applicationId com.excp.podroid.debug and a -debug version suffix. 1.1.9 is a signed release build with applicationId com.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 by AudioTrack with 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-x11 OpenRC service. Stale /tmp/.X0-lock is 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's iso10646-1 font), 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 openbox and start it once before launching the app, or use firefox --kiosk. There's no WM shipped by default (deliberate — keeps the rootfs small and lets you pick).
  • xterm defaults to 80×24 chars at a small font; launch with xterm -fa "DejaVu Sans Mono" -fs 16 -geometry 120x36 for 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.