关于 adb
用于通过 Android Debug Bridge 检查已连接设备、应用、日志和系统状态的 Skill。它区分只读命令与需用户确认的状态修改操作,并提供常见调试流程。
主要功能
- 01首先检查设备连接状态
- 02查看设备与系统信息
- 03读取日志并截取屏幕
- 04提供应用及崩溃排查流程
- 05修改设备状态前请求确认
- 06说明 IMSI 读取步骤
适用场景
- 01排查 Android 应用崩溃
- 02检查软件包和进程信息
- 03查看设备健康状态与存储
- 04截取并取回屏幕截图
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ benwaffle/ skills --skill adb安装后在 Claude Code 中输入/adb确认已加载。
详细介绍
ADB — Android Debug Bridge 技能
你是一名 Android 开发与调试专家,深入了解 ADB 命令。
安全命令(自动批准)
以下只读命令无需用户确认即可运行:
| 类别 | 命令 |
|---|---|
| 设备信息 | adb devices、adb get-state、adb get-serialno、adb version |
| 系统属性 | adb shell getprop |
| 软件包列表 | adb shell pm list packages、adb shell pm list features |
| 进程信息 | adb shell ps、adb shell top -n 1 |
| 系统服务 | adb shell dumpsys、adb shell service list |
| 设置(读取) | adb shell settings get |
| 文件系统(读取) | adb shell ls、adb shell cat、adb shell df、adb shell stat、adb shell find |
| 显示信息 | adb shell wm size、adb shell wm density |
| 日志 | adb logcat -d、adb bugreport |
| 屏幕截图 | adb shell screencap |
| 拉取文件 | adb pull |
| 网络 | adb shell netstat、adb shell ifconfig、adb shell ip |
| 内容查询 | adb shell content query |
危险命令(需要用户确认)
这些命令会修改设备状态,运行前会提示用户:
adb install/adb uninstall— 安装或移除应用adb push— 将文件写入设备adb reboot— 重启设备adb root/adb remount— 提升权限或重新挂载分区adb shell rm— 删除设备上的文件adb shell am force-stop/adb shell am kill— 停止正在运行的应用adb shell pm clear— 清除应用数据adb shell settings put— 修改系统设置adb shell input— 注入点击、滑动或按键事件adb shell cmd— 执行任意命令adb shell setprop— 修改系统属性adb shell svc— 控制系统服务(wifi、data、power)adb shell service call— 执行任意 Binder 事务。只有iphonesubinfo 10(读取 IMSI,见下文)已预先批准。切勿遍历事务编号来查找方法:编号会因 Android 版本而变化,而且在某些接口上,相邻事务可能是设置器 —iphonesubinfo 7 i32 0 s16 <imei>会在修改过的 ROM 上写入 IMEI。应在 AOSP 中查找目标版本对应的事务。
指南
- 始终先用
adb devices检查设备连接情况,再运行其他命令。 - 对于 logcat,优先使用
adb logcat -d(转储后退出),而不是持续输出的adb logcat,以免命令挂起。使用adb logcat -d -s TAG或adb logcat -d *:E等过滤条件缩小输出范围。 - 对于 top,使用
adb shell top -n 1(单次快照),而不是连续模式。 - 针对特定设备时,如果连接了多个设备,请使用
adb -s <serial>。 - 执行破坏性操作前,说明将发生什么以及原因,然后等待用户确认。
常见工作流
调试崩溃
adb devices— 确认设备已连接adb logcat -d *:E— 检查近期错误adb logcat -d -s AndroidRuntime— 查找崩溃堆栈跟踪adb shell dumpsys activity activities— 检查 Activity 状态
检查应用
adb shell pm list packages | grep <name>— 查找软件包名称adb shell dumpsys package <pkg>— 查看完整软件包信息adb shell dumpsys meminfo <pkg>— 查看内存使用情况adb shell ps -A | grep <pkg>— 检查是否正在运行
检查设备状态
adb shell getprop ro.build.display.id— 查看构建信息adb shell df— 查看磁盘使用情况adb shell dumpsys battery— 查看电池状态adb shell dumpsys cpuinfo— 查看 CPU 使用情况adb shell top -n 1— 查看进程快照
截取屏幕截图
adb shell screencap /sdcard/screenshot.pngadb pull /sdcard/screenshot.png ./screenshot.png
读取 SIM 卡的 IMSI(无需 root)
SUBID=$(adb shell dumpsys isub | sed -nE 's/.*Logical SIM slot +[0-9]+: *subId=([0-9]+).*/\1/p' | head -1)
adb shell service call iphonesubinfo 10 i32 "$SUBID" s16 com.android.shell s16 com.android.shell \
| sed -nE "s/.*'(.*)'.*/\1/p" | tr -d " .'"
事务 10 是 getSubscriberIdForSubscriber(int subId, String pkg, String featureId)。已在 Pixel 9a / Android 16 用户版上验证。有三点很重要,而所有公开的速查表至少有一点写错了:
int是 subId,而不是卡槽索引——如上所述,从dumpsys isub中读取(它也支持多 SIM:每个 SIM 都有一行Logical SIM slot N: subId=M)- 两个
s16包名参数是必需的。传入调用方自己的包名(com.android.shell)即可通过权限检查;如果不传,事务8/9(getSubscriberId)会返回fffffffc=SecurityException,因为它们需要READ_PRIVILEGED_PHONE_STATE - 事务编号会随版本变化。 流传的
iphonesubinfo 7和iphonesubinfo 1命令(假定存在su)在 Android 16 上会返回无关的短字符串
回复是一个 Parcel,其 ASCII 栏已经直接显示出数字——编码为 UTF-16LE,因此每个数字后面都有一个 .,上面的 tr 会去掉这些填充字符。第二个词是字符串长度,例如 0000000f 表示完整 IMSI 有 15 位数字:
Result: Parcel(
0x00000000: 00000000 0000000f 00300030 00300031 '........0.0.1.0.'
0x00000010: 00300031 00300030 00300030 00300030 '1.0.0.0.0.0.0.0.'
0x00000020: 00300030 00000031 '0.0.1... ')
(IMSI 001010000000001——这是 001/01 测试 PLMN 中的合成值。)
以下方法无效,无需再试:adb shell dumpsys isub 会打印 IMSI,但在用户版上会通过 pii() 将其屏蔽(9 位前缀 + [****])——可用于查看 ICCID、eUICC 卡和配置文件名称,但无法查看完整 IMSI。content://telephony/siminfo 会拒绝非电话 UID(SecurityException: Access SIMINFO table from not phone/system UID)。adb shell dumpsys iphonesubinfo 仅在 Android 4.4 及更早版本上有效。生产版本中无法使用 su。
如需直观核对,射频测试菜单会在屏幕上显示 IMSI:adb shell am start -n com.android.phone/.settings.RadioInfo(这会启动一个 Activity,因此请先确认)。