简介:这是面向Android开发者及手机维修、刷机用户的ADB命令行工具包,解决设备调试、文件传输、应用部署以及忘记锁屏密码时的解锁管理需求。压缩包共23个文件,以adb.exe、fastboot.exe等9个exe可执行程序为主,另含7个bat批处理脚本、3个dll动态库及使用说明,整体仅1.88MB,小巧实用。已有19047人学习下载。工具集成了设备连接、shell指令执行、logcat日志抓取、模拟点击输入等完整调试能力,并预置解锁相关批处理脚本,可帮助开发者快速完成APK部署、性能监控与自动化测试,也能在设备异常时执行恢复操作。目录按功能分类存放,结构简洁易检索,既适合有经验的工程师提升日常调试效率,也适合初学者通过动手实操快速掌握ADB常用命令。
1. adb 工具包不是黑匣子:先弄清楚它能替你干什么
手机刷机、电视盒子改设置、自动化测试脚本跑不起来,这些场景背后几乎都会出现同一个名字——adb工具包。它就是 Android Debug Bridge 的命令行合集,一头连着电脑,一头连着安卓设备,所有需要手动点屏幕完成的调试动作,都能用一行命令替你做掉。它的价值不在于单条命令有多酷,而在于把「连接、传输、执行、截图」这四类高频操作压缩成可复现的脚本,适合做安卓开发调试、真机自动化测试、设备批量管理的人。读完这篇文章,你装得上、连得通、跑得顺,也知道哪些坑值得绕开。
2. 装好 adb 工具包的最小路径:三个平台的环境准备与验证
2.1 只装 platform-tools 而不是全家桶:省掉一半麻烦
很多人第一次听说 adb 工具包,是照着刷机教程去下载一个「安卓驱动包」,结果装上之后反而连不上设备。我这里说的工具包,指的是 Android SDK 里的 platform-tools 组件,Google 官方把它单独打包发布,压缩包只有几十兆,解压之后就能看到 adb、fastboot 两个可执行文件,以及少量依赖库。它不依赖 Android Studio 也能独立运行,这是它适合当「轻量生产工具」的根本原因。
我给你的建议是:不要为了用 adb 去装整个 Android Studio。IDE 会顺便带一堆 Gradle、JVM、SDK Manager 的东西,环境变量里动辄五六个路径,等到 adb devices 连不上时,你很难分清是驱动问题、端口问题还是 SDK 版本互相打架。只保留 platform-tools,把它的路径单独加进 PATH,以后排查问题就是孤立的 adb 本身,别人没法甩锅。
提示:这里说的「驱动」在 Windows 上偶尔需要单独处理,但大多数现代手机用系统自带驱动就够了,先别急着装各种助手的驱动包,它们往往顺手改掉你的 PATH 和 adb 版本。
从命令行的角度理解 adb 的全貌,它会在本地启动一个 server,默认监听 5037 端口,所有连接的调度都走这个进程。所以「连接设备」这个动作的本质,是让 adb server 和设备里的 adbd 守护进程建立通道,而不是你在终端里直接去 ping 设备。想清楚这一点,后面遇到端口占用和设备 offline 时,你会第一时间去看 server 状态,而不是怀疑数据线坏了。
2.2 环境变量与版本验证:adb version 到底在看什么
无论 Windows、macOS 还是 Linux,原理都一样:让系统能在任意目录找到 adb 这个可执行文件。Windows 上常见的做法是把 platform-tools 解压到 C:\adb 或 D:\tools\platform-tools,然后把目录写进用户环境变量的 Path;macOS 和 Linux 通常解压到 ~/platform-tools,通过 ~/.zshrc 或 ~/.bashrc 追加 export PATH。下面这段覆盖两个平台的配置和验证:
# Windows PowerShell 里临时配置(只对当前窗口生效) $env:Path += ";C:\adb\platform-tools" # Linux / macOS 写入 shell 配置文件,永久生效 echo 'export PATH=$PATH:~/platform-tools' >> ~/.bashrc source ~/.bashrc # 验证版本,能打印出版本号说明 PATH 配好了 adb versionadb version 的输出通常包含三行:Android Debug Bridge version、Version 数字,以及一个 Installed as 的路径。重点检查末尾这个路径,它指向的可执行文件必须是刚才解压的那份。我踩过这样的坑:电脑上装了某个手机厂商的助手软件,它自己带了一个旧版 adb,PATH 里排在前面,结果 adb version 打出来的是三四年前的版本,部分新命令根本不认识。
确认版本之后,插上设备执行 adb devices,第一次运行时终端会提示 starting server 或 daemon starts,这是正常的。如果输出列表里有一行 device,说明通道建立成功;如果看到 offline、unauthorized 或 no permissions,那是第 5 章要解决的问题,这里先不展开。注意 adb devices 只负责报告状态,不负责诊断,它输出的每一列都有含义:第一列是序列号,第二列是状态码。
2.3 开启 USB 调试:开发者选项里的那个开关为什么这么重要
安卓系统默认不允许电脑通过 USB 查看文件之外的东西,连 adb 这种调试通道也一样要显式授权。开启入口在「设置」→「关于手机」→ 连点「版本号」7 次,系统会提示已进入开发者模式,返回上一层就能看到「开发者选项」。这个入口在国产 ROM 上大同小异,有的藏在「更多设置」里,但连点版本号的触发逻辑保留了下来。
关键点在于,手机每次连接新电脑时,屏幕上会弹出一个「是否允许 USB 调试」的对话框,上面有一串 RSA 指纹。这个指纹不是摆设,它是设备端和电脑端互相确认身份用的密钥指纹。如果勾选了「始终允许」,指纹会写进手机里的 /data/misc/adb/adb_keys,以后同一台电脑直连不再询问。这也是为什么换电脑后第一次连接总会慢半拍。
# 查看当前 adb server 是否在运行 adb start-server # 查看设备列表;状态列是 device 才算连上 adb devices -l # 如果看到 device,确认当前默认选的设备序列号 adb get-serialno这三条是环境自检的基本动作。adb start-server 用于手动拉起 server,通常在端口冲突或假死时用;adb devices -l 会多显示型号和设备类型,方便区分同品牌多台设备;adb get-serialno 用来确认当前默认设备是哪一台,配合 -s 参数可以做到指哪打哪。Linux 用户如果插上设备后 adb devices 里显示 no permissions,多半是缺少 udev 规则,需要把设备的 USB vendor id 写进 /etc/udev/rules.d/ 下的规则文件,这也是新手最容易卡住的第一个无提示故障。
3. 高频 adb 命令拆解:包管理、文件传输与输入模拟的边界
3.1 包管理三件套:install、uninstall、pm list
手工在手机上装 APK,要么拷进手机再点击安装,要么通过应用市场推送,这两条路在批量场景下都太慢。adb install 的价值是让安装动作完全由电脑控制,而且能拿到明确的退出码来判断成功还是失败。常见用法是 adb install 后跟一个本地 APK 路径,如果设备里已经装了旧版本,需要加 -r 参数覆盖安装;测试机装了比当前更低的版本时,默认会被拒绝,加 -d 可以强制降级。
# 覆盖安装并保留数据 adb install -r app-release.apk # 降级安装(测试机上很常用) adb install -d app-debug.apk # 安装到 sdcard 并用 -g 预授权运行时权限 adb install -s -g app-debug.apk # 卸载某个包;包名不是应用名,要看 package 字段 adb uninstall com.example.demo参数 -r 和 -d 是我用得最多的两个:-r 应对「已存在」报错,-d 应对「版本号比当前低」的拒绝。-s 是安装到外部存储,适合存储空间紧张的旧设备;-g 在 Android 6.0 以上系统里会自动授予运行时权限,自动化测试时能省掉一遍手动点授权的操作。这里要特别强调包名,很多新手把应用名当成包名,结果卸载时报 Unknown package。拿包名的方法是执行 adb shell pm list packages 然后 grep 关键字。
pm list 本身也是一座富矿。adb shell pm list packages -3 列出第三方应用,-e 列出已启用应用,-d 列出已禁用应用。我常配合使用 pm clear 来清理应用数据,它相当于把应用恢复到刚安装的状态,比手动进设置里清缓存快得多,自动化测试的用例隔离基本靠它:
# 清除指定应用的全部数据,等价于设置里的「清除存储」 adb shell pm clear com.example.demo # 强制停止应用,释放前后台进程 adb shell am force-stop com.example.demopm clear 和 am force-stop 经常成对出现:先停掉进程,再清数据,能避免应用在后台重新拉起自己。注意 pm clear 不需要 root,但对系统预装应用可能失败,报 SecurityException,这是正常限制。在执行这些命令前,最好先确认包名存在,用 pm list packages 过滤一遍,否则会浪费一次 adb 往返。
3.2 文件双向传输:push 与 pull 的权限边界
adb push 和 adb pull 用于在电脑与设备之间搬运文件,权限边界和 Linux 文件系统一致,这一点经常被忽略。push 到 /sdcard/ 基本畅通无阻,因为这是普通用户可写的公共存储区;如果试图 push 到 /data/app 这类系统目录,就会直接报 Permission denied。pull 也是同理,拉取 /sdcard 下的文件没问题,拉取 /data/data 下的私有数据会被拒绝。
# 把本地文件推到设备公共存储区 adb push ./test.apk /sdcard/Download/ # 从设备拉取日志到电脑 adb pull /sdcard/logcat.txt ./logs/ # 以 root 身份写入系统目录(仅限 root 过的设备) adb root adb remount adb push ./hosts /system/etc/hostsadb root 这一行要谨慎使用,它会把 adbd 以 root 权限重启,不是所有设备都支持,厂商 ROM 通常会屏蔽。adb remount 则是把 /system 分区从只读改成可写,前提是设备已解锁并允许修改系统分区。三条命令连起来是替换 hosts、植入证书的经典路径,但做之前最好确认有没有后悔药——adb root 之后某些安全机制会失效,刷机包也会校验分区完整性,改错了可能开不了机。
另一种搬运姿势是用 exec-out 直接输出字节流,适合在电脑端处理设备里的文件,省掉中间存储:
# 把设备上的截图直接输出到电脑,不落设备存储 adb exec-out screencap -p > screen.png这个命令在 Windows PowerShell 下有个坑:PowerShell 的重定向会按文本模式处理,破坏 PNG 二进制流,导致文件打不开。解决办法是用 cmd /c 执行重定向,或者用 adb shell screencap -p /sdcard/tmp.png 先存设备再 pull。exec-out 适合传小文件,传大文件时建议老老实实用 pull,因为 exec-out 没有断点续传和进度提示。
3.3 截屏录屏与输入模拟:自动化测试的底料
手动测试「证据留档」最笨的办法是拿手机截图再通过数据线拷出来。用 adb 做这件事只需要一行,而且可以精确控制文件命名,批量跑用例时也不会漏图。配合 input 命令,就能拼出一套不依赖 Appium 的轻量自动化方案,适合做冒烟测试和弹窗巡检。
# 截图并直接拉回电脑,一行完成 adb exec-out screencap -p > screen_$(date +%H%M%S).png # 录屏 10 秒,输出到设备公共目录 adb shell screenrecord --time-limit 10 /sdcard/demo.mp4 adb pull /sdcard/demo.mp4 . # 模拟点击和滑动,坐标按屏幕实际像素算 adb shell input tap 540 1200 adb shell input swipe 540 1600 540 400 300 # 模拟按键:电源键、返回键、Home 键 adb shell input keyevent 26 adb shell input keyevent 4 adb shell input keyevent 3screencap 配合 exec-out 输出的是 PNG 原始字节流,重定向到本地文件即可,比先存设备再 pull 少一次写盘。screenrecord 的 --time-limit 默认上限是 180 秒,超过会自动停止,录制格式是 mp4,体积偏大,建议录完立刻 pull 走。input tap 的坐标来自屏幕分辨率而非 dp,所以换设备后必须重新取坐标,否则点击位置会偏移,这也是脚本从一个机型迁移到另一个机型时最常见的翻车点。
keyevent 的数字键值对应是不固定的,26 是电源键、4 是返回、3 是 Home,具体键值表可以在官方文档里查,但我更推荐用 adb shell input keyevent KEYCODE_POWER 这种命名形式,可读性更高。输入事件还有个隐蔽的坑:部分设备开了「屏幕自动旋转」或「手势导航」后,swipe 手势会被系统手势拦截,导致事件没到达目标应用,跑自动化时先关掉系统手势导航能省去很多莫名其妙。
4. 无线调试与多设备并行:把 adb 工具包用出效率
4.1 无线连接的两种姿势:从 USB 到 Wi-Fi 的切换
当设备不方便插线时——比如电视盒子放在柜子里,或者测试机在远处的机架上,无线调试就是解药。前提是电脑和设备在同一局域网内,且能互相访问。无线调试有两种姿势:一种是通过一条 USB 线临时打开监听端口,之后拔线使用;另一种是 Android 11 以上系统自带的无线调试配对,完全不需要 USB,适合手头没有数据线但设备就在身边的场景。
# 先通过 USB 让设备监听 5555 端口 adb tcpip 5555 # 拔掉 USB,改用 IP 连接 adb connect 192.168.1.100:5555 # 断开无线连接 adb disconnect 192.168.1.100:5555adb tcpip 5555 这条命令值得多说几句:它只是让设备上的 adbd 开始监听网络端口,并不会让设备自动寻找电脑。之后必须用 connect 主动发起连接,IP 地址可以通过路由器后台的设备列表查,也可以在设备「设置 → 关于手机 → 状态」里看。如果 connect 返回 connected,adb devices 里会多出一行以 IP 加端口为序列号的设备。无线连接在传输大文件时速度受限于 Wi-Fi,5GHz 频段比 2.4GHz 稳很多,这算是一个从实践中得来的选型经验。
Android 11 及以上的设备,可以在「开发者选项 → 无线调试」里直接开启,然后用配对码方式连接,不需要 USB:
# 设备无线调试界面会给出一个 IP 和端口,以及 6 位配对码 adb pair 192.168.1.100:37000 # 按提示输入配对码,成功后自动连接配对端口是设备上随机生成的临时端口,和设备连接用的 5555 端口不是一回事,不要混用。配对成功后,如果 IP 变了或服务重启,需要重新 connect,但不会要求重新配对。这个特性在国产 ROM 上的入口位置可能不同,有的藏在「更多连接方式」里,找不到就优先用 USB 方式,稳定第一。
4.2 多设备管理:-s 参数和序列号是唯一的钥匙
手头超过一台设备时,adb 默认会连接当前可见的唯一设备;如果接了两台以上,它会直接报错 or more devices,拒绝执行任何操作。这时候必须用 -s 参数明确指定目标设备的序列号,序列号可以通过 adb devices 查看,通常是 USB 端口号或 IP 加端口组成的字符串。命名不友好是常态,但它是唯一标识,脚本里不要依赖顺序,要依赖序列号。
# 列出所有设备,留意第一列的序列号 adb devices -l # 对指定设备执行安装 adb -s 192.168.1.101:5555 install app.apk # 对所有在线设备执行同一条命令(bash 循环) for dev in $(adb devices | awk 'NR>1 && $2=="device"{print $1}'); do adb -s "$dev" shell input keyevent 26 done上面这个循环里,awk 提取了 adb devices 输出中状态为 device 的所有序列号,对每一台设备执行一次电源键事件,相当于同时锁屏。这是多设备巡检的常用写法,但要注意 adb server 是串行处理请求的,循环本质上是逐个执行,不要期待并行加速。如果需要严格并行,可以把命令放到后台用 wait 聚合,或者用 xargs -P 限制并发数,否则几十台设备会瞬间把你的电脑 CPU 打满。
多设备场景还经常用到端口转发。adb forward 把设备的某个端口映射到电脑本地端口,常用于让电脑直接访问设备内的服务;adb reverse 则反过来,让设备能访问电脑上的端口,本地起 mock server 时特别好用:
# 电脑访问 http://localhost:8080 等于访问设备内的 8080 adb forward tcp:8080 tcp:8080 # 设备内访问 http://localhost:9000 等于访问电脑的 9000 adb reverse tcp:9000 tcp:9000reverse 在自动化测试里价值很大:App 里的接口地址指向 localhost:9000,电脑端跑着 mock 服务,手机不用改任何配置就能把请求打到电脑上。注意 forward 和 reverse 都是单设备绑定,多设备时要先 -s 指定设备再执行,否则绑定到默认设备上,其他设备会连接失败。
5. adb 工具包踩坑实录:现象、原因、解法
5.1 设备一直 offline 或 unauthorized,授权弹窗也不出现
现象:adb devices 里状态一直停在 offline 或 unauthorized,电脑上没有任何授权确认框弹出。
原因:常见的有三种。一是之前弹窗时误点了拒绝,授权状态没写进 adb_keys;二是手机里存了旧电脑的 RSA 指纹,而电脑换了新的公私钥对;三是部分定制 ROM 的开发者选项里还需要额外打开「USB 调试(安全设置)」这一项。
解决:先在手机上撤销所有 USB 调试授权,位置在开发者选项里的「撤销 USB 调试授权」,然后拔插数据线,重新触发弹窗并勾选始终允许。如果还不行,删掉电脑端用户目录下 .android/adbkey 和 adbkey.pub 这对文件,重启 adb server,让系统重新生成配对密钥。
# 删除旧密钥后重启 server,让配对重新开始 rm -f ~/.android/adbkey ~/.android/adbkey.pub adb kill-server adb start-server adb devices这个操作会清掉这台电脑上所有设备的授权记录,属于比较重的处理方式,但往往一次就见效。执行完后手机会再次弹授权框,这次记得勾选「始终允许」。如果设备连弹窗都不出现,优先检查数据线是否是「纯充电线」,这种线没有数据通路,是 offline 问题的第一大嫌疑。
5.2 adb server 端口被占或假死
现象:执行任何 adb 命令都长时间卡住,或者报 error: could not install smartsocket listener, cannot bind 5037。
原因:5037 端口被其他程序占用,最常见的是各种手机助手自带的 adb.exe,或者之前异常退出留下的僵尸进程。server 假死则常见于电脑休眠唤醒后,USB 事件把 server 的监听状态搞乱了,表现为 adb devices 卡在 starting server 不返回。
解决:先把占用端口的进程揪出来,确认不是自己项目里的进程后直接结束它,再重启 server。这里是 Windows 和 Linux/macOS 两条路径。
# Windows 下找到占用 5037 的进程并结束 netstat -ano | findstr 5037 taskkill /F /PID <pid> # Linux / macOS 下类似 lsof -i :5037 kill -9 <pid> # 干净地重启 server adb kill-server adb start-server这个问题的根因往往是电脑上装了不只一个 adb 版本,比如独立 platform-tools 和手机助手各有一份。建议做完 2.2 节的版本检查后,把手机助手的 adb 相关服务关闭,或者卸载掉助手里用不到的部分。重启 server 之后重新执行 adb devices,如果还是卡住,考虑重启电脑,休眠导致的 USB 栈异常有时候比想象中顽固。
5.3 shell 用户权限不足:/data 目录进不去
现象:adb shell 后 cd /data 能进去,但 ls /data/data 报 permission denied,运行某些命令也提示 not allowed。
原因:adbd 默认以 shell 用户运行,这个用户对 /data/data 目录没有读权限,这是安卓的安全机制设计,不是 bug。很多教程里写的「adb shell 后进入 data 目录修改文件」对非 root 设备根本不成立,跟着走只会撞墙。
解决:按场景选方案。普通调试场景用 run-as 以应用身份读取它自己的私有目录;如果是整体备份,需要设备已 root,然后执行 adb root 让 adbd 提权。
# 以应用身份进入该应用自己的数据目录 adb shell run-as com.example.demo ls files/ # 设备已 root 时,直接提权执行 adb root adb shell ls /data/data/com.example.demorun-as 只对 debuggable 的应用有效,正式签名包会报 run-as: package not debuggable。这时候唯一的路径是 root,或者通过备份命令 adb backup 导出应用数据,再解析备份包。注意 adb backup 在 Android 12 以上基本被移除了,老办法要跟着系统版本迭代,不能一条路走到黑。
5.4 USB 连接反复断开,传大文件时中断
现象:小命令执行正常,但 adb install 大 APK 或 pull 大文件时,进度条到一半就报 device not found 或 lost connection。
原因:最常见的是 USB 线质量问题,尤其那种几块钱的充电线,数据触点不稳定,高速传输时丢包严重;其次是电脑 USB 口的供电不足,前置面板的接口尤其容易出问题。
解决:换一根短一点、带屏蔽层的品牌数据线,尽量插在主板后置 USB 口。如果问题只在高速传输时出现,可以在设备端关闭屏幕省电模式,或者改用无线调试绕开物理链路。大文件传输前先执行 adb devices 确认状态,传完后用 adb shell ls -l 核对文件大小是否一致,防止传输中断造成的半截文件。
5.5 安装报 INSTALL_FAILED_UPDATE_INCOMPATIBLE 或签名冲突
现象:adb install -r 更新一个已有应用时,报 INSTALL_FAILED_UPDATE_INCOMPATIBLE,或者提示 Update application is not compatible。
原因:设备上已安装的旧包与当前 APK 签名不一致,通常是同一个包名用了不同的签名证书。还有一种是旧包是系统预装应用,普通安装流程不允许覆盖。
解决:先确认旧包的签名信息,再用卸载重装的方式替换。注意卸载会清空数据,测试前先确认不依赖旧数据。
# 查看设备上已安装应用的实际包名 adb shell pm list packages | grep example # 卸载后再装 adb uninstall com.example.demo adb install app-release.apk如果这个包是系统应用卸载不掉,需要 root 后 pm uninstall -k --user 0 来卸载当前用户的应用副本。签名冲突在 CI 环境里很常见:测试包和发布包用的签名不同,脚本里如果保留了 -r 参数,会以报错收场。建议在部署脚本里先 pm list packages 检查包是否存在,存在就先卸载再安装,而不是盲目 -r。
6. 把 adb 工具包脚本化:两个能直接用的模板与一个验证习惯
6.1 批量安装与巡检模板
#!/usr/bin/env bash # 用法:./deploy.sh <apk 路径> set -e APK="$1" for serial in $(adb devices | awk 'NR>1 && $2=="device"{print $1}'); do adb -s "$serial" install -r "$APK" echo "deployed to $serial" done这段脚本把「枚举在线设备、逐个安装」串起来,适合自动化回归前给多台测试机装同一版本。set -e 保证任一步失败就退出,否则脚本会带着错误状态继续跑,直到最后才发现某个设备没装上。
6.2 日志抓取模板
#!/usr/bin/env bash # 清旧日志、开始新日志采集、回放操作后收尾 adb logcat -c adb logcat > log_$(date +%F_%H%M).txt & LOGCAT_PID=$! sleep 5 adb shell input keyevent 82 # 激活屏幕 sleep 10 kill $LOGCAT_PID grep -E "FATAL|Exception" log_*.txt | head -50logcat -c 先清空缓冲区,避免混入历史日志;采集结束后 grep 关键字,能快速定位崩溃现场。注意 logcat 缓冲区有限,长时间采集必须分段轮转,否则早期日志会被覆盖。
6.3 一个验证习惯
我习惯每次拿到新电脑或新设备时,先用 adb devices -l 确认连接状态,再执行一条无害命令比如 adb get-serialno 验证通道可用,之后才开始正式操作。跑完脚本再对照退出码检查一遍,而不是只看终端里的中文提示,这套流程帮我多次避免了「明明连上了却没生效」的翻车。希望这件事也能成为你的固定动作,它值得成为你调试工作流里的最后一道保险,希望帮到你。
本文还有配套的精品资源,点击获取