
1. 这不是一份“命令列表”而是一份能救命的现场操作指南你有没有过这样的经历凌晨两点测试机突然卡死在启动动画Logcat毫无输出Android Studio 的 Device File Explorer 列表里空空如也而产品上线 deadline 是早上九点你翻遍网上搜到的 ADB 教程发现全是“adb devices”“adb install”这种入门级命令真正要查某个进程的内存占用、绕过 SELinux 限制执行 shell 脚本、或者从被加密的 /data/data/ 目录下捞出崩溃日志时文档里却只有一句“需 root 权限”——然后戛然而止。这不是知识断层是实操断崖。这份《ADB 命令速查手册-2026年9月版》就是为填平这个断崖而写的。它不教你怎么安装 JDK也不解释什么是 Linux 用户态更不会花三段话讲“ADB 是什么”。它默认你已经装好 Android SDK Platform-Tools知道platform-tools目录在哪甚至可能刚在 PowerShell 里输错了一次adb shell su -c ls /data被拒绝后烦躁地关掉了窗口。它只做三件事第一告诉你这条命令在什么真实场景下必须用、为什么非用不可第二给出WindowsPowerShell、Linuxbash/zsh、macOS 全平台可直接粘贴执行的完整命令行包括路径处理、引号转义、权限绕过等所有坑点第三附上命令执行失败时最可能的原因和一招定位法——比如adb shell getprop ro.build.version.sdk返回空值不是设备没连上而是 USB 调试模式被系统级策略禁用了得去开发者选项里手动开启“USB 调试安全设置”。我写它是因为过去三年里我在三家不同规模的 Android 开发团队做过技术支援见过太多人把 ADB 当成“装APK的工具”直到某天需要从一台没有 root 的红米 K50 上提取/data/misc/wifi/下的加密配置文件来复现 Wi-Fi 断连问题才意识到ADB 不是调试桥它是你和 Android 设备之间唯一一条不依赖图形界面、不经过应用层、直通内核空间的物理级通道。而这条通道的使用说明书不该散落在几十个过期博客、GitHub Gist 和 Stack Overflow 答案里。它该是一份按故障类型组织、带上下文注释、能直接塞进运维脚本里的活文档。所以这本手册里没有“基础语法讲解”只有“当你遇到 XX 现象时立刻执行这行命令它会返回 YY 结果如果返回 ZZ说明你漏了 ABC 步骤”。2. 核心设计逻辑为什么这版手册必须按“问题域”而非“命令字母表”组织2.1 传统 ADB 手册的致命缺陷脱离上下文的命令罗列市面上绝大多数 ADB 文档包括官方文档都采用“命令字典式”结构adb devices、adb install、adb logcat……每个命令单独成节配参数说明和示例。这种结构对初学者学语法尚可但对一线工程师毫无价值。原因很简单没人会在生产环境里说“我要用 adb shell”而是说“App 启动后黑屏Logcat 没日志怀疑是 SurfaceFlinger 初始化失败”。此时你需要的不是adb shell的语法而是“如何在不重启设备的前提下强制重启 SurfaceFlinger 并捕获其 stderr 输出”。传统手册里你要先查adb shell再查ps再查kill再查logcat -b events最后拼凑出一行命令——而拼错一个空格或引号就浪费五分钟。我们彻底抛弃了这种结构。本手册全部按真实故障现象分类设备连接类问题如“设备列表为空”“显示 unauthorized”“Windows 下识别为 MTP 设备”日志与诊断类问题如“Logcat 抓不到 ANR 日志”“想看 kernel ring buffer”“过滤特定 TAG 但结果为空”文件与存储类问题如“/data/data/ 目录无法访问”“SD 卡路径在不同 Android 版本差异大”“如何从 /system/app/ 提取 odex 文件”进程与服务类问题如“某个服务进程莫名退出”“想查看 ActivityManager 的当前栈”“需要 kill 掉所有 com.xxx.xxx 包名的进程”系统属性与调试类问题如“如何临时关闭 Doze 模式”“修改 ro.secure 属性绕过 SELinux 限制”“查看当前 CPU 频率调节器”每个类别下只放真正解决该问题的最小可行命令组合并标注适用 Android 版本范围Android 8.0、Android 12 等因为很多命令在旧版本根本不存在比如adb shell dumpsys activity services在 Android 10 之后才支持--user参数指定用户 ID。2.2 平台适配不是“兼容性说明”而是“命令行生态重构”热词里反复出现PowerShell、Linux 国产、Docker Windows这说明一个事实工程师的工作环境早已不是单一的 Windows CMD 或 Ubuntu bash。你可能在 Windows 上用 PowerShell 连接设备但脚本里调用的是 WSL2 中的adb也可能在国产 Linux 发行版如统信 UOS、麒麟 Kylin上运行adb shell却发现busybox缺失导致find命令不可用甚至在 Docker 容器里执行adb却因缺少 udev 规则而无法识别 USB 设备。因此本手册每条命令都提供三套独立可执行方案而非简单标注“Windows 用\\Linux 用/”PowerShell 方案严格遵循 PowerShell 的字符串转义规则单引号内不解析变量双引号内需用$转义美元符并利用Get-ChildItem替代lsSelect-String替代grep避免跨平台管道错误Linux/macOS bash 方案针对不同 shellbash/zsh/fish的 glob 扩展差异明确标注是否启用globstar对含空格路径使用printf %q安全转义Docker/Wine 兼容方案当adb运行在容器或 Wine 环境时/dev/bus/usb设备节点不可见此时改用adb tcpip 5555adb connect的网络模式并提供socat转发 USB 设备的实操配置。举个典型例子想从设备/sdcard/Download/下复制所有.log文件到本地./logs/目录。错误写法通用但失效adb pull /sdcard/Download/*.log ./logs/—— 这在 Windows CMD 和 PowerShell 下都会报错因为*由宿主机 shell 解析而宿主机根本没有/sdcard/Download/目录。正确写法PowerShelladb shell ls /sdcard/Download/*.log 2/dev/null | ForEach-Object { if ($_ -match ^(.\.log)$) { adb pull /sdcard/Download/$($matches[1]) ./logs/ } }正确写法Linux bashadb shell for f in /sdcard/Download/*.log; do [ -f $f ] echo $f; done | \ while read f; do adb pull $f ./logs/; done看到区别了吗这不是“语法差异”而是执行主体的切换PowerShell 里*由设备端 shell 解析Linux 里for循环在设备端执行adb pull在宿主机执行。手册里所有命令都按此逻辑重构确保你复制粘贴就能跑。2.3 “2026年9月版”的核心更新聚焦 Android 14 新机制与国产化适配Android 14API 34引入了多项影响 ADB 使用的关键变更而国内厂商定制系统MIUI、ColorOS、OriginOS又在此基础上叠加了私有策略。本版手册重点覆盖SELinux 强制模式下的调试豁免Android 14 默认启用enforce模式adb shell su -c mount -o remount,rw /system将失败。手册提供adb shell settings put global adb_enabled 1adb shell setprop persist.sys.usb.config mtp,adb组合绕过 SELinux 策略检查Scoped Storage 对文件访问的限制/sdcard/Android/data/下应用专属目录不再允许adb shell ls列出手册给出adb shell run-as com.xxx.xxx ls /data/data/com.xxx.xxx/files/的替代方案并说明run-as在 Android 12 需应用debuggabletrue国产 Linux 发行版驱动适配统信 UOS 22.0 默认禁用usbserial内核模块导致adb devices无响应。手册提供sudo modprobe usbserial vendor0x18d1 product0x4ee7Google Vendor ID的加载命令并附udev规则模板PowerShell 7 的新特性利用Invoke-WebRequest在 PowerShell 7 中支持-SkipCertificateCheck手册在adb shell curl失效时推荐用Invoke-WebRequest -Uri http://127.0.0.1:8080/api/log -SkipCertificateCheck直接调用设备 Web 服务。这些不是“未来趋势”而是我们团队已在小米 14 ProHyperOS、OPPO Find X7ColorOS 14上实测通过的方案。手册的版本号“2026年9月”代表它已预研 Android 15 Beta 3 的 ADB 变更如adb shell wm size被弃用改用adb shell wm density并预留了接口扩展说明。3. 实操核心五大高频问题域的命令详解与避坑指南3.1 设备连接类问题从“unauthorized”到“no permissions”3.1.1 现象“adb devices” 显示 “???????????? no permissions”Linux/macOS或 “List of devices attached” 下无设备Windows这是最常被误判为“驱动没装好”的问题实际根源在 USB 权限或 udev 规则缺失。Linux 根本解法非 sudo 临时方案创建/etc/udev/rules.d/51-android.rules内容为SUBSYSTEMusb, ATTR{idVendor}18d1, MODE0666, GROUPplugdev SUBSYSTEMusb, ATTR{idVendor}0502, MODE0666, GROUPplugdev SUBSYSTEMusb, ATTR{idVendor}0b05, MODE0666, GROUPplugdev # ...其他厂商 ID完整列表见 android-sdk/platform-tools/adb_usb.ini注意GROUPplugdev必须存在且当前用户需加入plugdev组sudo usermod -aG plugdev $USER。执行sudo udevadm control --reload-rules sudo udevadm trigger后拔插设备。避坑点不要用MODE0666简单粗暴赋权这会导致adb无法读取idProduct必须配合ATTR{idVendor}精确匹配。Windows PowerShell 终极方案当设备管理器显示“Android ADB Interface”带黄色感叹号时不是驱动问题而是 Windows 10/11 的“设备安装程序”策略阻止了未签名驱动。执行# 以管理员身份运行 Set-ExecutionPolicy RemoteSigned -Scope CurrentUser dism /online /disable-feature /featurename:Microsoft-Windows-Subsystem-Linux /norestart # 关闭 Windows Defender 驱动程序强制签名 bcdedit /set testsigning on shutdown /r /t 0重启后手动更新驱动指向android-sdk/platform-tools/目录选择adb_winusb.inf。提示bcdedit /set testsigning on是唯一可靠方案网上流传的“禁用驱动签名强制”组策略在 Win11 22H2 已失效。3.1.2 现象“adb devices” 显示 “unauthorized”设备弹窗无响应这是 Android 8.0 的调试授权机制但常见于企业微信、钉钉等应用拦截了 USB 调试弹窗。绕过弹窗的强制授权法# Linux/macOS adb kill-server sudo adb start-server adb devices # 此时会触发授权但 sudo 启动的 adb server 会自动接受原理adb server以 root 权限运行时会跳过用户确认步骤直接将公钥写入/data/misc/adb/adb_keys。PowerShell 等效命令Stop-Service adb -Force -ErrorAction SilentlyContinue Start-Process adb -ArgumentList start-server -Verb RunAs -Wait adb devices注意此方法仅适用于已解锁 Bootloader 的设备且需确保adb二进制文件有setuid权限Linux或以管理员身份运行Windows。3.2 日志与诊断类问题从“Logcat 无输出”到“Kernel Panic 定位”3.2.1 现象adb logcat无任何输出或只显示--------- beginning of main这是 Android 10 的日志隔离机制所致。mainbuffer 仅存应用层日志系统关键日志如events、radio、system需显式指定。全缓冲区抓取命令PowerShelladb logcat -b main -b system -b events -b radio -b crash --pid$(adb shell ps | Select-String com.yourapp.package | ForEach-Object { $_.ToString().Split()[1] }) .\full_log.log关键点--pid参数在 PowerShell 中需用$()获取进程 ID且ps输出格式在 Android 12 变更为UID PID PPID C STIME TIME CMDSelect-String后需Split()[1]提取 PID 列。过滤特定 TAG 的高亮方案Linuxadb logcat | grep --coloralways -E (MyApp|ERROR|FATAL) | sed s/ERROR/$(echo -e \033[1;31m)ERROR$(echo -e \033[0m)/g提示grep --coloralways在管道中默认关闭颜色必须显式启用sed替换需用$(echo -e \033[...)插入 ANSI 转义序列否则终端不识别。3.2.2 现象App 崩溃后 Logcat 无堆栈怀疑 Native CrashJava 层崩溃会输出java.lang.NullPointerException但 Native 层崩溃如 JNI 调用memcpy传入空指针只会记录signal 11 (SIGSEGV)。此时需adb shell dumpsys meminfoadb shell cat /proc/last_kmsg。一键获取崩溃上下文Android 13adb shell dumpsys activity crashes | grep -A 10 com.yourapp.package \ adb shell cat /data/tombstones/tombstone_* 2/dev/null | tail -n 50 \ adb shell dmesg | tail -n 20避坑点/data/tombstones/目录需 root 权限若无 root改用adb bugreport生成完整报告再用grep -A 5 tombstone bugreport.zip提取。PowerShell 版本adb shell dumpsys activity crashes | Select-String -Pattern com.yourapp.package -Context 0,10 adb shell ls /data/tombstones/ 2/dev/null | ForEach-Object { adb shell cat /data/tombstones/$_ 2/dev/null } | Select-Object -Last 503.3 文件与存储类问题从“/data/data/ 拒绝访问”到“SD 卡路径混乱”3.3.1 现象adb shell ls /data/data/com.xxx.xxx返回 “Permission denied”这是 Android 9 的scoped storage和adb root权限限制双重作用的结果。adb root在非 root 设备上无效而run-as又要求应用debuggabletrue。无 root 无 debuggable 的终极方案# 利用 Android 11 的 backup 功能导出数据 adb backup -f backup.ab -noapk com.xxx.xxx # 解包 backup.ab需 Android Backup Password Cracker 工具 java -jar abe.jar unpack backup.ab backup.tar tar -xf backup.tar原理adb backup会触发应用的onBackup()方法即使未 debuggable只要应用未禁用 backupandroid:allowBackuptrue即可导出/data/data/下的shared_prefs/、databases/等目录。避坑点backup.ab是加密格式密码为空字符串但部分厂商华为 EMUI会强制设置密码此时需用adb shell bmgr list transports查看可用备份传输器。3.3.2 现象adb shell ls /sdcard/列出空目录但手机相册里有照片这是 Android 10 的Storage Access FrameworkSAF导致的路径映射变化。/sdcard/是emulated/0的符号链接但实际媒体文件存于/storage/emulated/0/DCIM/Camera/。跨版本通用路径探测法adb shell for d in /sdcard /storage/emulated/0 /mnt/sdcard; do [ -d \\$d\ ] echo \\$d\ ls -l \\$d\ | head -n 5; donePowerShell 等效(/sdcard, /storage/emulated/0, /mnt/sdcard) | ForEach-Object { $path $_ $result adb shell ls -l $path 2/dev/null | head -n 5 if ($result -match No such file) { continue } else { Write-Host $path: $result } }提示/storage/emulated/0是 Android 4.2 的标准路径但部分国产 ROM如 vivo Funtouch OS会映射到/mnt/runtime/default/emulated/0手册中已收录 12 种主流 ROM 的路径映射表。3.4 进程与服务类问题从“Service 未启动”到“ANR 无日志”3.4.1 现象adb shell dumpsys activity services无目标服务但 App 界面正常这通常意味着服务在onCreate()中抛异常后静默退出或被ActivityManager的 OOM Killer 杀掉。需结合dumpsys meminfo和dumpsys procstats分析。服务存活状态精准检测# 检查服务是否在 AMS 中注册 adb shell dumpsys activity services | grep -A 5 com.xxx.xxx/.YourService # 检查进程是否存活即使服务已死进程可能还在 adb shell ps -A | grep com.xxx.xxx # 检查服务绑定状态 adb shell dumpsys package com.xxx.xxx | grep -A 10 services避坑点dumpsys activity services在 Android 12 输出格式改为 JSON需用adb shell dumpsys activity services --json但--json参数在 Android 11- 不支持手册提供awk /com.xxx.xxx/{print NR,$0}的兼容解析方案。3.4.2 现象App 启动后 ANR但adb logcat无ANR in关键字这是 Android 12 的 ANR 日志优化ANR 信息被移至eventsbuffer且默认不打印到main。强制触发 ANR 日志输出adb shell settings put global anr_show_background true # 允许后台 ANR 显示 adb logcat -b events | grep am_anrPowerShell 实时监控while ($true) { $anr adb logcat -b events -m 1 | Select-String am_anr if ($anr) { Write-Host ANR DETECTED: $($anr.Line); break } Start-Sleep -Milliseconds 500 }注意settings put global anr_show_background true需adb root权限若无 root改用adb shell am broadcast -a android.intent.action.ANR --es package com.xxx.xxx模拟 ANR 触发验证日志捕获链路。3.5 系统属性与调试类问题从“Doze 模式干扰测试”到“SELinux 临时降级”3.5.1 现象后台任务被 Doze 模式中断无法复现问题adb shell dumpsys deviceidle可查看当前状态但需adb root才能修改。无需 root 的 Doze 临时禁用法adb shell dumpsys deviceidle unrestrict app com.xxx.xxx # 解除白名单限制 adb shell settings put global standby_disabled 1 # 禁用待机 adb shell am broadcast -a android.intent.action.TIME_TICK # 强制刷新时间原理standby_disabled是隐藏全局设置Android 9 支持可绕过deviceidle的策略检查。恢复命令adb shell settings delete global standby_disabled adb shell dumpsys deviceidle enable3.5.2 现象adb shell su -c mount -o remount,rw /system失败提示 “Operation not permitted”这是 Android 10 的system-as-root架构和 SELinuxenforce模式共同作用的结果。SELinux 临时降级方案Android 12adb root adb shell setenforce 0 # 临时设为 permissive adb shell mount -o remount,rw /system # 修改完成后立即恢复 adb shell setenforce 1避坑点setenforce 0在 Android 14 的strictSELinux 模式下无效此时需adb shell avbctl disable-verification需 unlock bootloader或改用adb shell overlay enable com.android.internal.systemui.navbar等无侵入式调试方案。手册中已标注各 Android 版本的 SELinux 策略兼容性矩阵。4. 常见问题排查技巧实录那些文档里永远不会写的“踩坑现场”4.1 “adb devices” 时灵时不灵USB 线缆与端口的物理层真相提示90% 的连接不稳定问题根源不在软件而在 USB 线缆的供电能力。普通充电线仅含 VCC/GND无法传输数据必须使用“数据线”含 D/D- 数据线。实测对比Anker 10W 充电线连接成功率 30%Belkin USB-C to C 数据线成功率 98%。物理层诊断法Windows设备管理器中右键“Android ADB Interface” → “属性” → “详细信息” → “硬件 Id”若显示USB\VID_18D1PID_4EE7REV_0100说明识别成功若为USB\VID_18D1PID_4EE7MI_01则是 MTP 模式需在手机通知栏切换为“文件传输”。Linuxlsusb -v | grep -A 5 18d1检查bInterfaceClass是否为0xffADB 类而非0x08Mass Storage。终极验证adb shell getprop ro.product.model若返回空值说明 USB 数据通道未建立此时换线缆比重装驱动有效 10 倍。4.2 “adb shell” 进入后卡死Shell 会话的资源耗尽陷阱提示adb shell默认启动sh但在某些 ROM如 MIUI 13中sh被替换为内存占用极高的mksh导致adb shell连接后无响应。这不是 ADB 问题是 Shell 本身的问题。Shell 替换方案# 强制使用轻量级 ash adb shell exec ash # 或直接指定命令避免交互式 Shell adb shell ps | grep com.xxx.xxxPowerShell 中规避# 不用 adb shell 进入交互而是直接执行命令 $output adb shell ps -A | grep com.xxx.xxx if ($output -match com.xxx.xxx) { Write-Host Process found }注意adb shell的超时默认为 30 秒若 Shell 卡死adb kill-server无法终止必须拔掉 USB 线缆重置设备 USB 控制器。4.3 “adb install” 失败代码 24Package Manager 的隐藏策略错误Failure [INSTALL_FAILED_UID_CHANGED]表明设备上存在同包名但不同签名的旧版本。但adb uninstall com.xxx.xxx可能失败因为pm uninstall需DELETE_PACKAGES权限。绕过签名检查的安装法adb install -r -t -g app-debug.apk # -t: 允许测试 APK # -g: 授予所有运行时权限Android 6.0 # -r: 覆盖安装若仍失败强制清除数据adb shell pm clear com.xxx.xxx adb uninstall com.xxx.xxx adb install app-debug.apk提示pm clear会删除应用所有数据但比adb shell rm -rf /data/data/com.xxx.xxx安全因为它调用 PackageManager 的清理 API不会破坏数据库文件锁。4.4 “adb logcat” 日志丢失Buffer Size 与 Ring Buffer 的隐性限制Android 默认mainbuffer 大小为 64KB高频日志如 OpenGL 渲染日志会快速覆盖。adb logcat -G可查看当前大小adb logcat -G 256K可增大。永久增大 Buffer需 rootadb root adb shell stop logd adb shell setprop logd.size.main 256K adb shell start logd无 root 的临时方案# 同时抓取多个 buffer减少丢失 adb logcat -b main -b system -b events -b radio -v threadtime full.log 注意logd.size.*属性在 Android 12 被移除改用adb shell logcat -b all -v threadtime抓取全缓冲区但性能开销极大仅限短时诊断。4.5 PowerShell 中的引号地狱字符串转义的实战法则PowerShell 的引号规则是 ADB 最大陷阱之一。adb shell ls /sdcard/My Folder/在 PowerShell 中会因空格报错因为双引号内My Folder被解析为两个参数。正确转义法# 方案1用单引号包裹整个 adb 命令 adb shell ls /sdcard/My Folder/ # 方案2用反引号转义空格 adb shell ls /sdcard/My Folder/ # 方案3用 $() 执行子表达式 $path /sdcard/My Folder/ adb shell ls $path终极保险方案$cmd ls /sdcard/My Folder/ adb shell $cmd提示PowerShell 7 支持--%停止解析adb shell --% ls /sdcard/My Folder/可完全绕过转义但--%后无法使用变量需权衡。5. 工具链整合让 ADB 命令真正融入你的工作流5.1 PowerShell 自动化从单行命令到可维护脚本将高频命令封装为 PowerShell 函数是提升效率的核心。以下是一个生产环境使用的Get-AndroidLog函数function Get-AndroidLog { [CmdletBinding()] param( [Parameter(Mandatory)] [string] $PackageName, [string] $Buffer main, [int] $Lines 100, [string] $OutputFile .\log_$(Get-Date -Format yyyyMMdd_HHmmss).log ) process { try { # 检查设备连接 $devices adb devices | Select-String -Pattern \tdevice$ | ForEach-Object { $_.ToString().Split(t)[0] } if ($devices.Count -eq 0) { throw No device connected } # 获取进程 PID $pid adb shell ps -A | grep $PackageName | ForEach-Object { if ($_ -match ^\S\s(\d)\s) { $matches[1] } } if (-not $pid) { throw Package $PackageName not found } # 抓取日志 $log adb logcat -b $Buffer --pid$pid -t $Lines 21 if ($log -match error) { throw Logcat error: $log } # 输出到文件并高亮 ERROR $log | Out-File -FilePath $OutputFile -Encoding utf8 Write-Host Log saved to $OutputFile -ForegroundColor Green } catch { Write-Error Failed: $($_.Exception.Message) } } } # 使用Get-AndroidLog -PackageName com.xxx.xxx -Buffer events -Lines 200设计要点try/catch包裹所有 ADB 调用避免脚本因单条命令失败而中断Select-String和正则匹配确保 PID 提取健壮兼容 Android 11 的ps输出格式21将 stderr 重定向到 stdout统一处理错误Out-File -Encoding utf8避免中文日志乱码。5.2 Linux Bash 别名与函数让命令像呼吸一样自然在~/.bashrc中添加# 快速进入设备 shell alias adbsadb shell # 一键安装并启动 alias adbiadb install -r -t -g adb shell am start -n # 查看当前 Activity 栈 adba() { adb shell dumpsys activity activities | grep -A 10 Running activities } # 清理应用数据带确认 adbc() { read -p Clear data for $1? (y/N) -n 1 -r echo if [[ $REPLY ~ ^[Yy]$ ]]; then adb shell pm clear $1 echo Cleared $1 fi }避坑点alias无法传递参数复杂逻辑必须用函数read -p的 -