Podroid spins up a real Alpine Linux VM using QEMU and a custom kernel.
Run Podman, Docker, and LXC with a polished built-in terminal,
or open the in-app X11 viewer for GUI apps. Install the APK, tap Start, go.
Features
Built from the kernel up for containers, not just shell access.
All three major container engines work zero-config. Native kernel overlay2 for Docker, fuse-overlayfs for rootless Podman, and a pre-configured lxcbr0 bridge for LXC. Pull any OCI image and run it.
Compiled from scratch with netfilter, bridge, overlayfs, veth, IPVS, VXLAN, IPsec, cgroup v2, and binfmt_misc all built-in. Docker's check-config.sh reports zero fixable complaints.
Termux TerminalView with xterm-256color, proper PTY, full mouse support, 122 color themes, 13 fonts (plus your own .ttf via the system file picker), and an extra-keys bar with F1–F12, ESC, CTRL, ALT.
Expose any VM port to your Android device at runtime via QMP control. Run a web server, database, or API and hit it from your phone's browser.
Dropbear SSH server on port 9922 (configurable). Connect from your laptop, VS Code Remote, or any SSH client on the same network.
Overlayfs over a persistent ext4 image. Containers, packages, and configs survive reboots. ZRAM swap gives 2× effective RAM. Boots in 6–30 seconds.
Tap the monitor icon in the terminal and an in-app viewer opens, talking RFB to Xvnc inside the VM. Touch becomes mouse, soft-keyboard becomes keyboard, and PCM audio streams from PulseAudio. Run firefox, xterm, anything from Alpine.
Settings → Export Diagnostic Log bundles app info, settings, VM state, app logcat, and the full QEMU console into a single log.txt and shares it via the system share sheet. No ADB needed to file a useful bug report.
KVM needs root, so we leaned hard on TCG instead. Multi-thread TCG with a 512 MB translation cache, a dedicated I/O thread for the rootfs disk, ZRAM lz4 swap at half RAM, and mitigations=off in the guest combine for a 5–15% CPU win. Native 16 KB page alignment, so Pixel 8/9/10 are first-class.
Comparison
Termux gives you a Linux shell. Google Terminal gives you a VM with optional manual container setup. Podroid ships three container engines out of the box.
| Capability |
Podroid
this project
|
Termux
v0.118+
|
Google Terminal
AVF
|
|---|---|---|---|
| Root required | ✓ No | ✓ No | ✓ No |
| Real container runtime | ✓ Podman + Docker + LXC | ✗ | manual setup |
| VM isolation | ✓ QEMU | ✗ shared kernel | ✓ AVF |
| Docker Hub images | ✓ | ✗ | manual setup |
| Custom kernel | ✓ Linux 7.0.5 | ✗ host kernel | ✓ |
| Works on any ARM64 | ✓ Android 9+ | ✓ | ✗ Pixel only |
| Port forwarding | ✓ via QMP | via socat | ✗ |
| Downloads folder sharing | ✓ virtio-9p | ✓ | ✗ |
| SSH server | ✓ Dropbear | via pkg | manual setup |
| xterm-256color + mouse | ✓ | ✓ | basic |
| Configurable RAM / CPUs | ✓ 512MB–4GB, 1–8 cores | ✗ | limited |
Architecture
Four sockets, one VM, zero root. Here's what happens when you tap Start.
Custom Linux 7.0.5 + a tiny initramfs and an Alpine squashfs are extracted from APK assets on first launch.
Init mounts the squashfs as the read-only base, the ext4 image as the writable upper, then switch_roots into /sbin/init.
Cgroup v2, network, Docker bind-mount, lxcbr0 bridge, MASQUERADE NAT, sysctls, and Dropbear SSH all come up automatically.
libpodroid-bridge.so relays your PTY to the VM's virtio-console. Shell is ready.
Quick start
No configuration needed. Download, install, go.
Download the latest APK from the Releases page.
Install it on your Android device (ARM64, Android 9+).
Tap Start VM. Watch the boot progress; typically ready in 6–30 seconds.
Tap Open Terminal to access the Alpine shell.
Run containers. Any image from Docker Hub works out of the box.
FAQ
For the full picture, read the documentation. If something still isn't covered, open an issue on GitHub.
proot is a chroot emulation; containers built for Docker, Podman, or LXC won't work reliably. Podroid runs a real VM with its own custom kernel, so every OCI image from Docker Hub just works.
mitigations=off in the guest kernel for a 5–15% CPU gain. For typical dev tasks like running a web server, a database, or CLI tools, it's very usable.
Xvnc running inside the VM and streams audio from PulseAudio. Then just apk add firefox (or anything else from the Alpine repos) and launch it from the shell. Touch becomes mouse, the soft-keyboard becomes keyboard, and the picture letterboxes to your phone's aspect ratio.
virtio-9p, mounted inside the guest at /mnt/downloads. Files you drop in Downloads on the phone show up there immediately, and anything the VM writes to /mnt/downloads appears back in Downloads.
storage.img that only grows as you pull images and install packages.
ssh root@<phone-ip> -p 9922 gives you a remote shell. Useful for VS Code Remote or any SSH client.