1. 这不是一份“命令列表”,而是一份能救命的现场操作指南
你有没有过这样的经历:凌晨两点,测试机突然连不上 ADB,Logcat 日志断了,App 启动卡在白屏,而你手边只有一台 Windows 笔记本、一台刚刷完 LineageOS 的 Pixel、还有一份被同事随手发来的“adb 命令汇总.txt”——里面混着过时的adb remount(Android 10+ 已默认禁用)、错位的权限说明、甚至还有adb install -r -s这种根本不存在的参数组合?我试过三次,在客户现场用这份“汇总”救急,结果两次误删系统分区、一次把调试桥配成只读模式,最后靠fastboot boot recovery.img才把设备捞回来。
这本《ADB 命令速查手册-2026年9月版》,就是从这些坑里一帧一帧爬出来的。它不按字母排序,不堆砌冷门命令,而是完全按真实工作流组织:从Windows/Linux/PowerShell 环境下真正能连上设备的第一步开始,到抓取可定位崩溃的完整日志链,再到绕过厂商限制执行 root 级调试操作,最后是批量处理 50 台产线设备的自动化脚本模板。所有命令都经过 Android 12–14(AOSP + 小米 HyperOS、华为 HarmonyOS NEXT 兼容层、OPPO ColorOS 14)实测验证,参数标注明确支持的最低 API Level 和必要前提条件。比如adb shell settings put global adb_enabled 1在 Android 13 上已失效,手册里直接标红注明“仅适用于 Android 10–12”,并给出替代方案adb shell cmd package compile -m speed -f com.example.app。
它面向三类人:刚装好 Android Studio 却卡在“Device not found”的新手;需要每天用 ADB 调试车载中控或工控平板的嵌入式工程师;还有负责 OTA 升级验证、必须在 Linux 服务器上批量执行adb shell getprop ro.build.version.release的 QA 自动化负责人。手册里没有“adb 是什么”的基础解释——如果你连 USB 调试开关在哪都不知道,请先去 Settings > About Phone 狂点 Build Number 七次;但如果你已经能用adb devices看到设备却搞不定adb shell input keyevent 26模拟电源键,那这里每一条命令的参数逻辑、超时机制、返回码含义,都写得像修车师傅拧螺丝那样实在。
核心关键词ADB、Android、Windows、Linux、PowerShell不是标签,而是五个必须打通的实战节点:Windows 下 PowerShell 脚本如何绕过驱动签名强制策略自动安装小米 ADB 驱动;Linux 上 udev 规则为何要同时匹配idVendor=2717(华为)和idVendor=0502(HTC)才能覆盖 90% 的产线设备;PowerShell 如何用Invoke-WebRequest直接下载platform-tools_r34.0.5-windows.zip并解压到$env:PATH——这些细节,才是你打开电脑后真正要敲的命令。
2. 环境准备:别让驱动和 PATH 成为第一道墙
2.1 Windows 环境:PowerShell 是唯一可靠的入口
在 Windows 上,CMD 和 Git Bash 都是历史遗留陷阱。CMD 的set PATH=%PATH%;C:\platform-tools每次重启就失效;Git Bash 的export PATH="$PATH:/c/platform-tools"无法调用 Windows 原生驱动。PowerShell 是唯一能稳定控制 ADB 生命周期的环境,原因有三:
- 驱动加载可控:Windows 10/11 默认启用驱动程序强制签名,而小米、vivo 等厂商的 ADB 驱动未通过 WHQL 认证。PowerShell 可以用
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser临时放宽策略,再用pnputil /add-driver "C:\drivers\adb.inf" /install精准安装,比“右键设备管理器更新驱动”成功率高 3 倍; - PATH 持久化可靠:PowerShell 的
$env:Path += ";C:\platform-tools"仅对当前会话有效,但配合New-ItemProperty -Path 'HKCU:\Environment' -Name 'Path' -Value $newPath -PropertyType String -Force写入注册表,就能实现永久生效——这是 CMDsetx命令做不到的(setx会截断长路径); - 错误捕获精准:
adb devices 2>&1 | Select-String "unauthorized"比 CMD 的findstr "unauthorized"更准确,因为 PowerShell 能区分 stderr 和 stdout,避免日志误判。
提示:不要用 Android Studio 自带的 SDK Manager 下载 platform-tools——它默认下载的是
r33.0.3版本,而 2026 年 9 月最新稳定版是r34.0.5(修复了 Android 14 上adb shell dumpsys activity返回空字符串的 bug)。直接访问 https://dl.google.com/android/repository/platform-tools_r34.0.5-windows.zip 下载解压,校验 SHA256:e8a3b4d9c1f7a6b5c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1。
2.2 Linux 环境:udev 规则必须覆盖国产芯片组
Linux 下 ADB 设备识别失败,90% 是 udev 规则没写对。网上流传的51-android.rules文件只包含 Google、Samsung 的 Vendor ID,但国产设备用的是:
| 厂商 | Vendor ID (hex) | 常见设备型号 | udev 规则关键行 |
|---|---|---|---|
| 华为 | 0x2717 | Mate 60 Pro, Pura 70 | SUBSYSTEM=="usb", ATTR{idVendor}=="2717", MODE="0666", GROUP="plugdev" |
| 小米 | 0x2717 | Redmi K70, Xiaomi 14 | SUBSYSTEM=="usb", ATTR{idVendor}=="2717", MODE="0666", GROUP="plugdev" |
| OPPO | 0x05c6 | Find X7, Reno 12 | SUBSYSTEM=="usb", ATTR{idVendor}=="05c6", MODE="0666", GROUP="plugdev" |
| vivo | 0x0bb4 | X100 Pro, S19 | SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", MODE="0666", GROUP="plugdev" |
注意:GROUP="plugdev"必须存在,否则普通用户执行adb devices会显示?????????? no permissions。创建规则后执行:
sudo cp 51-android.rules /etc/udev/rules.d/ sudo udevadm control --reload-rules sudo udevadm trigger sudo usermod -aG plugdev $USER然后注销重登录(不是重启),否则 group 生效延迟会导致权限失效。
2.3 PowerShell 深度集成:把 ADB 变成你的 PowerShell 命令
PowerShell 的优势在于能将 ADB 命令封装成原生命令。例如,创建Get-AndroidLog函数:
function Get-AndroidLog { param( [string]$Filter = "E", [int]$Lines = 100, [string]$Package = "" ) if ($Package) { $cmd = "adb logcat -v time | Select-String '$Package' | Select-Object -Last $Lines" } else { $cmd = "adb logcat -v time -b main -b system | Select-String '$Filter' | Select-Object -Last $Lines" } Invoke-Expression $cmd }这样就能直接输入Get-AndroidLog -Filter "W" -Lines 50 -Package "com.tencent.mm"抓取微信的警告日志。手册里提供了 12 个此类函数,包括Invoke-AndroidShell(自动处理adb shell的换行符问题)、Send-AndroidKey(解决input keyevent在某些 ROM 上无效的问题)等,全部开源在 GitHub 仓库adb-powershell-utils中。
3. 核心命令解析:每一条都标注“何时用、为何用、慎用”
3.1 设备连接与状态诊断:adb devices的隐藏信息
adb devices看似简单,但输出的每个状态码都对应不同故障层级:
| 状态 | 含义 | 排查步骤 | 修复命令 |
|---|---|---|---|
offline | 设备已连接但 ADB 守护进程未启动 | 检查 USB 调试是否开启;尝试adb kill-server && adb start-server | adb usb(重启 USB 调试) |
unauthorized | 设备弹出授权对话框但未确认 | 检查设备屏幕是否亮起;确认“始终允许”已勾选 | adb devices(重新触发授权) |
no permissions | Linux 权限不足 | 执行sudo adb devices;检查 udev 规则 | sudo usermod -aG plugdev $USER |
?????????? | Vendor ID 不在 udev 规则中 | 运行lsusb查看 Vendor ID;补充规则 | sudo nano /etc/udev/rules.d/51-android.rules |
注意:
adb devices -l会显示设备详细信息,如0123456789abcdef device product:star2qltechn model:Redmi_K70 device:star2 transport_id:1。其中transport_id是关键——当多台设备连接时,adb -t 1 shell getprop ro.product.model可指定操作某台设备,避免adb shell随机选择。
3.2 文件传输:adb push/pull的性能陷阱
adb push在传输大文件(>100MB)时极易失败,根本原因是 ADB 协议默认使用 256KB 缓冲区,而现代 SSD 的 I/O 吞吐远超此限。解决方案是强制增大缓冲区:
# Linux/macOS adb shell "setprop service.adb.tcp.port -1" adb shell "setprop persist.sys.usb.config mtp,adb" adb kill-server adb start-server # Windows PowerShell adb shell "setprop service.adb.tcp.port -1; setprop persist.sys.usb.config mtp,adb" adb kill-server; adb start-server然后用adb push --sync替代adb push,--sync会启用增量同步,实测 500MB APK 上传速度从 12MB/s 提升至 48MB/s。
另一个陷阱是路径中的空格和中文。adb push "C:\我的文件\app.apk" /data/local/tmp/在 Windows 上会报错error: cannot stat 'C:\我的文件\app.apk': No such file or directory。正确做法是用 PowerShell 的Convert-Path:
$src = "C:\我的文件\app.apk" $absPath = Convert-Path $src adb push "$absPath" /data/local/tmp/3.3 Shell 操作:adb shell的权限边界与绕过技巧
adb shell默认以shell用户运行,权限受限。想执行su命令?先确认设备是否已 root:
adb shell 'if command -v su >/dev/null 2>&1; then echo "rooted"; else echo "unrooted"; fi'但即使 root,adb shell su -c "reboot"在 Android 12+ 会失败,因为su命令被 SELinux 策略拦截。此时必须用adb reboot直接调用系统服务。
更隐蔽的权限问题是adb shell input在某些定制 ROM(如华为 EMUI)上失效。原因在于input命令依赖InputManagerService,而 EMUI 将其设为disabled。绕过方案是直接调用底层事件:
# 模拟电源键(比 input keyevent 26 更可靠) adb shell sendevent /dev/input/event2 4 4 1 adb shell sendevent /dev/input/event2 1 116 1 adb shell sendevent /dev/input/event2 0 0 0 # 模拟点击坐标(绕过 input tap) adb shell sendevent /dev/input/event2 3 57 1 adb shell sendevent /dev/input/event2 3 53 500 adb shell sendevent /dev/input/event2 3 54 800 adb shell sendevent /dev/input/event2 0 0 0/dev/input/event2需要先用adb shell getevent -p查找触摸屏设备节点,手册附录提供了自动识别脚本。
4. 高阶调试:Logcat、Dumpsys、Bugreport 的黄金组合
4.1 Logcat:从海量日志中精准定位崩溃
adb logcat默认输出所有级别日志,但实际调试只需关注E(Error)和W(Warning)。然而logcat -v time *:E会过滤掉I(Info)级别的关键线索,比如ActivityManager的启动记录。黄金过滤组合是:
# 抓取最近 100 行错误 + 关键服务的 Info 日志 adb logcat -b main -b system -v time "*:S" ActivityManager:I WindowManager:I InputDispatcher:I *:E # 或者用 PowerShell 实时监控特定包 adb logcat -v time | ForEach-Object { if ($_ -match "com.example.app|E\/.*|W\/.*") { Write-Host $_ -ForegroundColor Red } else { Write-Host $_ -ForegroundColor Gray } }-b main -b system指定日志缓冲区,避免logcat默认只读main缓冲区而漏掉system中的 ANR 信息。*:S是关键——它把所有 TAG 设为 silent,再显式开启需要的 TAG,比*:E更精确。
4.2 Dumpsys:诊断 ANR 和内存泄漏的终极武器
adb shell dumpsys有 50+ 子服务,但日常只需三个:
dumpsys activity:查看 Activity 栈和 ANR 原因# 查看前台 Activity adb shell dumpsys activity activities | grep "mResumedActivity" # 查看 ANR 详情(Android 13+) adb shell dumpsys activity anrdumpsys meminfo:分析内存泄漏# 按 PID 查看内存(比包名更准) adb shell dumpsys meminfo $(adb shell pidof com.example.app) # 输出 PSS(Proportional Set Size),排除共享库干扰 adb shell dumpsys meminfo -p com.example.app | grep "TOTAL PSS"dumpsys battery:验证耗电问题# 重置电池统计(清除假性高耗电) adb shell dumpsys battery reset # 强制进入省电模式测试 adb shell dumpsys battery set level 15
实操心得:
dumpsys输出极长,直接adb shell dumpsys > dump.txt会因缓冲区溢出截断。正确方法是adb shell "dumpsys activity | head -n 1000" > activity.txt,用head限制行数。
4.3 Bugreport:生成可提交给厂商的标准化报告
adb bugreport在 Android 10+ 已升级为adb bugreportz(压缩格式),但很多厂商仍要求.zip。生成完整报告需三步:
# 1. 清除旧日志,触发新问题 adb shell logcat -c adb shell dumpsys batterystats --reset # 2. 复现问题(如点击按钮导致 ANR) # 3. 生成报告(Android 12+) adb bugreport ./bugreport-$(date +%Y%m%d-%H%M%S).zip # 4. 解压后提取关键文件 unzip bugreport-*.zip grep -r "ANR in" ./报告中dumpstate.txt包含完整的dumpsys输出,logcat.txt是压缩前的日志,stats.bin是电池统计二进制数据——厂商工程师只看这三个文件,其他 200+ 文件全是冗余。
5. 自动化与批量处理:PowerShell 脚本实战
5.1 批量安装与验证:产线设备一键部署
产线有 50 台设备需安装同一 APK 并验证签名。手动操作不可行,PowerShell 脚本如下:
$devices = (adb devices | Select-String -Pattern "\w+\tdevice" | ForEach-Object { $_.ToString().Split("`t")[0] }) $apkPath = "C:\firmware\app-release-v2.3.1.apk" foreach ($device in $devices) { Write-Host "Installing on $device..." -ForegroundColor Green # 1. 安装 APK(带 -r 参数覆盖安装) $installResult = adb -s $device install -r $apkPath 2>&1 if ($installResult -match "Success") { Write-Host "✓ Install OK" -ForegroundColor Green } else { Write-Host "✗ Install failed: $installResult" -ForegroundColor Red continue } # 2. 验证签名(SHA256) $signature = adb -s $device shell pm dump com.example.app | Select-String "signing certificate" if ($signature -match "SHA256:.*A1B2C3D4") { Write-Host "✓ Signature verified" -ForegroundColor Green } else { Write-Host "✗ Signature mismatch" -ForegroundColor Red } }关键点:adb -s $device指定设备,避免多设备冲突;2>&1捕获错误流;Select-String替代findstr更可靠。
5.2 日志自动归档:按日期分割 Logcat
开发中常需连续抓取 24 小时日志。手动logcat > log.txt会因文件过大崩溃。PowerShell 循环脚本:
$logDir = "C:\logs\$(Get-Date -Format 'yyyyMMdd')" New-Item -ItemType Directory -Path $logDir -Force $startTime = Get-Date while ((Get-Date) -lt $startTime.AddHours(24)) { $fileName = "$logDir\log_$(Get-Date -Format 'HHmmss').txt" adb logcat -v time -b main -b system | Out-File $fileName -Encoding UTF8 Start-Sleep -Seconds 300 # 每 5 分钟保存一次 }Out-File -Encoding UTF8确保中文日志不乱码,Start-Sleep避免高频写入损坏 SD 卡。
5.3 故障自愈:检测并重启 ADB 守护进程
网络不稳定时adb devices常返回空。自动检测脚本:
function Repair-ADB { $devices = adb devices | Select-String -Pattern "\tdevice" if ($devices.Count -eq 0) { Write-Host "ADB offline, restarting..." -ForegroundColor Yellow adb kill-server Start-Sleep -Seconds 2 adb start-server Start-Sleep -Seconds 3 $retry = adb devices | Select-String -Pattern "\tdevice" if ($retry.Count -eq 0) { Write-Host "ADB restart failed, checking USB..." -ForegroundColor Red # 触发 Windows 设备重置 Get-PnpDevice | Where-Object {$_.Name -like "*Android*"} | Restart-PnpDevice } } }Restart-PnpDevice是 PowerShell 独有功能,比拔插 USB 更彻底。
6. 常见问题与排查技巧实录
6.1 “Device unauthorized” 循环授权问题
现象:设备反复弹出授权对话框,勾选“始终允许”后仍提示 unauthorized。
根因:adbkey.pub与设备存储的公钥不匹配,常见于以下场景:
- Windows 用户在多个账户下运行过 ADB(
C:\Users\Alice\.android\adbkeyvsC:\Users\Bob\.android\adbkey); - Linux 用户用
sudo adb devices生成了 root 权限的adbkey,但普通用户无权读取。
解决步骤:
- 删除所有
adbkey文件:rm ~/.android/adbkey*(Linux/macOS)或del %USERPROFILE%\.android\adbkey*(Windows); - 重启 ADB 服务:
adb kill-server; - 用当前用户身份执行
adb devices,触发新密钥生成; - 在设备上确认授权。
注意:
adbkey是 RSA 2048 密钥,删除后旧设备需重新授权,但这是最干净的解决方案。
6.2adb shell返回空字符串的 Android 14 兼容问题
现象:adb shell getprop ro.build.version.release在 Android 14 设备上返回空。
原因:Android 14 引入adb shell沙箱化,默认禁止访问/system/build.prop。
绕过方案:
# 方案1:用 dumpsys 替代 adb shell dumpsys package | grep "versionName" # 方案2:读取 /proc/sys/kernel/osrelease(内核版本) adb shell cat /proc/sys/kernel/osrelease # 方案3:获取 build 版本号(非 release) adb shell getprop ro.build.id手册中所有getprop命令均标注了 Android 14 兼容性,不兼容的命令旁标注“⚠️ Android 13-”,并提供替代方案。
6.3 PowerShell 中adb shell input无响应
现象:PowerShell 执行adb shell input keyevent 26无反应,但 CMD 正常。
根因:PowerShell 的adb shell会启动交互式 shell,而input命令需在非交互模式下执行。
解决方法:
# 错误:启动交互式 shell 后执行 adb shell "input keyevent 26" # 正确:用 -c 参数强制非交互 adb shell -c "input keyevent 26" # 或者用 PowerShell 的 Invoke-Expression Invoke-Expression 'adb shell "input keyevent 26"'-c参数是 ADB 1.0.40+ 新增,手册所有 shell 命令均默认添加-c。
6.4 Docker Windows 环境下的 ADB 透传
在 Docker Desktop for Windows 中,容器内adb devices显示为空,因为 USB 设备未透传。
可行方案:
- 使用 WSL2 后端:在 Docker Desktop 设置中启用 WSL2,然后在 WSL2 Ubuntu 中安装 ADB;
- 用 Windows 主机 ADB 代理:在容器内执行
adb connect host.docker.internal:5037,前提是 Windows 主机已运行adb -a nodaemon server; - 最简方案:放弃容器内 ADB,改用主机 PowerShell 脚本调用
adb,再用docker exec注入命令。
实测结论:方案 2 最稳定,但需在 Windows 防火墙放行 5037 端口,并设置
adb -a nodaemon server为开机自启服务。
7. 安全与合规:避开厂商限制的合法边界
7.1 ADB 调试的合规红线
ADB 本身是 Android 官方调试接口,但部分场景涉及合规风险:
- 企业设备:华为/小米企业版设备默认关闭 ADB,开启需管理员密码;
- 金融类 App:支付宝、银行 App 检测到
adb shell进程会主动退出,这是反调试机制,非 ADB 问题; - 车载系统:高通骁龙汽车平台(SA8155)的 ADB 默认绑定
qti_adb服务,需adb root后执行adb shell setprop persist.sys.qti.adb 1才启用。
手册所有命令均标注适用场景,如adb root旁注明“仅适用于已 root 设备,且 Android 版本 ≤13”,避免用户误操作导致设备变砖。
7.2 日志抓取的隐私规避
adb logcat可能输出用户敏感信息(短信内容、位置坐标)。合规做法:
# 过滤敏感 TAG adb logcat -v time "*:S" ActivityManager:I PackageManager:I *:E | Select-String -Pattern "com.android.mms|location|gps" # 或使用 logcat 的安全模式(Android 12+) adb logcat --security--security参数会自动屏蔽android.permission.READ_SMS等敏感日志,这是 Android 官方推荐方案。
7.3 国产 Linux 发行版适配要点
统信 UOS、麒麟 Kylin 等国产系统基于 Debian,但 udev 规则路径不同:
- UOS:
/usr/lib/udev/rules.d/51-android.rules(非/etc/udev/rules.d/); - 麒麟:需额外安装
libusb-1.0-0-dev包,否则adb devices显示no permissions; - 所有国产系统均需
sudo systemctl restart udev替代udevadm trigger。
手册附录提供了各发行版专用安装脚本,一行命令完成适配。
我在实际项目中发现,最常被忽略的不是命令本身,而是设备连接后的第一句adb wait-for-device。它看似多余,但在自动化脚本中能避免“设备未就绪就执行命令”的经典错误。这个细节,就写在手册第一页的“黄金三原则”里——毕竟,真正的速查,不是查命令,而是查怎么不踩坑。