In Part 4, we showcased Linxr booting Alpine Linux in QEMU on non-rooted Android devices. Today in Part 5, we dive deep into the major architectural updates that powered our v3.0.0 release: bringing live serial boot diagnostics, seamless Storage Access Framework (SAF) file sharing, and embedding full Docker container management directly into Linxr.
In earlier builds, VM startup was a bit of a black box—users saw a spinning indicator until port 2222 opened for SSH. If the kernel panicked or a system service hung during boot, there was no visibility inside the app UI.
To solve this, we redirected Alpine’s kernel console to serial output (/dev/ttyS0
):
dmesg
, init
scripts, and sshd
startup logs directly from the guest virtual serial console.Linux virtual machines running under QEMU require clean POSIX filesystem access to exchange files with the Android host system.
virtio-9p-pci
driver to expose host directories to the guest OS, mounting /storage/emulated/0/LinxrShare
inside Alpine Linux at /mnt/sdcard
.MethodChannel
handler (pickFolder
) calling Android’s Storage Access Framework (ACTION_OPEN_DOCUMENT_TREE
) to allow users to select custom host folders from Settings.Previously, container management lived in a separate project named Pockr. For v3.0.0, we unified our architecture by deprecating standalone Pockr and embedding its container controls directly into Linxr:
nginx
, redis
, alpine
).When launching QEMU, the OpenSSH daemon takes a few seconds to initialize. Probing TCP port 2222 concurrently from Flutter while QEMU bound socket ports caused intermittent race conditions.
We introduced a thread-safe SSH probe lock in Kotlin (VmManager.kt
):
Linxr v3.0.0 is officially live on [Google Play](https://play.google.com/store/apps/details?id=com.ai2th.linxr) and [GitHub Releases](https://github.com/AI2TH/Linxr/releases/latest)!
Join our community for feature requests and discussions:
👉 Google Group: https://groups.google.com/g/ai2th