New
- The setup wizard ends with a permissions step that lists what Podroid asks for and why: notifications, so you can see and stop the VM, and unrestricted background use, so Android does not kill the VM when you leave the app. If one is missing later, including after an update, the same rows appear at the top of the home screen.
- The desktop viewer draws on its own thread and lets the GPU do the scaling, so the desktop stays responsive while frames arrive. A new Render scale setting (100%, 75%, 50%) trades sharpness for speed on heavy desktops (#90).
- The guest kernel now has pressure stall information (
/proc/pressure), which Waydroid needs to start, so it no longer requires a custom kernel build (discussion #50). - The interface follows Material 3 and Android conventions more closely: a dark start screen instead of a white flash in dark mode, settings rows that toggle wherever you tap them, real bottom sheets for the terminal's quick settings and its font and theme pickers, copy confirmations as snackbars, and confirmation before the two advanced resets.
- "Containers created" on the home screen updates while you watch, on both backends. It used to change only at boot, and never on QEMU.
- The guest moves to Alpine 3.24.2 and the emulator to QEMU 11.0.4.
- For contributors: the app can be driven from
adb shell content call(VM state, backend switch, port forwards, backup list, screen navigation), so a change can be proven on a phone without tapping through the UI. Only the adb shell can use it; seeCLAUDE.md.
Fixes
- Long values in a settings row, such as the AVF fallback reason, wrap and stay readable instead of being squeezed into a few characters (#82).
- The RAM and CPU chips keep their size and position when you select a different value, instead of jumping around (#83).
- The app no longer crashes on the home screen when it cannot read the shared Downloads folder, which hit anyone who turned Downloads sharing off or revoked storage access after using it.
- A VM disk with filesystem errors is no longer reformatted on boot, which wiped every container and every change. It is repaired when possible, and otherwise the boot stops at the recovery shell with the data intact.
- The app no longer rewrites about 270 MB of guest images on every cold start, only after an update, so it opens faster and wears the flash less.
- Restarting the VM from inside the guest no longer crashes the app when it is in the background, and changing the language or the theme no longer starts a VM you had stopped.
- A boot no longer hangs before "Ready" when the guest network fails to come up; the VM finishes booting so you can fix it from the terminal.
- Reopening the terminal after restarting the VM connects to the new session instead of showing a finished one (AVF).
- Ctrl and Alt, both the sticky on-screen keys and a hardware keyboard, now apply to arrows, Home, End and the other special keys in the terminal, and non-ASCII characters typed after a sticky Ctrl or Alt reach the desktop viewer correctly.
- On QEMU the guest keeps both of the phone's DNS servers instead of only the first, followed by public fallbacks (#95, related to #93).
- Port forwards on QEMU check that the emulator accepted the connection before sending commands, so a forward is no longer reported as applied when it was not (#97). A forward that was only half added is now shown as such in Settings.
- Changing the target of a port forward on AVF now takes effect instead of traffic still going to the old destination, and runtime forwards are no longer written into the VM's persistent disk, where they piled up across boots.
- Stopping the VM closes the guest-to-Android bridge cleanly, oversized or malformed requests from the guest are rejected, and
podroid-openrefuses a URL too long to send instead of failing with a confusing error (#98). - The backup screen no longer treats a plain file named
backupsin Downloads as the backup folder (#100), and it shows the right path inside the VM. - The status and backup screens no longer stall the interface while they read network interfaces or list archives, and a backup folder that cannot be read says so instead of looking empty.
- The exported diagnostic log now includes every subsystem, the VM uptime is translated, the SSH port on the home screen always matches the real one, and the storage access hint in setup updates when you come back from the system settings.
- The Downloads share on AVF reports real errors to the guest instead of generic ones.
- Broad reliability hardening across both VM backends, guest migrations, the desktop viewer, and the terminal.
Known limitations
- On some Wi-Fi networks the guest cannot resolve names even though
ping 8.8.8.8works, while mobile data is fine. This is still being investigated (#93). Mobile data is the workaround for now. - USB Wi-Fi adapters fail to enumerate on phones with a kernel older than 4.14 (#85), and adapters that need firmware find none in the guest (#86). For the second,
apk add linux-firmware-rtlwifi(or the package for your chipset) works today. A fix for the first is planned. - On some manufacturer builds of Android 15 the AVF backend starts the VM without a network device, because the vendor disabled guest networking in the virtualization module (#43). Select the QEMU backend in Settings on those phones.
- Multi-core AVF VMs can still reboot on Pixel 8 and Pixel 9 class devices, where the AVF backend falls back to a single core (#29). A fix is planned.
Thanks
- @Kybernetria for keeping both device DNS servers in the guest (#95), the QMP handshake check (#97), the host bridge shutdown and request limits (#98), and the backup folder check (#100).
- @Peterlovesvscode for reporting the missing kernel option for Waydroid together with a working fork (discussion #50).