DEV Community

Ai2th
Ai2th

Posted on

Linxr | Part 4 — Test Results

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 ✅

→ Full test results

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
Enter fullscreen mode Exit fullscreen mode

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 add works 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

  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 ← 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)