ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

adb工具包完全指南:安装、高频命令与调试实战

adb工具包完全指南:安装、高频命令与调试实战 简介这是面向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然后把目录写进用户环境变量的 PathmacOS 和 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 的路径。重点检查末尾这个路径它指向的可执行文件必须是刚才解压的那份。我踩过这样的坑电脑上装了某个手机厂商的助手软件它自己带了一个旧版 adbPATH 里排在前面结果 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 返回 connectedadb devices 里会多出一行以 IP 加端口为序列号的设备。无线连接在传输大文件时速度受限于 Wi-Fi5GHz 频段比 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 NR1 $2device{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 NR1 $2device{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 验证通道可用之后才开始正式操作。跑完脚本再对照退出码检查一遍而不是只看终端里的中文提示这套流程帮我多次避免了「明明连上了却没生效」的翻车。希望这件事也能成为你的固定动作它值得成为你调试工作流里的最后一道保险希望帮到你。本文还有配套的精品资源点击获取
返回列表