Test Results
Part 4 of 4 — the final chapter of building Linxr, a single APK that runs Alpine Linux on non-rooted Android.
← Part 3: SSH Terminal in Flutter
Download
linxr-v1.apk — v1.0 · ARM64 · 63 MB
Requires Android 8.0+ (API 26), ARM64 device. Enable "Install from unknown sources" before sideloading.
How We Test
Testing on a Mac with an Android emulator doesn't work — QEMU inside an emulator needs nested virtualisation, which isn't available.
We use Firebase Test Lab with an automated Robo test:
| Setting | Value |
|---|---|
| Device | Pixel 2 (arm64) |
| Android version | 11 (API 31) |
| Test type | Robo (automated UI crawler) |
| Timeout | 600 seconds |
Test Result: Pass ✅
No crashes. Key events from the logcat:
01:29:38 VmManager: startVm()
01:29:38 VmManager: Reusing existing user.qcow2
01:29:38 VmManager: VM process launched
01:29:43 QEMU: OpenRC 0.52.1 is starting up Linux 6.6.14-0-virt (aarch64)
01:29:51 QEMU: * eth0 ... [ ok ]
01:29:52 QEMU: * Starting sshd ... [ ok ]
01:29:52 QEMU: Welcome to Alpine Linux 3.19
From QEMU launch to sshd ready: ~14 seconds.
What the Robo Test Found
The crawler navigated all three tabs — Home, Terminal, About — and exercised the Start VM / Stop VM flow. It found and read through the full open-source component list in the About screen: dartssh2, xterm, QEMU, Alpine, OpenSSH.
No crashes. No ANRs. No unexpected states.
What Works
- ✅ Install APK → tap Start VM → Alpine boots in ~14 seconds
- ✅ sshd starts automatically; built-in terminal auto-connects
- ✅ Persistent overlay — state survives VM restarts
- ✅ Internet access —
apk addworks inside the VM - ✅ No root. No Termux. No PC required after install.
- ✅ Foreground service keeps VM alive when app is backgrounded
Current Limitations
| Limitation | Notes |
|---|---|
| ARM64 only | QEMU binary targets aarch64 only |
| Password auth | SSH key setup requires manual ~/.ssh/authorized_keys
|
| No GUI | Text terminal only |
| APK size 63 MB | Alpine disk image + QEMU + 50 shared libraries |
What's Next
- [ ] SSH key management from the app UI
- [ ] Configurable RAM and vCPU in settings
- [ ] File transfer (SCP/SFTP) from the app
- [ ] ARM32 / x86_64 support
The Full Series
- Part 1: The Idea and Architecture
- Part 2: Shipping QEMU in an APK
- Part 3: SSH Terminal in Flutter
- Part 4: Test Results ← you are here
Linxr Series — Alpine Linux on Android
Linxr = Linux + r. A single Android APK that runs a full Alpine Linux shell on any Android phone — no root, no Termux, no PC required.
| # | Post | Topic |
|---|---|---|
| 📖 | Intro | What is Linxr? Start here |
| 1 | Part 1 | The Idea and Architecture |
| 2 | Part 2 | Shipping QEMU in an APK |
| 3 | Part 3 | SSH Terminal in Flutter |
| 4 | Part 4 | Test Results |
GitHub: github.com/AI2TH/Linxr
Website: ai2th.github.io
Contributor: Kalvin Nathan
skalvinnathan@gmail.com · LinkedIn
Top comments (0)