1. 项目概述从“黑盒”到“白盒”的调试桥梁在移动应用开发、测试乃至设备运维的日常工作中我们经常需要与手机或模拟器进行深度交互。无论是安装一个测试包、抓取一段崩溃日志还是模拟用户点击、查看当前运行的进程有一个工具几乎无处不在它就是ADB。很多开发者尤其是刚入行的朋友对ADB的印象可能停留在“一个用来安装APK和抓Log的命令行工具”。这固然没错但如果你只把它当作一个简单的“安装器”或“日志查看器”那就大大低估了它的威力也错过了许多能极大提升效率的可能性。ADB全称Android Debug Bridge即安卓调试桥。这个名字起得非常形象“桥”意味着连接与通信。它本质上是一个客户端-服务器架构的程序在你电脑客户端和安卓设备服务器端之间架起了一座稳定、高效的通信通道。我们日常在命令行里敲下的那些adb install、adb logcat其实只是这座桥上跑的各种“车辆”指令。理解这座“桥”本身是如何搭建、如何工作的远比死记硬背几个命令参数重要得多。它能让你在遇到“设备未连接”、“权限被拒绝”等问题时不再盲目尝试重启而是能精准地定位到是桥的哪一端出了问题。这篇文章我将从一个常年与各种“奇葩”设备和复杂测试场景打交道的测试开发角度为你拆解ADB命令背后的工作原理并分享那些真正高频、实用甚至能解决一些“疑难杂症”的命令使用技巧。无论你是应用开发、测试工程师还是对安卓系统感兴趣的技术爱好者掌握ADB的“道”与“术”都能让你的工作更加游刃有余。2. ADB工作原理深度解析不只是命令行要熟练使用ADB第一步是跳出“命令集合”的认知理解其底层的工作模型。很多人觉得ADB不稳定有时连得上有时连不上其根源大多在于对这套机制的不了解。2.1 核心架构客户端、服务器与守护进程的三方舞会ADB的架构清晰地分为三个部分它们协同工作完成了从你键入命令到设备执行结果的整个过程。客户端Client这就是你操作的终端。当你在命令行输入adb devices时你就是在运行ADB客户端。客户端的职责是解析你的命令并将其发送给ADB服务器。服务器Server这是一个在你电脑上后台运行的守护进程。当你第一次执行任何adb命令时它会自动启动通常运行在5037端口。它的角色是管理中心负责管理客户端与所有已连接设备包括USB连接的实体机和网络连接的设备/模拟器之间的连接。它维护着一个设备列表并将客户端的命令路由到正确的设备。守护进程Daemon - adbd这是在安卓设备或模拟器内部运行的一个后台服务。它是命令的最终执行者。当ADB服务器通过USB或网络将命令转发到设备后就由adbd来接收并执行它比如启动一个shell、推送文件或者转发端口。它们如何协作举个例子当你输入adb shell ls /sdcard客户端将shell ls /sdcard这个请求发送给本地服务器localhost:5037。服务器检查当前连接的设备。如果连接了多个设备你需要用-s指定否则服务器会默认选择第一个。服务器通过USB驱动或网络Socket将命令发送到目标设备的adbd。设备的adbd接收到命令在设备内部启动一个shell进程执行ls /sdcard然后将执行结果目录列表原路返回经由服务器最终显示在你的客户端终端上。注意很多“连接不上”的问题就出在这个链条上。可能是服务器进程卡死了需要adb kill-server然后adb start-server可能是设备的adbd进程挂了尤其在刷了某些非官方ROM的设备上也可能是USB驱动或网络配置不正确。2.2 连接方式详解USB与Wi-Fi的优劣与陷阱ADB提供了两种主要的连接方式各有适用场景和坑点。USB连接最传统、最稳定的方式。工作原理通过USB数据线建立物理连接。电脑端的ADB服务器通过USB驱动与设备的adbd通信。优点稳定、速度快特别是文件传输、无需网络环境。缺点受线缆长度限制同时管理多台设备时需要USB Hub且驱动问题频发尤其在Windows上。实操心得在Windows上如果设备管理器里你的安卓设备显示为“便携设备”或带有黄色叹号说明ADB驱动未正确安装。推荐使用官方Google USB Driver或使用第三方工具如“驱动精灵”识别安装。一个更简单的办法是安装一个完整的安卓模拟器如Nox、MuMu它们通常会自带并配置好ADB驱动和环境。Wi-Fi连接无线调试非常方便的远程调试方式。工作原理首先需要通过USB进行一次初始配对让设备获取到电脑的IP和端口信息。之后adbd会在设备上开启一个TCP/IP端口默认5555ADB服务器通过网络Socket与之通信然后就可以拔掉USB线了。常用命令# 1. 先用USB连接设备 adb devices # 确保设备已列出 # 2. 让设备在5555端口监听TCP/IP连接 adb tcpip 5555 # 3. 拔掉USB线连接到设备的IP adb connect 192.168.1.100:5555 # 断开无线连接 adb disconnect 192.168.1.100:5555优点摆脱线缆束缚可以同时连接多台设备且不受USB口数量限制方便对设备进行远程操作比如放在支架上做长时间稳定性测试。缺点与坑点速度慢文件传输、大量日志输出时明显不如USB。稳定性依赖网络Wi-Fi信号波动可能导致连接意外断开。最大的坑重启失效。设备重启后adbd的TCP/IP模式会重置需要重新用USB线执行adb tcpip 5555。这对于需要频繁重启的测试场景很不友好。安全风险如果设备IP暴露在公网且未设置认证理论上可能被他人连接。务必在可信的局域网内使用。个人经验我通常将Wi-Fi调试用于“静态”场景比如设备已经进入稳定测试阶段不需要频繁重启和刷机只需要偶尔查看日志或安装更新包。对于需要反复重启、刷写系统的开发调试前期强烈建议使用USB连接省心省力。3. 核心命令分类精讲与实战技巧理解了原理我们再来看看这座“桥”上能跑哪些“车”。ADB命令体系庞大但日常高频使用的可以归纳为几个核心类别。我将结合具体场景分享命令用法和背后的逻辑。3.1 设备与连接管理一切操作的基础这是所有ADB操作的起点确保你的命令能准确送达目标设备。adb devices最基础也最重要的命令。列出当前已连接的所有设备。List of devices attached emulator-5554 device 9A191FFBA000SF device第一列是设备的序列号Serial Number。模拟器通常是emulator-端口真机是硬件序列号。第二列是连接状态device已授权连接、offline设备未响应通常需重启adbd、unauthorized设备上未点击“允许USB调试”授权框。技巧当连接多台设备时必须在任何其他命令前用-s 序列号指定目标如adb -s 9A191FFBA000SF shell。adb connect/disconnect如前所述用于管理Wi-Fi连接。adb kill-server/adb start-server解决ADB相关问题的“万能重启大法”。当出现任何莫名其妙的连接问题、命令无响应时首先尝试adb kill-server结束后台进程再执行任何命令如adb devices会自动启动新服务器这能清除很多僵尸连接和状态缓存。3.2 应用包管理安装、卸载与数据清理这是测试人员每天重复次数最多的操作之一。adb install [-r] [-t] apk路径安装应用。-r替换已存在的应用保留数据。测试中极其常用用于安装新版测试包。-t允许安装测试APK。有些专为测试编译的包需要此参数。-d允许版本降级安装。实战场景adb install -r -t app-debug.apk。一条命令完成覆盖安装测试包。坑点安装失败常见错误码。INSTALL_FAILED_VERSION_DOWNGRADE版本降级加-dINSTALL_FAILED_UPDATE_INCOMPATIBLE签名不一致需先卸载旧版INSTALL_PARSE_FAILED_NO_CERTIFICATESAPK未签名。adb uninstall [-k] 包名卸载应用。-k卸载应用但保留数据和缓存目录。这在测试中非常有用比如你想测试一个全新安装的场景但又不想丢失之前配置好的测试数据如登录态、数据库可以先普通卸载再用-k卸载一次不逻辑是普通卸载会清除数据而-k是当你需要保留数据时才用。更常见的测试场景是彻底清理。所以通常我们不用-k。如何获取包名adb shell pm list packages列出所有包或用adb shell pm list packages | grep keyword过滤。adb shell pm clear 包名神级命令。它清除应用的所有用户数据/data/data/包名和缓存/data/cache效果相当于在系统设置里点击“清除数据”和“清除缓存”但更快、可脚本化。在自动化测试中常用于将应用状态重置到初次启动保证测试用例的独立性。3.3 文件传输不只是push和pulladb push 本地路径 设备路径/adb pull 设备路径 [本地路径]基本的文件上传下载。技巧1目录操作。ADB支持整个目录的推送和拉取非常方便。技巧2处理权限。推送到/sdcard/目录一般没问题但如果要推到/data/local/tmp等系统目录可能需要adb root获取权限仅适用于userdebug或eng版本的设备。实战场景将测试用的资源包推送到设备adb push test_resources.zip /sdcard/Download/。adb sync一个比push更智能的命令。它会比较本地和设备文件的修改时间只同步有差异的文件适合同步大型项目或资源。但使用频率相对较低。3.4 Shell命令在设备内部“为所欲为”adb shell让你进入设备的Linux Shell环境这是ADB强大功能的源泉。你可以直接执行大部分Linux命令。直接执行单条命令adb shell command如adb shell ls /data。这是最常用的形式无需进入交互式Shell。进入交互式Shell直接输入adb shell。适合需要连续执行多条命令的复杂调试场景。常用Shell命令场景进程管理adb shell ps或adb shell ps -A查看所有进程。配合grep查找特定应用进程adb shell ps -A | grep com.example.app。adb shell kill PID结束进程。包与Activity信息adb shell dumpsys package 包名信息宝库。可以 dump 出应用的所有信息包括版本号、权限、Activity、Service、Receiver等组件详情。常用于查找Activity名。adb shell pm path 包名获取APK在设备上的安装路径。性能与调试adb shell top实时查看CPU、内存占用。adb shell dumpsys meminfo 包名查看指定应用详细的内存使用情况。adb shell dumpsys cpuinfo查看CPU负载。adb shell dumpsys battery查看电池状态甚至可以设置电量水平adb shell dumpsys battery set level 50用于测试低电量场景。输入模拟adb shell input text hello输入文本。adb shell input keyevent 键值模拟按键如KEYCODE_HOME3、KEYCODE_BACK4。adb shell input tap x y模拟点击adb shell input swipe x1 y1 x2 y2模拟滑动。这些是自动化测试的基石。3.5 日志抓取定位问题的眼睛adb logcat是开发调试的生命线。基础用法adb logcat。但这样会输出海量信息瞬间刷屏。高效过滤按标签和优先级过滤adb logcat -s TAG:Priority。如adb logcat -s MyApp:D只显示TAG为“MyApp”且优先级为Debug及以上D, I, W, E, F的日志。这是最常用的过滤方式。按进程ID过滤adb logcat --pidPID。当你已经知道应用进程ID时用这个最干净。按关键字过滤adb logcat | grep -i error或adb logcat | findstr errorWindows。清空与重定向adb logcat -c清空设备上的日志缓冲区。adb logcat -d log.txt将当前缓冲区所有日志一次性导出到文件然后退出。适合抓取崩溃瞬间的日志。adb logcat -f /sdcard/log.txt将日志持续写入设备文件。适合长时间稳定性测试。高级技巧按时间查看Android日志缓冲区是环形的旧日志会被覆盖。如果想抓取一个已经发生的崩溃可以尝试adb logcat -d -v time log.txt加上-v time参数每条日志会带有详细时间戳。更强大的工具是使用adb bugreport它会生成一个包含系统状态、所有日志包括开机日志、堆栈信息等的完整压缩包是分析复杂问题的核武器但文件较大。4. 高阶应用与组合技实战掌握了单条命令将它们组合起来就能解决更复杂的实际问题。4.1 自动化脚本的基石ADB命令可以很容易地写入Shell脚本或批处理文件实现自动化。场景一自动化安装测试#!/bin/bash # auto_test.sh APK_PATH./app-debug.apk PACKAGE_NAMEcom.example.myapp echo 1. 卸载旧应用... adb uninstall $PACKAGE_NAME echo 2. 安装新APK... adb install -t $APK_PATH if [ $? -eq 0 ]; then echo 安装成功 echo 3. 启动应用... adb shell am start -n $PACKAGE_NAME/.MainActivity echo 4. 等待2秒开始抓取日志... sleep 2 adb logcat -s MyApp:D | tee test_log.txt else echo 安装失败 exit 1 fi这个简单的脚本完成了从清理到安装、启动、抓日志的全流程。场景二批量设备操作如果你手头有10台测试机需要统一安装同一个APK手动操作是灾难。可以结合adb devices的输出进行循环#!/bin/bash for device in $(adb devices | grep device$ | awk {print $1}) do echo Processing device: $device adb -s $device install -r app.apk done注意grep device$是为了过滤掉头信息和unauthorized的设备。4.2 屏幕截图与录屏截图adb shell screencap -p /sdcard/screenshot.png然后adb pull /sdcard/screenshot.png。可以合成一条命令adb exec-out screencap -p screenshot.pngexec-out能直接输出二进制流效率更高。录屏adb shell screenrecord /sdcard/demo.mp4。默认录制180秒可按CtrlC停止。支持参数设置分辨率、码率、时间等。注意screenrecord需要Android 4.4以上且某些ROM可能移除此功能。4.3 端口转发与反向代理这是ADB非常强大的网络调试功能。端口转发Forward将设备上的某个端口映射到电脑的某个端口。adb forward tcp:本地端口 tcp:设备端口实战场景在电脑上调试设备内的WebView。设备内WebView服务运行在localhost:9222但电脑无法直接访问。执行adb forward tcp:9222 tcp:9222然后在电脑浏览器打开localhost:9222就能看到设备WebView的调试页面了。反向代理Reverse将电脑上的某个端口映射到设备的某个端口。与Forward方向相反。adb reverse tcp:设备端口 tcp:本地端口实战场景在电脑上运行一个开发服务器如React Native的Metro Bundler默认端口8081让设备上的应用能访问到。执行adb reverse tcp:8081 tcp:8081设备应用访问localhost:8081就等于访问电脑的8081端口。4.4 调用Activity Manager与Package Manageradb shell am(Activity Manager) 和adb shell pm(Package Manager) 是两大神器。启动Activityadb shell am start -n 包名/Activity全限定名。如何获取Activity名可以通过查看APK的AndroidManifest.xml或者更简单启动应用后执行adb shell dumpsys activity activities | grep mResumedActivity。发送广播adb shell am broadcast -a 广播Action还可以用--es附加额外数据。强制停止应用adb shell am force-stop 包名。比kill更彻底模拟了用户“强制停止”的操作。列出包adb shell pm list packages -f显示包名和APK路径-3只显示第三方应用。5. 常见问题排查与调试心得即使理解了原理和命令在实际操作中依然会遇到各种“坑”。这里记录一些典型问题和我的解决思路。5.1 设备连接类问题问题现象可能原因排查步骤与解决方案adb devices显示unauthorized设备未授权电脑的USB调试请求1. 检查设备屏幕是否弹出“允许USB调试吗”的对话框勾选“始终允许”后确定。2. 如果没弹出尝试重启ADB服务 (adb kill-serveradb start-server)或重插USB线。3. 检查开发者选项中的“USB调试”是否确实打开。adb devices显示offline设备与ADB服务器连接异常1.最常见原因设备端的adbd进程卡死。重启设备是最快方法。2. 重启电脑端的ADB服务器 (adb kill-server)。3. 更换USB线或USB接口劣质线缆可能只有充电功能。4. 对于模拟器尝试冷启动Cold Boot。设备列表为空无设备连接1. 确认USB已连接且开发者模式/USB调试已开启。2. 检查电脑USB驱动。在设备管理器中查看是否有未知设备或带叹号的Android设备。3. 运行adb usb尝试重新扫描USB设备。4. 对于Windows有时需要禁用驱动程序签名强制。Wi-Fi连接成功但命令无响应网络不稳定或防火墙阻止1. 确认电脑和设备在同一个局域网且无复杂的网络隔离。2. 尝试adb connect后立即执行adb shell看是否超时。3. 临时关闭电脑和设备的防火墙试试。5.2 命令执行类问题error: no devices/emulators found在执行任何命令前必须确保至少有一台设备在线 (device状态)。使用adb devices确认。error: more than one device/emulator连接了多台设备ADB不知道把命令发给谁。必须使用-s 序列号指定目标设备或者通过设置环境变量ANDROID_SERIAL来指定默认设备。Permission denied尝试访问设备上需要更高权限的目录或执行需要root的命令。如果是/data/data/等目录普通应用包括ADB Shell无权访问。需要设备是root或userdebug/eng版本的系统并执行adb root命令来获取root权限。注意绝大多数用户手机零售版无法获取此权限。如果是/sdcard/下的文件可能是SELinux策略限制。可以尝试adb disable-verity和adb remount同样需要特定系统版本但这会降低系统安全性仅用于开发测试设备。INSTALL_FAILED_INSUFFICIENT_STORAGE设备存储空间不足。清理设备空间或使用adb shell pm trim-caches size来清理缓存文件需要Android 8.0。adb shell进入后提示符是$而不是#$表示普通用户权限#表示root权限。如果你在userdebug设备上执行了adb root提示符应该会变成#。如果还是$可能是root授权失败或者设备本身不支持。5.3 性能与稳定性心得日志洪流的应对持续抓取全量日志 (adb logcat) 会占用大量CPU和I/O可能影响应用性能甚至掩盖一些性能问题。在性能测试或需要精确计时场景下应避免长时间开启全量日志。使用精确的过滤 (-s) 或按PID抓取。Wi-Fi调试的稳定性进行大量文件传输如安装大型游戏APK时优先使用USB。Wi-Fi调试下进行adb install大文件失败概率和耗时远高于USB。模拟器的特殊性对于Android Studio自带的AVD其ADB端口通常是emulator-5554、emulator-5556等偶数递增。有时AVD卡住ADB命令无响应可以尝试在AVD管理器中执行Cold Boot这比在设备内重启更彻底。脚本的健壮性在编写自动化脚本时不要假设每条ADB命令都能成功。一定要检查命令的返回值 ($?在Bash中)并对失败情况进行处理如重试、记录错误、退出脚本。ADB的强大在于它将一个复杂的嵌入式系统调试过程抽象成了一组可以通过命令行精确控制的接口。从简单的文件传输到深度的系统状态dump从单一的设备操作到大规模的集群管理它的潜力远超乎大多数人的日常所用。花时间深入理解其工作原理并熟练组合运用这些命令就像为你的安卓开发和测试工作装上了一套得心应手的“机械臂”能让你从重复、繁琐的机械操作中解放出来更专注于问题本身。下次当你再遇到棘手的调试场景时不妨先想想ADB这座“桥”能不能帮我过去
ADB调试桥:从原理到实战,掌握安卓设备高效调试核心技能
发布时间:2026/5/22 13:28:32
1. 项目概述从“黑盒”到“白盒”的调试桥梁在移动应用开发、测试乃至设备运维的日常工作中我们经常需要与手机或模拟器进行深度交互。无论是安装一个测试包、抓取一段崩溃日志还是模拟用户点击、查看当前运行的进程有一个工具几乎无处不在它就是ADB。很多开发者尤其是刚入行的朋友对ADB的印象可能停留在“一个用来安装APK和抓Log的命令行工具”。这固然没错但如果你只把它当作一个简单的“安装器”或“日志查看器”那就大大低估了它的威力也错过了许多能极大提升效率的可能性。ADB全称Android Debug Bridge即安卓调试桥。这个名字起得非常形象“桥”意味着连接与通信。它本质上是一个客户端-服务器架构的程序在你电脑客户端和安卓设备服务器端之间架起了一座稳定、高效的通信通道。我们日常在命令行里敲下的那些adb install、adb logcat其实只是这座桥上跑的各种“车辆”指令。理解这座“桥”本身是如何搭建、如何工作的远比死记硬背几个命令参数重要得多。它能让你在遇到“设备未连接”、“权限被拒绝”等问题时不再盲目尝试重启而是能精准地定位到是桥的哪一端出了问题。这篇文章我将从一个常年与各种“奇葩”设备和复杂测试场景打交道的测试开发角度为你拆解ADB命令背后的工作原理并分享那些真正高频、实用甚至能解决一些“疑难杂症”的命令使用技巧。无论你是应用开发、测试工程师还是对安卓系统感兴趣的技术爱好者掌握ADB的“道”与“术”都能让你的工作更加游刃有余。2. ADB工作原理深度解析不只是命令行要熟练使用ADB第一步是跳出“命令集合”的认知理解其底层的工作模型。很多人觉得ADB不稳定有时连得上有时连不上其根源大多在于对这套机制的不了解。2.1 核心架构客户端、服务器与守护进程的三方舞会ADB的架构清晰地分为三个部分它们协同工作完成了从你键入命令到设备执行结果的整个过程。客户端Client这就是你操作的终端。当你在命令行输入adb devices时你就是在运行ADB客户端。客户端的职责是解析你的命令并将其发送给ADB服务器。服务器Server这是一个在你电脑上后台运行的守护进程。当你第一次执行任何adb命令时它会自动启动通常运行在5037端口。它的角色是管理中心负责管理客户端与所有已连接设备包括USB连接的实体机和网络连接的设备/模拟器之间的连接。它维护着一个设备列表并将客户端的命令路由到正确的设备。守护进程Daemon - adbd这是在安卓设备或模拟器内部运行的一个后台服务。它是命令的最终执行者。当ADB服务器通过USB或网络将命令转发到设备后就由adbd来接收并执行它比如启动一个shell、推送文件或者转发端口。它们如何协作举个例子当你输入adb shell ls /sdcard客户端将shell ls /sdcard这个请求发送给本地服务器localhost:5037。服务器检查当前连接的设备。如果连接了多个设备你需要用-s指定否则服务器会默认选择第一个。服务器通过USB驱动或网络Socket将命令发送到目标设备的adbd。设备的adbd接收到命令在设备内部启动一个shell进程执行ls /sdcard然后将执行结果目录列表原路返回经由服务器最终显示在你的客户端终端上。注意很多“连接不上”的问题就出在这个链条上。可能是服务器进程卡死了需要adb kill-server然后adb start-server可能是设备的adbd进程挂了尤其在刷了某些非官方ROM的设备上也可能是USB驱动或网络配置不正确。2.2 连接方式详解USB与Wi-Fi的优劣与陷阱ADB提供了两种主要的连接方式各有适用场景和坑点。USB连接最传统、最稳定的方式。工作原理通过USB数据线建立物理连接。电脑端的ADB服务器通过USB驱动与设备的adbd通信。优点稳定、速度快特别是文件传输、无需网络环境。缺点受线缆长度限制同时管理多台设备时需要USB Hub且驱动问题频发尤其在Windows上。实操心得在Windows上如果设备管理器里你的安卓设备显示为“便携设备”或带有黄色叹号说明ADB驱动未正确安装。推荐使用官方Google USB Driver或使用第三方工具如“驱动精灵”识别安装。一个更简单的办法是安装一个完整的安卓模拟器如Nox、MuMu它们通常会自带并配置好ADB驱动和环境。Wi-Fi连接无线调试非常方便的远程调试方式。工作原理首先需要通过USB进行一次初始配对让设备获取到电脑的IP和端口信息。之后adbd会在设备上开启一个TCP/IP端口默认5555ADB服务器通过网络Socket与之通信然后就可以拔掉USB线了。常用命令# 1. 先用USB连接设备 adb devices # 确保设备已列出 # 2. 让设备在5555端口监听TCP/IP连接 adb tcpip 5555 # 3. 拔掉USB线连接到设备的IP adb connect 192.168.1.100:5555 # 断开无线连接 adb disconnect 192.168.1.100:5555优点摆脱线缆束缚可以同时连接多台设备且不受USB口数量限制方便对设备进行远程操作比如放在支架上做长时间稳定性测试。缺点与坑点速度慢文件传输、大量日志输出时明显不如USB。稳定性依赖网络Wi-Fi信号波动可能导致连接意外断开。最大的坑重启失效。设备重启后adbd的TCP/IP模式会重置需要重新用USB线执行adb tcpip 5555。这对于需要频繁重启的测试场景很不友好。安全风险如果设备IP暴露在公网且未设置认证理论上可能被他人连接。务必在可信的局域网内使用。个人经验我通常将Wi-Fi调试用于“静态”场景比如设备已经进入稳定测试阶段不需要频繁重启和刷机只需要偶尔查看日志或安装更新包。对于需要反复重启、刷写系统的开发调试前期强烈建议使用USB连接省心省力。3. 核心命令分类精讲与实战技巧理解了原理我们再来看看这座“桥”上能跑哪些“车”。ADB命令体系庞大但日常高频使用的可以归纳为几个核心类别。我将结合具体场景分享命令用法和背后的逻辑。3.1 设备与连接管理一切操作的基础这是所有ADB操作的起点确保你的命令能准确送达目标设备。adb devices最基础也最重要的命令。列出当前已连接的所有设备。List of devices attached emulator-5554 device 9A191FFBA000SF device第一列是设备的序列号Serial Number。模拟器通常是emulator-端口真机是硬件序列号。第二列是连接状态device已授权连接、offline设备未响应通常需重启adbd、unauthorized设备上未点击“允许USB调试”授权框。技巧当连接多台设备时必须在任何其他命令前用-s 序列号指定目标如adb -s 9A191FFBA000SF shell。adb connect/disconnect如前所述用于管理Wi-Fi连接。adb kill-server/adb start-server解决ADB相关问题的“万能重启大法”。当出现任何莫名其妙的连接问题、命令无响应时首先尝试adb kill-server结束后台进程再执行任何命令如adb devices会自动启动新服务器这能清除很多僵尸连接和状态缓存。3.2 应用包管理安装、卸载与数据清理这是测试人员每天重复次数最多的操作之一。adb install [-r] [-t] apk路径安装应用。-r替换已存在的应用保留数据。测试中极其常用用于安装新版测试包。-t允许安装测试APK。有些专为测试编译的包需要此参数。-d允许版本降级安装。实战场景adb install -r -t app-debug.apk。一条命令完成覆盖安装测试包。坑点安装失败常见错误码。INSTALL_FAILED_VERSION_DOWNGRADE版本降级加-dINSTALL_FAILED_UPDATE_INCOMPATIBLE签名不一致需先卸载旧版INSTALL_PARSE_FAILED_NO_CERTIFICATESAPK未签名。adb uninstall [-k] 包名卸载应用。-k卸载应用但保留数据和缓存目录。这在测试中非常有用比如你想测试一个全新安装的场景但又不想丢失之前配置好的测试数据如登录态、数据库可以先普通卸载再用-k卸载一次不逻辑是普通卸载会清除数据而-k是当你需要保留数据时才用。更常见的测试场景是彻底清理。所以通常我们不用-k。如何获取包名adb shell pm list packages列出所有包或用adb shell pm list packages | grep keyword过滤。adb shell pm clear 包名神级命令。它清除应用的所有用户数据/data/data/包名和缓存/data/cache效果相当于在系统设置里点击“清除数据”和“清除缓存”但更快、可脚本化。在自动化测试中常用于将应用状态重置到初次启动保证测试用例的独立性。3.3 文件传输不只是push和pulladb push 本地路径 设备路径/adb pull 设备路径 [本地路径]基本的文件上传下载。技巧1目录操作。ADB支持整个目录的推送和拉取非常方便。技巧2处理权限。推送到/sdcard/目录一般没问题但如果要推到/data/local/tmp等系统目录可能需要adb root获取权限仅适用于userdebug或eng版本的设备。实战场景将测试用的资源包推送到设备adb push test_resources.zip /sdcard/Download/。adb sync一个比push更智能的命令。它会比较本地和设备文件的修改时间只同步有差异的文件适合同步大型项目或资源。但使用频率相对较低。3.4 Shell命令在设备内部“为所欲为”adb shell让你进入设备的Linux Shell环境这是ADB强大功能的源泉。你可以直接执行大部分Linux命令。直接执行单条命令adb shell command如adb shell ls /data。这是最常用的形式无需进入交互式Shell。进入交互式Shell直接输入adb shell。适合需要连续执行多条命令的复杂调试场景。常用Shell命令场景进程管理adb shell ps或adb shell ps -A查看所有进程。配合grep查找特定应用进程adb shell ps -A | grep com.example.app。adb shell kill PID结束进程。包与Activity信息adb shell dumpsys package 包名信息宝库。可以 dump 出应用的所有信息包括版本号、权限、Activity、Service、Receiver等组件详情。常用于查找Activity名。adb shell pm path 包名获取APK在设备上的安装路径。性能与调试adb shell top实时查看CPU、内存占用。adb shell dumpsys meminfo 包名查看指定应用详细的内存使用情况。adb shell dumpsys cpuinfo查看CPU负载。adb shell dumpsys battery查看电池状态甚至可以设置电量水平adb shell dumpsys battery set level 50用于测试低电量场景。输入模拟adb shell input text hello输入文本。adb shell input keyevent 键值模拟按键如KEYCODE_HOME3、KEYCODE_BACK4。adb shell input tap x y模拟点击adb shell input swipe x1 y1 x2 y2模拟滑动。这些是自动化测试的基石。3.5 日志抓取定位问题的眼睛adb logcat是开发调试的生命线。基础用法adb logcat。但这样会输出海量信息瞬间刷屏。高效过滤按标签和优先级过滤adb logcat -s TAG:Priority。如adb logcat -s MyApp:D只显示TAG为“MyApp”且优先级为Debug及以上D, I, W, E, F的日志。这是最常用的过滤方式。按进程ID过滤adb logcat --pidPID。当你已经知道应用进程ID时用这个最干净。按关键字过滤adb logcat | grep -i error或adb logcat | findstr errorWindows。清空与重定向adb logcat -c清空设备上的日志缓冲区。adb logcat -d log.txt将当前缓冲区所有日志一次性导出到文件然后退出。适合抓取崩溃瞬间的日志。adb logcat -f /sdcard/log.txt将日志持续写入设备文件。适合长时间稳定性测试。高级技巧按时间查看Android日志缓冲区是环形的旧日志会被覆盖。如果想抓取一个已经发生的崩溃可以尝试adb logcat -d -v time log.txt加上-v time参数每条日志会带有详细时间戳。更强大的工具是使用adb bugreport它会生成一个包含系统状态、所有日志包括开机日志、堆栈信息等的完整压缩包是分析复杂问题的核武器但文件较大。4. 高阶应用与组合技实战掌握了单条命令将它们组合起来就能解决更复杂的实际问题。4.1 自动化脚本的基石ADB命令可以很容易地写入Shell脚本或批处理文件实现自动化。场景一自动化安装测试#!/bin/bash # auto_test.sh APK_PATH./app-debug.apk PACKAGE_NAMEcom.example.myapp echo 1. 卸载旧应用... adb uninstall $PACKAGE_NAME echo 2. 安装新APK... adb install -t $APK_PATH if [ $? -eq 0 ]; then echo 安装成功 echo 3. 启动应用... adb shell am start -n $PACKAGE_NAME/.MainActivity echo 4. 等待2秒开始抓取日志... sleep 2 adb logcat -s MyApp:D | tee test_log.txt else echo 安装失败 exit 1 fi这个简单的脚本完成了从清理到安装、启动、抓日志的全流程。场景二批量设备操作如果你手头有10台测试机需要统一安装同一个APK手动操作是灾难。可以结合adb devices的输出进行循环#!/bin/bash for device in $(adb devices | grep device$ | awk {print $1}) do echo Processing device: $device adb -s $device install -r app.apk done注意grep device$是为了过滤掉头信息和unauthorized的设备。4.2 屏幕截图与录屏截图adb shell screencap -p /sdcard/screenshot.png然后adb pull /sdcard/screenshot.png。可以合成一条命令adb exec-out screencap -p screenshot.pngexec-out能直接输出二进制流效率更高。录屏adb shell screenrecord /sdcard/demo.mp4。默认录制180秒可按CtrlC停止。支持参数设置分辨率、码率、时间等。注意screenrecord需要Android 4.4以上且某些ROM可能移除此功能。4.3 端口转发与反向代理这是ADB非常强大的网络调试功能。端口转发Forward将设备上的某个端口映射到电脑的某个端口。adb forward tcp:本地端口 tcp:设备端口实战场景在电脑上调试设备内的WebView。设备内WebView服务运行在localhost:9222但电脑无法直接访问。执行adb forward tcp:9222 tcp:9222然后在电脑浏览器打开localhost:9222就能看到设备WebView的调试页面了。反向代理Reverse将电脑上的某个端口映射到设备的某个端口。与Forward方向相反。adb reverse tcp:设备端口 tcp:本地端口实战场景在电脑上运行一个开发服务器如React Native的Metro Bundler默认端口8081让设备上的应用能访问到。执行adb reverse tcp:8081 tcp:8081设备应用访问localhost:8081就等于访问电脑的8081端口。4.4 调用Activity Manager与Package Manageradb shell am(Activity Manager) 和adb shell pm(Package Manager) 是两大神器。启动Activityadb shell am start -n 包名/Activity全限定名。如何获取Activity名可以通过查看APK的AndroidManifest.xml或者更简单启动应用后执行adb shell dumpsys activity activities | grep mResumedActivity。发送广播adb shell am broadcast -a 广播Action还可以用--es附加额外数据。强制停止应用adb shell am force-stop 包名。比kill更彻底模拟了用户“强制停止”的操作。列出包adb shell pm list packages -f显示包名和APK路径-3只显示第三方应用。5. 常见问题排查与调试心得即使理解了原理和命令在实际操作中依然会遇到各种“坑”。这里记录一些典型问题和我的解决思路。5.1 设备连接类问题问题现象可能原因排查步骤与解决方案adb devices显示unauthorized设备未授权电脑的USB调试请求1. 检查设备屏幕是否弹出“允许USB调试吗”的对话框勾选“始终允许”后确定。2. 如果没弹出尝试重启ADB服务 (adb kill-serveradb start-server)或重插USB线。3. 检查开发者选项中的“USB调试”是否确实打开。adb devices显示offline设备与ADB服务器连接异常1.最常见原因设备端的adbd进程卡死。重启设备是最快方法。2. 重启电脑端的ADB服务器 (adb kill-server)。3. 更换USB线或USB接口劣质线缆可能只有充电功能。4. 对于模拟器尝试冷启动Cold Boot。设备列表为空无设备连接1. 确认USB已连接且开发者模式/USB调试已开启。2. 检查电脑USB驱动。在设备管理器中查看是否有未知设备或带叹号的Android设备。3. 运行adb usb尝试重新扫描USB设备。4. 对于Windows有时需要禁用驱动程序签名强制。Wi-Fi连接成功但命令无响应网络不稳定或防火墙阻止1. 确认电脑和设备在同一个局域网且无复杂的网络隔离。2. 尝试adb connect后立即执行adb shell看是否超时。3. 临时关闭电脑和设备的防火墙试试。5.2 命令执行类问题error: no devices/emulators found在执行任何命令前必须确保至少有一台设备在线 (device状态)。使用adb devices确认。error: more than one device/emulator连接了多台设备ADB不知道把命令发给谁。必须使用-s 序列号指定目标设备或者通过设置环境变量ANDROID_SERIAL来指定默认设备。Permission denied尝试访问设备上需要更高权限的目录或执行需要root的命令。如果是/data/data/等目录普通应用包括ADB Shell无权访问。需要设备是root或userdebug/eng版本的系统并执行adb root命令来获取root权限。注意绝大多数用户手机零售版无法获取此权限。如果是/sdcard/下的文件可能是SELinux策略限制。可以尝试adb disable-verity和adb remount同样需要特定系统版本但这会降低系统安全性仅用于开发测试设备。INSTALL_FAILED_INSUFFICIENT_STORAGE设备存储空间不足。清理设备空间或使用adb shell pm trim-caches size来清理缓存文件需要Android 8.0。adb shell进入后提示符是$而不是#$表示普通用户权限#表示root权限。如果你在userdebug设备上执行了adb root提示符应该会变成#。如果还是$可能是root授权失败或者设备本身不支持。5.3 性能与稳定性心得日志洪流的应对持续抓取全量日志 (adb logcat) 会占用大量CPU和I/O可能影响应用性能甚至掩盖一些性能问题。在性能测试或需要精确计时场景下应避免长时间开启全量日志。使用精确的过滤 (-s) 或按PID抓取。Wi-Fi调试的稳定性进行大量文件传输如安装大型游戏APK时优先使用USB。Wi-Fi调试下进行adb install大文件失败概率和耗时远高于USB。模拟器的特殊性对于Android Studio自带的AVD其ADB端口通常是emulator-5554、emulator-5556等偶数递增。有时AVD卡住ADB命令无响应可以尝试在AVD管理器中执行Cold Boot这比在设备内重启更彻底。脚本的健壮性在编写自动化脚本时不要假设每条ADB命令都能成功。一定要检查命令的返回值 ($?在Bash中)并对失败情况进行处理如重试、记录错误、退出脚本。ADB的强大在于它将一个复杂的嵌入式系统调试过程抽象成了一组可以通过命令行精确控制的接口。从简单的文件传输到深度的系统状态dump从单一的设备操作到大规模的集群管理它的潜力远超乎大多数人的日常所用。花时间深入理解其工作原理并熟练组合运用这些命令就像为你的安卓开发和测试工作装上了一套得心应手的“机械臂”能让你从重复、繁琐的机械操作中解放出来更专注于问题本身。下次当你再遇到棘手的调试场景时不妨先想想ADB这座“桥”能不能帮我过去