Skip to content

Enabling ADB & Key Pairing

Authorize your computer's ADB public key and enable wireless ADB access on the scooter.

To protect against unauthorized wireless connections, the Android operating system requires incoming ADB clients to authenticate using an RSA public/private keypair. On the scooter’s head unit, authorized public keys are loaded from /adb_keys.

Because the scooter’s root filesystem is mounted read-only (ro), you cannot directly edit /adb_keys. Instead, we push our public key (adbkey.pub) to a temporary writable directory, mount-bind it over /adb_keys, and switch the scooter to manufacturing mode (mfg). While adbd always listens on port 5555, switching to mfg mode unblocks the port in the firewall and triggers the daemon to reload the keys from /adb_keys.

You can perform this setup automatically with s1util.py or execute the commands manually.


The s1util.py utility includes a setup-adb command that fully automates the key generation, file transfer, mount binding, and mode-switching sequence:

Terminal window
python s1util.py setup-adb --host "<scooter-ip>"
  1. Key Detection & Generation: Checks your computer for an existing ADB keypair (adbkey / adbkey.pub). If none exists, it automatically generates one using adb keygen.
  2. Default Path Resolution: Loads your public key directly from the standard OS location (e.g., ~/.android/adbkey.pub or %USERPROFILE%\.android\adbkey.pub).
  3. Pushes & Configures Key: Uploads your public key to the scooter and applies proper permissions (666). On Gen 3 scooters, it stages the key and mount-binds it over /adb_keys. If it detects a Gen 1 / Gen 2 MoveOS device (by checking for /data/misc/adb/adbkeymoveos3_pub_prod), it pushes directly to /data/misc/adb/adb_keys and /data/misc/adb/adbkeymoveos3_pub_prod instead, skipping the bind-mount.
  4. Unblocks Port & Reloads Keys: Switches persist.ola.security.scootermode to mfg, unblocking port 5555 in the firewall and restarting adbd so it loads your key from /adb_keys.

This provides a single-command, frictionless pairing experience without needing manual file transfers or shell commands.


If you prefer full control over each step, follow the manual workflow below.

1. Generate an ADB Key (If Not Already Present)

Section titled “1. Generate an ADB Key (If Not Already Present)”

If you have already used the Android SDK platform tools on your computer, your keypair is likely already generated. If not, generate one by running:

Terminal window
adb keygen ~/.android/adbkey

Your public key (adbkey.pub) is stored at the following default location depending on your operating system:

%USERPROFILE%\.android\adbkey.pub

(Typically C:\Users\<YourUsername>\.android\adbkey.pub)

Push your local adbkey.pub to the scooter using s1util.py push:

On Gen 3, push the key to a temporary location (/data/local/tmp/adb_keys_temp):

Windows (PowerShell):

Terminal window
python s1util.py push --host "<scooter-ip>" "$env:USERPROFILE\.android\adbkey.pub" /data/local/tmp/adb_keys_temp

Linux / macOS:

Terminal window
python s1util.py push --host "<scooter-ip>" ~/.android/adbkey.pub /data/local/tmp/adb_keys_temp

Android expects authorized key files to be readable by system processes. Set the permissions of the pushed key file to 666:

Terminal window
python s1util.py exec --host "<scooter-ip>" "chmod 666 /data/local/tmp/adb_keys_temp"

Because / (root) is read-only on Gen 3, /adb_keys cannot be written to directly. Bind-mount the temporary file over /adb_keys:

Terminal window
python s1util.py exec --host "<scooter-ip>" "mount --bind /data/local/tmp/adb_keys_temp /adb_keys"

5. Switch Scooter Mode to Unblock Firewall & Reload Keys

Section titled “5. Switch Scooter Mode to Unblock Firewall & Reload Keys”

With the new key file mounted, switch the scooter’s security property to manufacturing (mfg) mode:

Terminal window
python s1util.py exec --host "<scooter-ip>" "setprop persist.ola.security.scootermode mfg"

If you want to revert your scooter to its original factory state and undo the ADB pairing changes, run the revert-adb command with s1util.py:

Terminal window
python s1util.py revert-adb --host <scooter-ip>

This removes the authorized keys, unmounts any temporary bindings, and resets the security mode back to standard customer mode (cust), re-enabling the firewall on port 5555.


Now that ADB is paired successfully and port 5555 is unblocked in the firewall, proceed to establish an interactive root shell and mirror your scooter’s display.