news 2026/9/29 8:45:15

ADB常用命令全攻略:从环境配置到Shell操作与报错排查

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ADB常用命令全攻略:从环境配置到Shell操作与报错排查

1. 为什么搞 Android 的人,最后都绕不开 adb 这套命令

很多朋友刚接触 Android 开发或者刷机玩机的时候,第一个听说的命令行工具往往就是 adb。ADB 全称 Android Debug Bridge,翻译成大白话就是"安卓调试桥"。它的一端是电脑上的命令行,另一端是手机、车机、电视盒子、智能手表这些跑 Android 系统的设备,中间用 USB 线或者 Wi-Fi 连起来。有了这座桥,你就能在电脑上直接指挥设备干活:装应用、传文件、看日志、模拟按键、改系统设置,甚至刷机救砖。

我记得带新人时发现一个普遍误区:很多人以为 adb 是 Android 开发者的专属工具。其实完全不限。搞测试的需要 adb 做自动化;玩机的用它装应用、冻结后台;智能电视用户经常通过 adb 来安装第三方应用;车机改装圈也会用到 adb 来调设备参数——搜索热词里那些"小米电视 adb 安装应用""老款创维打开 adb""吉利车机 adb 模式"就是这么来的。可以说,只要是 Android 生态,adb 就是底层通用工具。

这篇文章我打算把日常使用频率最高的 adb 常用命令系统整理一遍,从环境准备到常见报错,配合实际场景讲清楚每条命令是干什么的、为什么这么写,以及哪些坑我已经替你踩过了。如果你熟悉 Linux 常用命令,上手 adb 会特别快,因为它的核心交互方式就是一整套命令行体系。

1.1 adb 的三个角色:client、server 与 daemon

先理解 adb 的运行原理,后面遇到各种诡异报错会好排查很多。adbd 是设备里的守护进程,电脑上敲命令的是 client,电脑后台还有个常驻的 server。当你在终端里执行 adb devices,电脑的 server 会启动,然后通过 USB 协议跟设备里的 adbd 握手,握手成功后设备就出现在列表里。

我打个比方:client 是打电话的人,server 是交换机,adbd 是接电话的客服。你敲的每一条 adb 命令都先到交换机,再由交换机转给设备客服去执行。之所以要理解这个链路,是因为很多人会遇到"adb 命令没反应"的情况,这时候先执行 adb kill-server 再重新连,本质就是把卡死的交换机重启一下。

1.2 这篇文章适合谁直接照着抄

在往下看之前先对号入座:

  • 刚接触 Android 开发的初学者,想在真机上调试应用,需要一套不绕弯的命令手册;
  • 刷机、玩机、折腾第三方 ROM 的朋友,需要装应用、传文件、进特殊模式;
  • 测试工程师,需要抓取日志、批量操作多台设备、复现崩溃现场;
  • 家里有安卓电视、电视盒子、车机,想自己动手装应用、调设置的人。

如果你是纯新手,我建议不要试图一次性背下所有命令,先把 adb devices、adb install、adb logcat 这三条练熟,跑通设备和电脑之间的通路,后面自然就顺手了。

2. 环境准备:从安装到连接设备,最容易绊倒人的几个环节

2.1 各平台安装 adb 的方式

Windows 用户我建议直接下载 Google 官方的 Platform Tools,解压出来就是 adb.exe、fastboot.exe 那一整套,不需要额外安装。解压完把目录记住,比如放在 D:\platform-tools,然后配置环境变量的目的只有一个:让你在任何目录下都能直接敲 adb,而不是每次都先 cd 到那个文件夹。

macOS 和 Linux 用户简单很多。macOS 有 Homebrew 的直接执行 brew install android-platform-tools;Debian/Ubuntu 系执行 sudo apt install adb。装完在终端执行 adb version,能输出版本号就说明环境正常。

这里有个 Windows 特有细节:很多人解压后双击 adb.exe 发现窗口一闪而过,以为软件坏了。其实 adb 是命令行程序,必须在 cmd、PowerShell 或者 Windows Terminal 里运行,双击根本看不到效果。

2.2 "adb 不是内部或外部命令"到底怎么破

"adb 不是内部或外部命令,也不是可运行的程序或批处理文件"——这条几乎是每天都会有人遇到的头号报错。原因其实很直白:系统在当前目录和 PATH 环境变量里都找不到 adb.exe。

解决办法有两条路。临时应急的做法是每次先 cd 到 platform-tools 目录再执行 .\adb,比如:

cd D:\platform-tools .\adb devices

一劳永逸的做法是把这个目录加进 PATH。Windows 上右键"此电脑"→属性→高级系统设置→环境变量,在系统变量里找到 Path,编辑后新增一行 D:\platform-tools,确定后重开终端(重点:必须新开窗口,不是用旧窗口直接试)。改完可以在终端执行 echo %PATH%,确认路径有没有生效。

macOS/Linux 如果提示 command not found,大概率是安装没成功,重新执行包管理器安装命令,或者确认 brew/apt 的安装过程没有报错。

2.3 手机上的开发者选项和 USB 调试

命令环境搞定之后,还得让设备愿意被你连上。手机端需要进入开发者模式:设置里找到"关于手机",连续点击"版本号"七次,直到提示已进入开发者模式。然后回到设置,找到开发者选项,打开"USB 调试"。

这里有一个反复出现的坑:小米、vivo 这类手机,光开 USB 调试还不够,还得在开发者选项里把"USB 安装""USB 调试(安全设置)"这类开关一并打开,否则后面执行 adb install 会直接报 INSTALL_FAILED_USER_RESTRICTED,字面意思就是系统限制安装,但实际原因只是你少开了一个开关。

2.4 驱动问题和设备状态识别

设备插上后,在电脑上执行 adb devices,常见输出有几种,我整理成了表格方便比对:

输出状态含义常见原因
device正常连接已授权,可执行命令
unauthorized未授权手机弹窗没点允许,或之前点了拒绝
offline离线握手失败、驱动异常或数据线质量差
空列表未识别驱动没装好,或数据线不支持数据传输

判断驱动问题有个笨但有效的办法:换一根短线、换一个 USB 口,最好直接插主板后面的接口而不是机箱前面板。我处理过不少"电脑认不到手机"的求助,最后发现一大半都是线的问题——看着能充电,但根本走不了数据。

3. 基础命令三件套:设备管理、应用安装与文件传输

3.1 adb devices:一切操作的起点

adb devices 是你以后敲得最多的一条命令,作用就是列出当前电脑识别到的所有 adb 设备。正常状态下输出里就有你设备的序列号和 device 状态。只要状态是 device,就可以继续往下操作;如果是 unauthorized 或者 offline,先解决状态问题再说,硬往下走只会得到各种莫名其妙的错误。

配合 -l 参数可以看到更多设备信息:adb devices -l,输出里会包含设备的型号、usb 端口等信息,在电脑上同时插着手机、电视盒子、手表多台设备时,区分起来特别有用。我建议你从现在开始养成习惯:接上新设备,第一步永远是 adb devices,不要跳过。

3.2 安装与卸载应用:install/uninstall 的参数细节

装应用最基础的写法是 adb install 包名.apk。如果终端当前目录没有这个 apk,就得写绝对路径:

adb install D:\apps\demo.apk

常用参数建议直接记住,日常用得太频繁了:

参数含义使用场景
-r覆盖安装,保留数据升级测试,不希望清掉用户数据
-d允许降级版本版本回退,从新版本装回旧版本
-g安装后直接授予所有运行时权限省去手动点权限弹窗
-t允许安装测试 APK安装 AndroidManifest 里 testOnly 的应用

卸载应用对应的命令是 adb uninstall 包名。注意这里跟的是包名,不是应用名称。怎么查包名?最简单的是执行 adb shell pm list packages,能看到设备里所有应用包名,输出太多时在命令行里加 grep(Linux/macOS)或者 findstr(Windows)过滤。

3.3 文件推送与拉取:push/pull 的路径学问

把电脑上的文件推到设备里:adb push 电脑文件路径 /sdcard/目标路径。

adb push C:\test.txt /sdcard/Download/

这条命令执行完,文件就到了设备的下载目录。反过来把设备里的文件拿回电脑:adb pull /sdcard/Download/test.txt C:\。

adb pull /sdcard/Download/test.txt C:\

路径顺序别搞反,先源后目标。我实测下来,电视、车机上装应用时,很多时候 U 盘不识别但 adb 一定认。把 APK push 到 /sdcard/ 或者 /data/local/tmp,再执行安装命令,是不少人在自有设备上装应用的常用路子。具体操作请确保在合规前提下使用自己的设备。

3.4 重启与特殊模式:reboot 全家桶

日常调试经常要把设备重启一下,adb reboot 就是干这个的。带参数的话作用完全不同:

  • adb reboot:普通重启系统;
  • adb reboot bootloader:重启到 bootloader(刷机引导模式);
  • adb reboot recovery:重启到 Recovery 模式;
  • adb reboot fastboot:重启到 fastboot 模式(部分设备支持);
  • adb reboot sideload:配合 Recovery 里的 sideload 功能刷机。

平时用得最多的是 adb reboot。设备卡死时可以直接执行,比长按电源键更可控。但要注意,涉及 bootloader、recovery 的操作会改变设备的启动模式,对数据可能有影响,执行前确认一下自己到底要干什么。刷机老手无所谓,新手千万别在没搞清楚的状态下乱进模式。

4. 进阶操作:用 adb shell 在设备系统里干活

4.1 包管理 pm:查包、清数据、冻结应用

adb shell 的意思是进入设备系统的 shell 环境,后面跟的是设备 Linux 系统里的命令。pm 是 package manager 的缩写,用来管理应用包。

常用组合和作用如下:

adb shell pm list packages # 列出所有包名 adb shell pm list packages -s # 只列系统应用 adb shell pm list packages -3 # 只列第三方应用 adb shell pm clear 包名 # 清除应用数据 adb shell pm disable-user 包名 # 禁用某个应用

pm clear 相当于把应用恢复出厂设置,登录状态、缓存、本地数据库全部清掉。测试同学想模拟"首次安装"状态时这招特别管用,比去设置里找"清除数据"快得多。pm disable-user 则是冻结应用,让它无法被启动、无法后台运行,又不需要卸载,是压制系统自带但用不上的应用的好手段——搜索热词里的"adb 关闭系统后台运行程序",用这个命令就能实现。

4.2 屏幕方向、尺寸与密度:wm 命令的玩法

adb shell wm 用于查看和修改窗口管理相关的参数,搜索热词里"adb shell wm 设置应用屏幕方向"指的就是这一块。

常用命令示例:

adb shell wm size # 查看当前屏幕分辨率 adb shell wm size 1080x1920 # 临时修改分辨率 adb shell wm density # 查看当前屏幕密度 dpi adb shell wm density 320 # 临时修改 dpi

这里我多说一句"为什么"。wm size 和 wm density 的改动,本质是向应用层谎报屏幕参数。改分辨率可以模拟不同屏幕尺寸下的显示效果,改 density 可以让界面元素变大变小。这些修改都是临时性的,重启设备后恢复原状,所以放心测试不会搞坏系统。真正确认没问题了,再用 settings put 系列命令写入持久化配置。

还有一个小场景:很多应用在平板上默认竖屏,或者反过来的情况,通过 adb shell settings put system user_rotation 1 这类设置可以强制屏幕方向。不过不同 Android 版本对旋转控制的实现差异较大,执行前建议先查一下设备的具体版本。

4.3 截图与录屏:screencap 和 screenrecord

抓取设备当前屏幕,最稳的写法是先存到设备再拉回电脑:

adb shell screencap -p /sdcard/screen.png adb pull /sdcard/screen.png

第二种方式是一步到位:adb exec-out screencap -p > screen.png。实测在 Windows PowerShell 下基本正常,但 cmd 下偶尔会出问题,所以我个人还是推荐先存再拉,兼容性最好。

录屏命令:

adb shell screenrecord /sdcard/demo.mp4

按 Ctrl+C 结束录制。默认最长录制 180 秒,录屏期间不能熄屏。想把分辨率调低一点可以用 --size 参数,想限制时长用 --time-limit。录完同样用 adb pull 拉回电脑。

4.4 logcat 抓日志的正确姿势

日志抓取是测试同学的高频需求,也是很多人觉得 adb 最难上手的地方。最粗暴的用法是 adb logcat,它会持续输出所有日志,刷屏刷到怀疑人生。日常我建议这样配合使用:

adb logcat -c # 先清空旧日志 adb logcat -d > crash.log # 导出当前缓冲区日志,-d 表示导出后退出 adb logcat -v time # 带时间戳输出 adb logcat *:E # 只看错误级别日志

排除崩溃问题最常用的组合是:

adb logcat -c && adb logcat -v time *:E > crash.log

让用户复现一次崩溃,然后拿导出的 crash.log 慢慢分析。注意过滤包名的方式在不同 Android 版本上兼容性并不一致,通行的做法是整包导出,再用 grep 或者 Android Studio 的 Logcat 面板二次过滤。盲目依赖单条过滤命令容易漏掉关键信息。

4.5 模拟按键、输入文本与启动应用

这部分是"adb 键盘"搜索热词背后真正实用的内容:

adb shell input keyevent 3 # 模拟按 Home 键 adb shell input keyevent 4 # 模拟按返回键 adb shell input keyevent 26 # 模拟按电源键 adb shell input text "hello" # 向输入框输入文本 adb shell am start -n 包名/Activity全名 # 直接启动某个应用的指定页面

电视、车机上没有实体键盘,想在输入框里打字,用 input text 远程输入比遥控器一个一个按快得多,这算是我实测下来最实用的场景之一。需要注意 input text 对中文支持不稳定,稳妥的办法是传英文/数字,或者先把内容复制到设备剪贴板再粘贴。启动应用时 Activity 全名有固定格式,可以用 adb shell dumpsys package 包名 来查。

5. 无线调试:摆脱数据线的限制

5.1 有线转无线:tcpip 与 connect

先用 USB 线连一次设备,执行 adb tcpip 5555,然后拔掉线,在同一个局域网内执行 adb connect 设备IP:5555,就能无线连接。如果你用的是 Android 11 以上的设备,可以在开发者选项里直接打开"无线调试",用配对码配对,流程更现代。

adb tcpip 5555 adb connect 192.168.1.100:5555

无线调试注意三个点:一是电脑和设备必须在同一网段,跨网段基本连不上;二是公司网络、公共 Wi-Fi 经常开 AP 隔离,表现为设备之间互相 ping 不通,这时候不是你的操作问题,是网络限制;三是连接后如果显示 offline,多半是握手超时,重新 connect 一次,或者换个端口试试。

5.2 多设备并行操作

如果你手上有好几台设备要同时操作,adb 支持指定设备执行命令:

adb devices # 先查看设备序列号 adb -s 设备序列号 install app.apk # 指定某台设备安装 adb -s 设备序列号 shell input keyevent 3 # 指定设备模拟按键

写批量脚本时,可以先用 adb devices 拿到设备列表,再在循环里依次执行命令。这种玩法对测试同学极其友好,我经常用几条 for 循环把办公室里的测试机统一装上包、统一跑一轮冒烟测试,比在一台台设备上手动操作高效太多。

6. 高频报错排查:把搜索热词里的坑一次填平

6.1 "adb 不是内部或外部命令"的完整排查链路

前面已经说了 PATH 的配置思路。但如果你配置完仍然报这个错,按这个顺序排查,命中率很高:

  1. 确认 platform-tools 目录里确实存在 adb.exe,而不是只有压缩包没解压;
  2. 确认环境变量 Path 里新增的是 platform-tools 的绝对路径,不是指向 platform-tools\adb.exe;
  3. 确认打开了新的终端窗口——修改环境变量后旧窗口不会自动刷新;
  4. 在终端执行 echo %PATH%(Windows)检查输出里是否包含你的路径。

我处理过不少远程求助,最后发现 90% 的情况都卡在第三步:改完环境变量还在旧终端里试,怎么试都报错。

6.2 "检测到多个版本 adb 服务":端口冲突问题

这条搜索热词的完整表述是"检测到电脑上同时运行了多个版本的 adb 服务,版本不一致,请把旧的/冲突的 adb 进程杀掉",是 adb 自带的一种保护机制。

原因一般是电脑上装了好几个 Android 相关工具——Android Studio、第三方手机助手、模拟器、各种刷机工具,它们各自捆绑了不同版本的 adb。当你手动启动的 adb server 与另一款工具里的 adb 版本不一致时,就会弹这句提示。

临时处理:执行 adb kill-server,干掉当前 server,再重新 adb start-server。端口 5037 被旧进程占用时这招立竿见影。根治办法:让所有工具统一使用同一个 adb,比如在环境变量里配置 ANDROID_HOME 指向你的 Android SDK 目录,很多工具会优先调用 SDK 里的 adb。如果还不行,干脆把手机助手、刷机工具这类自带旧版 adb 的程序全部退出再试。

6.3 unauthorized 与调试授权窗口不弹

adb 显示 unauthorized,意思是电脑连上了设备,但设备端没有确认授权。正常插线后手机屏幕会弹出"是否允许 USB 调试"的对话框,点允许并勾选"始终允许"就解决。

实际中很多人卡在弹窗不出现,尤其是之前已经插过线、点过"拒绝"的设备。解法按顺序试:

  • 拔掉 USB 线重新插入,触发一次重新识别;
  • 在开发者选项里执行"撤销 USB 调试授权",然后重新插线;
  • 执行 adb kill-server,然后重新 adb start-server;
  • 换一个 USB 口连接,接口状态变化有时也能触发重新授权。

如果设备屏幕已经坏了或者不方便操作弹窗,处理起来会麻烦很多。日常最省事的还是撤销授权重来,基本能覆盖 95% 的 unauthorized 场景。

6.4 设备 offline、找不到设备的通用排查顺序

遇到 offline 或者列表为空,我一般按这个顺序处理,命中率很高:

  • 换线、换 USB 口,优先排除硬件和数据线问题;
  • 执行 adb kill-server 后重新连接,排除 server 卡死;
  • 检查设备端 USB 调试开关是否被系统自动关闭——部分手机重启后会恢复默认;
  • 换一台电脑测试,确认是不是设备本身异常;
  • 检查是否同时开着多个模拟器或虚拟机,它们会占用 adb 的 5037 端口,造成设备列表混乱。

这台机器上装了多个 Android 模拟器导致的端口占用,我前后排查过两次,现象就是设备明明插着却时有时无。最后都是杀掉所有模拟器进程,再重新 adb devices 就恢复正常了。

我自己这些年从手机刷机入坑,到给电视盒子装应用、给车机调参数、给测试机批量跑脚本,adb 一直是那个最常用、最底层的工具,没有之一。熟练之后你会发现,很多在图形界面里点半天才能完成的操作,一条命令几秒钟就搞定了。如果你刚接触,建议从 adb devices、adb install、adb logcat 这三条命令开始练起,先把设备和电脑之间的通路跑通,后面再慢慢扩展。遇到任何奇怪的问题,先执行 adb kill-server 冷静一下,大部分坑都能自己趟过去。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/29 8:43:30

MCP server 的 stdio 和 SSE 分别是什么?TaoToken 统一 Key 接入配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/29 8:41:05

Model-Optimizer不是工具,而是硬件约束下的模型优化方法论

1. “Model-Optimizer”不是软件名,而是工程方法论的统称很多人第一次看到“Model-Optimizer”这个词,第一反应是——这是NVIDIA新出的某个GUI工具?是不是像NVIDIA Control Panel那样点几下就能让模型变快?我刚接手一个部署在RTX …

作者头像 李华
网站建设 2026/9/29 8:40:35

Springboot实现websocket通信

目录 前言 一、websockt是什么? Websockt与 HTTP协议的核心区别 二、后端代码实现 三、前端代码实现 总结 前言 本文目标springboot实现websocket通信并且实现聊天功能。 一、websockt是什么? WebSocket 是一种在单个 TCP 连接上实现全双工通信的…

作者头像 李华
网站建设 2026/9/29 8:40:06

Keil C51与MDK共存:一套uVision5搞定51和STM32开发

我自己最早是从Keil C51开始接触单片机的,后来转做STM32,在很长一段时间里,我的电脑上同时装着两个Keil,每次换项目都得到开始菜单里翻半天图标,烦得不行。后来才发现,Keil本身就支持在同一台机器、同一个u…

作者头像 李华