Usage guide

Every feature, three ways — click it in the GUI, run it on the CLI, or call it from Python. Target a device with -s SERIAL (or an ADBConfig); add --adb-host HOST for a device on another machine.

Target a device

Everything operates on one device — local USB, a network device, or one on another machine's adb server.

GUI
  1. Click Connect in the ribbon.
  2. Pick USB, Network (host:port), or Remote PC (another machine's adb server).
  3. Hit Connect — a device tab opens with Shell, Logcat, Files…

Live devices also appear in the left sidebar — double-click any to open it.

CLI
turboadb devices
turboadb -s 10BE330KG9000AF info
turboadb --adb-host lab-pc-01 -s DEVICE info
Python
from turboadb import ADBHandler, ADBConfig
dev = ADBHandler(ADBConfig(serial="10BE330KG9000AF"))
# remote: ADBConfig(adb_server_host="lab-pc-01", serial="DEVICE")
dev.connect()

Interactive shell

A real terminal with history, tab-completion, and a Stop button that actually kills a runaway command like logcat.

GUI

Open a device → Shell tab → type. Right-click for Copy/Paste/Save; the red Stop halts whatever is running.

CLI
turboadb -s SERIAL shell -- getprop ro.build.version.release
Python
r = dev.shell("getprop ro.product.model")
print(r.stdout, r.ok)
sess = dev.open_shell(); sess.send("ls /sdcard\n"); print(sess.read())

Logcat

Filter by level / tag / live regex, highlight keywords, pause, and save the complete log — nothing is dropped under a flood.

GUI
  1. Open the Logcat tab and set Level / tag (optional).
  2. Press Start. Type a regex in filter to hide non-matching lines, or in highlight (e.g. error|anr|crash) to mark matches in-line without hiding the rest.
  3. Save writes the complete log to a timestamped .log.
CLI
turboadb -s SERIAL logcat --tag ActivityManager --match "ANR|FATAL" --save crash.log
Python
dev.logcat(tag="ActivityManager", match="ANR", on_line=print, save_to="crash.log")
for line in dev.iter_lines(["logcat", "-v", "threadtime"]):
    ...

Files (push / pull)

GUI

Files tab → browse the device tree → push / pull.

CLI
turboadb -s SERIAL push app.apk /data/local/tmp/
turboadb -s SERIAL pull /sdcard/Download/log.txt .
Python
dev.push("app.apk", "/data/local/tmp/")
dev.pull("/sdcard/Download/log.txt", "log.txt")

Apps

List, install (single or split APKs), uninstall, clear data, start / stop.

GUI

Apps tab → filter the list, then Install / Uninstall / Clear / Start / Stop.

CLI
turboadb -s SERIAL packages --third-party
turboadb -s SERIAL install app.apk --grant
turboadb -s SERIAL uninstall com.example.app
Python
dev.list_packages(third_party=True)
dev.install("app.apk", grant_perms=True)
dev.install_multiple(["base.apk", "split_config.apk"])
dev.uninstall("com.example.app")

Device controls

Keys, media, connectivity, screen, app launchers, and an on-screen keyboard — the GUI's Controls tab, each also a command and a call.

GUI

Controls tab → click any tile.

CLI
turboadb -s SERIAL key home
turboadb -s SERIAL media play-pause
turboadb -s SERIAL wifi on        # bluetooth | airplane | hotspot
turboadb -s SERIAL screen off
turboadb -s SERIAL open https://maps.google.com
turboadb -s SERIAL text "hello world"
Python
dev.keyevent("home"); dev.media("play-pause")
dev.set_wifi(True); dev.set_hotspot(True); dev.screen_off()
dev.open_url("https://maps.google.com"); dev.input_text("hello world")

Mirroring (scrcpy)

In a window or embedded, with a compatibility mode for IVI units and remote-tunnel handling. Mirror every display at once, watch and control side by side, or mirror the device's own camera.

GUI
  1. Open the Mirror tab (or the Scrcpy ribbon button).
  2. Pick a display, then ▶ Mirror (window) or 🖥 Live View (reliable over RDP). For a stubborn IVI use ⚙ Options → compatibility.
  3. ▦ Mirror all opens every display at once; 📷 Camera mirrors the device camera (front/back under ⚙ Options).
  4. The 🎮 Control + Mirror sub-tab puts the screen and the controls side by side.

The display list loads only when you open the tab — so connecting never starts scrcpy on its own.

CLI
turboadb -s SERIAL scrcpy --max-size 1280 --bit-rate 8M
turboadb -s SERIAL scrcpy --video-source camera --camera-facing front
Python
from turboadb import ScrcpyOptions
sess = dev.mirror(ScrcpyOptions(max_size=1280, bit_rate="8M"))
sess.wait()
# device camera instead of the screen:
dev.mirror(ScrcpyOptions(video_source="camera", camera_facing="front"))

Screenshots & recording

Recording uses device-side screenrecord, so it works over RDP without a video tunnel.

GUI

Screenshot ribbon button; record from the Mirror panel.

CLI
turboadb -s SERIAL screenshot shot.png
turboadb -s SERIAL record clip.mp4 --time-limit 20 --size 1280x720
Python
dev.screenshot("shot.png")
dev.screen_record("clip.mp4", time_limit=20, size="1280x720")

Webcam (host camera) new

Different from the device camera above: this views a host webcam — a USB / laptop camera on the machine running TurboADB. Point one at the physical head unit or bench and watch it beside the mirror. It captures locally, so it also works when TurboADB runs inside an RDP session (it sees that session's redirected camera).

GUI · Local
  1. Click the 📹 Webcam ribbon button (or View → Open webcam) — it opens as a standalone tab, no device needed. Source = Local (this PC / RDP session).
  2. Click 🔍 Scan cameras (the first time, ffmpeg is fetched once, ~160 MB → ~/.turboadb/ffmpeg), pick a camera and quality.
  3. Press ▶ Start. Then Snapshot, Record (clean H.264 MP4), Pause, Rotate / Mirror, and Fill·Fit·Stretch.

No camera listed over RDP? Enable camera redirection in the RDP client (Local Resources → More… → Cameras), turn on Windows camera privacy, and close any app already using it.

GUI · Remote (no SSH)
  1. Set Source = Remote (RDP / Windows machine) and enter the host, user, domain and password.
  2. 🔍 Scan cameras, then ▶ Start — TurboADB uses the same WinRM/NTLM path as deploy-serve to launch ffmpeg on the remote and stream its camera back over a direct TCP socket.

The target needs WinRM on (Enable-PSRemoting -Force), the account a local admin, and ffmpeg installed there. A physical USB camera works headlessly; a camera redirected into someone's RDP session is only visible inside that session.

Note

The webcam is a desktop feature (not an adb device op, so there's no CLI / Python call). Bring your own ffmpeg via Settings → ffmpeg path for offline use.

Telephony

GUI

The Phone tab — dialer, calls, call log, SMS.

CLI
turboadb -s SERIAL call 1800123456
turboadb -s SERIAL call-log --limit 20
turboadb -s SERIAL send-sms 1800123456 "on my way"
Python
dev.call("1800123456"); dev.end_call()
for c in dev.call_log(20): print(c)
dev.send_sms("1800123456", "on my way")

Root & mount

For rooted / engineering builds.

GUI

The Root / Mount ribbon dropdown.

CLI
turboadb -s SERIAL root         # unroot to undo
turboadb -s SERIAL mount-rw
turboadb -s SERIAL disable-verity
Python
dev.root(); dev.remount(); dev.mount_rw(); dev.disable_verity()

Remote devices

Drive a device plugged into another machine over its adb server — the host just has to be sharing (see Serve).

GUI

Connect → Remote PC; enter the host + device.

CLI
turboadb devices --adb-host lab-pc-01
turboadb --adb-host lab-pc-01 -s DEVICE shell -- pm list packages
Python
dev = ADBHandler(ADBConfig(adb_server_host="lab-pc-01", serial="DEVICE"))
dev.connect()

Share devices (serve)

Turn the machine a device is plugged into a host others can reach.

GUI

ADB Server ▾ → Share this PC's devices (optionally "run at login"). To undo it, ADB Server ▾ → 🛑 Stop sharing & remove auto-start — stops sharing and removes both the login launcher and the SYSTEM startup task.

CLI
turboadb serve --startup-task    # shared server + firewall, headless across reboots
turboadb serve --uninstall-startup   # stop auto-start again
Python
from turboadb.devices import (start_shared_server, install_serve_task,
                              stop_shared_server, uninstall_serve_task)
start_shared_server(); install_serve_task()
# undo:
uninstall_serve_task(); stop_shared_server()

Deploy serve over WinRM

Push serve onto remote Windows hosts from your machine — one host or a fleet. Each target needs WinRM on and admin rights.

GUI

The ADB Server button → enter host(s) + admin credentials → Test connectionDeploy.

CLI
turboadb deploy-serve lab-pc-01 lab-pc-02 -u "DOMAIN\user"
turboadb deploy-serve lab-pc-01 -u "DOMAIN\user" --test
Python
from turboadb.remote_deploy import deploy_serve
deploy_serve(["lab-pc-01", "lab-pc-02"], "DOMAIN\\user", "password", on_status=print)

GUI extras

Small conveniences that make long sessions nicer.

GUI
  • 🌙 / ☀ Theme — one-click dark / light toggle in the ribbon (the glyph shows the theme you'll switch to).
  • 🔲 Split — view two device tabs side by side.
  • ⛶ Max view (on the Mirror tab) hides the docks so the screen fills the window.
  • 📋 Logs — toggle the leveled, filterable log dock; the noisy adb trace is hidden by default.
  • ⚙ Settings — theme, fonts, tool paths (adb / scrcpy / ffmpeg), and scrcpy defaults.

Keep things up to date

GUI

The Upgrade button updates TurboADB, refreshes adb/scrcpy, and restarts.

CLI
turboadb self-update      # TurboADB + adb/scrcpy
turboadb upgrade-tools    # only adb/scrcpy
turboadb doctor           # what's installed / missing
Python
from turboadb import upgrade_tools
upgrade_tools()