Execute ADB commands via natural language or direct command input, with multi-device support, safety guardrails, and sandboxed ADB installation.
adb devices -l. If the command fails (command not found), go to ADB Resolution to find or install adb, then retry.-s <serial> to all subsequent commands.When adb is not found, resolve using scripts/adb_env.sh which checks in order: system PATH → common SDK paths ( ~/Library/Android/sdk/, ~/Android/Sdk/) → sandbox local ( <skill_dir>/tools/platform-tools/adb).
If none found, ask the user: "ADB 未安装,是否需要我帮你安装到 skill 本地目录?(不影响系统配置)"
If agreed, run bash <skill_dir>/scripts/install_adb.sh (no sudo, no PATH modification, uninstall via rm -rf <skill_dir>/tools/).
When adb devices -l returns multiple devices:
-s <serial> for all commands in the sessionbash scripts/device_check.sh in the skill directory for a quick overviewLevelBehaviorExamplesSafeExecute directlyadb devices, logcat, screencap, getprop, pull, file listingModerateShow command, then executeinstall, push, am start, input tap, pm grantDangerousShow command, explain risk, require explicit "yes"pm clear, uninstall, factory reset, flash, wipe, reboot
bash
bash <skill_dir>/scripts/device_check.sh
bash
bash <skill_dir>/scripts/screenshot.sh [output_dir] [serial]
bash
bash <skill_dir>/scripts/logcat_capture.sh all [output_file] [serial]
bash <skill_dir>/scripts/logcat_capture.sh crash [output_file] [serial]
bash <skill_dir>/scripts/logcat_capture.sh app <package> [output_file] [serial]
bash <skill_dir>/scripts/logcat_capture.sh tag <TAG> [output_file] [serial]
When the user requests any long-running or verbose log output (logcat streaming, dropbox dump, dumpsys, large trace output, etc.), unless the user explicitly specifies an output file, always open a new system terminal window to display the output. This gives the user a scrollable, stoppable, dedicated view without blocking the conversation.
Only write to file when the user explicitly says "保存到文件" / "输出到 xxx.txt" / provides a file path.
bash
osascript -e 'tell app "Terminal" to do script "<adb_logcat_command>"'
bash
# GNOME
gnome-terminal -- bash -c '<adb_logcat_command>; exec bash'
# KDE
konsole -e bash -c '<adb_logcat_command>; exec bash'
# Fallback
x-terminal-emulator -e bash -c '<adb_logcat_command>; exec bash'
Replace <adb_logcat_command> with the actual command, e.g.:
adb logcat — all logsadb logcat | grep -i "redirect" --line-buffered — filter by keywordadb logcat -s MyTag:D — filter by tagadb logcat --pid=$(adb shell pidof com.example.app) — filter by appzsh treats * as a glob wildcard. When the command contains * (e.g. Tag:*), escape it in the osascript string:
bash
# Wrong — zsh expands *
osascript -e 'tell app "Terminal" to do script "adb logcat -s MyTag:*"'
# Correct — escape the *
osascript -e 'tell app "Terminal" to do script "adb logcat -s MyTag:\\*"'
After launching, report to the user that the terminal window has been opened and what command is running.
bash
adb install -r <path.apk>
If install fails, check: device storage ( adb shell df -h), existing app version, test package flag ( -t).
Two-level fallback:
bash
adb logcat -b crash -d | grep <package>
⚠️ 强制规则:严禁主动挑选 dropbox 条目。必须先列出所有条目,等用户选择后再输出内容。绝不允许跳过用户选择步骤。
Step 1 — 列出 dropbox 中所有 crash/anr 条目及其时间戳,供用户选择:
bash
adb shell dumpsys dropbox | grep -E "^[0-9].*(_crash|_anr)"
输出示例:
text
2026-04-09 11:04:34 data_app_anr (compressed text, 23807 bytes)
Process: com.netease.cloudmusic:play/PID: 2553 ...
2026-04-09 10:23:45 data_app_crash (text, 1234 bytes)
Process: com.example.app/PID: 1234 ...
Step 2 — 将列表 完整呈现 给用户(包含完整日期时间、类型、进程信息),然后 必须等待用户明确选择 要查看哪一条。 严禁自行判断、自动选择最近一条或任何一条。
Step 3 — 用户选择后,打开新终端窗口展示对应条目:
bash
# 使用用户选择的条目的时间戳
adb shell dumpsys dropbox --print '<tag>' --since <timestamp_ms>
Two-level fallback:
bash
adb shell uiautomator dump /sdcard/ui_dump.xml
adb pull /sdcard/ui_dump.xml <local_path>
adb shell rm /sdcard/ui_dump.xml
could not get idle state):bash
adb shell dumpsys activity top -a > <local_path>
This outputs a text-based View Hierarchy instead of XML, but contains equivalent structural info.
bash
adb shell screenrecord /sdcard/recording.mp4 # default max 180s
adb shell screenrecord --time-limit 30 /sdcard/recording.mp4 # limit to 30s
# Ctrl+C to stop, then pull:
adb pull /sdcard/recording.mp4 <local_path>
adb shell rm /sdcard/recording.mp4
bash
adb shell dumpsys activity activities | grep mResumedActivity
bash
adb shell dumpsys meminfo <package>
adb shell dumpsys gfxinfo <package>
adb shell dumpsys cpuinfo | grep <package>
bash
adb tcpip 5555
# Note the device IP from:
adb shell ip route | grep wlan
adb connect <ip>:5555
Always confirm before executing any of:
pm clear — wipes app data permanentlyuninstall — removes apprm -rf — deletes files/directoriesreboot / reboot recovery / reboot bootloaderfactory reset / wipe_datafastboot flash — overwrites partitionspm disable-user — disables system appssettings put — modifies system/secure/global settingssetprop — changes system propertiessu / adb root — elevates to root privilegessideload — flashes OTA packages--user 0 on system packagesPresent the exact command and a one-line risk description, then wait for explicit confirmation.
IssueFixdevice not foundCheck USB cable, enable USB debugging in Developer Optionsdevice unauthorizedAccept RSA key prompt on device, or adb kill-server && adb start-server``multiple devicesUse -s <serial>``INSTALL_FAILED_*Check error suffix — common: ALREADY_EXISTS (use -r), INSUFFICIENT_STORAGE, OLDER_SDK``Permission deniedTry adb root or run-as <package>Command hangsCtrl+C, then adb kill-server && adb start-server
For the full ADB command cheat sheet organized by category, see references/adb-commands.md.