Install guide

Install and recover

AndroiOS does not replace Android. A host computer starts the shell over adb after each boot, and anything that goes wrong hands the screen back to Android.

Read this first.

  • This is experimental software for one specific tablet, the Samsung Galaxy Tab A8 (SM-X200). Do not try it on other models.
  • You need a tablet whose adbd can run as root. This guide does not cover unlocking, rooting or flashing, and a mistake there can erase the device.
  • Back up the tablet first. We have already seen one factory reset, caused by an unrelated change to /system (see below).
  • You use this at your own risk. There is no warranty.

Requirements

How booting works

  1. /data/local.prop contains service.adb.root=1, so adbd comes up as root on every boot. The Developer page in Settings only changes the live property; the file is what survives a reboot.
  2. Android boots normally.
  3. A systemd user unit on your computer, tab-a8-boot.service, polls Wi-Fi adb. Once per new boot it runs /data/local/springboard/boot.sh on the tablet.
  4. boot.sh stops Android’s UI processes (zygote, surfaceflinger, hwcomposer, bootanim, wpa_supplicant) and starts the shell. When the shell exits, Android is restored.

If your computer is off, the tablet simply stays in Android. Nothing under /system, boot, vbmeta or verity is read or changed.

Steps

  1. Connect adb. Plug in USB, accept the debugging prompt, and confirm adb devices lists the tablet. Then enable Wi-Fi adb so the watcher can reach it.
  2. Build and install the boot support.
    tab boot install      # pushes boot.sh, writes /data/local.prop (root adbd, Wi-Fi adb on :5555), installs the Android-mode launcher APK
    tab boot status       # probation, heartbeat age, last exit, crash log
    tab boot watcher      # status of tab-a8-boot.service on your computer
  3. Start the watcher. Run tools/boot-watcher.sh from the repository as a systemd user unit named tab-a8-boot.service on your computer. It is what starts the shell after every tablet boot.
  4. Deploy the shell.
    tab deploy --test     # host unit tests, cross-build, stage springboard.new
    boot.sh promotes the staged binary and keeps the old one as springboard.prev.
  5. Verify.
    tab status
    tab shot              # screenshot to compare with what you expect
    tab logs
  6. Reboot once to prove it. adb reboot, wait about two minutes, and the watcher log (journalctl --user -u tab-a8-boot) shows starting boot.sh.

Updates and rollback

A new binary is staged as springboard.new and promoted when the shell restarts. For 60 seconds it is on probation: if it exits during that time (other than a deliberate hand-back), or dies with an unexpected status, boot.sh restores the previous binary and starts it. If that also fails, Android takes over. The rejected binary is kept as springboard.bad.

Exit statusMeaning
3Restart requested
4Hand back to Android (recovery chord, lost Wi-Fi for 3 minutes)
5UI stalled; restarted at most 3 times per boot, then Android
otherCrash: Android takes over; three crashing boots in a row stop the loop

A background loop also kills a shell whose heartbeat has not changed for about a minute. Roll back by hand with tab boot rollback.

From inside the shell, Settings > General > Software Update checks the update server for a newer build and installs it through the same staged path.

Recovery

Never do this

  • Do not run adb remount or edit /system. A boot script placed under /system/etc/init this way bootlooped the tablet and ended in a factory reset. All persistence here lives in /data plus the host watcher.
  • Do not patch boot or vbmeta, or install Magisk-style modifications for this.
  • Do not restart adbd while the shell runs. The shell is adbd’s child process and the screen goes black.
  • Do not expect an app to start the shell through adbd: apps cannot connect to adbd on this ROM.