Target a device
Everything operates on one device — local USB, a network
device, or one on another machine's adb server.
GUI
- Click Connect in the ribbon.
- Pick USB, Network (host:port), or Remote PC
(another machine's adb server).
- 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
- Open the Logcat tab and set Level / tag (optional).
- 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.
- 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
- Open the Mirror tab (or the Scrcpy ribbon button).
- Pick a display, then ▶ Mirror (window) or 🖥 Live View
(reliable over RDP). For a stubborn IVI use ⚙ Options → compatibility.
- ▦ Mirror all opens every display at once; 📷 Camera
mirrors the device camera (front/back under ⚙ Options).
- 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
- Click the 📹 Webcam ribbon button (or View → Open
webcam) — it opens as a standalone tab, no device needed.
Source = Local (this PC / RDP session).
- Click 🔍 Scan cameras (the first time, ffmpeg is fetched once,
~160 MB →
~/.turboadb/ffmpeg), pick a camera and quality.
- 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)
- Set Source = Remote (RDP / Windows machine) and enter
the host, user, domain and password.
- 🔍 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 connection → Deploy.
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)
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()