ADB这东西,玩安卓的人迟早都会碰上。不管你是做开发调试、测试自动化,还是单纯想折腾自己的手机,把那些用不上的系统应用冻结掉、抓个崩溃日志、给手机截图录屏,ADB都是一把绕不开的钥匙。很多教程要么只讲某一条命令的用法,要么上来就丢一堆参数把人看晕,真正从零开始、把原理和实操一次性讲透的内容反而少见。
这篇文章我就按自己的使用习惯,把整套ADB的安装、连接、排错到常用命令、进阶玩法串一遍。不搞那种“照着敲一遍但完全不知道在干嘛”的复读机式教学,每一步都会告诉你为什么要这么做、底层发生了什么、遇到问题往哪个方向查。
1. 先搞清楚ADB是什么:它不只是个“命令行工具”
1.1 一个类比帮你理解ADB到底在做什么
ADB全称是Android Debug Bridge,翻译过来是“安卓调试桥”。很多人第一次听到“桥”这个字觉得抽象,我换个说法你就明白了:ADB就是你电脑和手机之间的一条专用数据通道。
平时你用数据线连手机,电脑上只能看到存储盘,这是因为手机默认开的是MTP传输协议。ADB这条通道不一样,它是走Android系统内部的调试端口,让电脑能直接向手机系统下发指令。你可以把它理解成给医生做手术用的内窥镜,不是只看看表皮,而是能直接伸到系统内部去操作。
这个“桥”是三层结构的,我实际排查问题的时候经常要跟这三层打交道:
- 客户端:就是你电脑上运行的
adb命令,负责解析你的输入,把指令包装好发出去。 - 服务端:当你运行任何adb命令时,它会自动在电脑后台启动一个守护进程(就是
adb start-server干的事),负责监听本机的5037端口,管理所有客户端和设备的通信。 - 守护进程:手机端也会有一个对应的
adbd进程,服务端通过USB线或Wi-Fi连接到这个进程,真正在手机上执行指令的是它。
清楚了这一层结构,后面很多问题你就能自己推断了。比如报错“connection refused”,你第一反应就应该是服务端没起来或者端口被占用,而不是去折腾手机。
1.2 ADB能做什么:从入门到退坑都用得上
ADB的权限说大不大,说小不小。它不是你手机系统的root,但在很多场景下已经能操作大部分系统级功能了。我自己日常用下来,最有价值的主要是这几个方向:
第一,应用管理。安装、卸载、停用、启用应用都不需要动手点屏幕,尤其在批量处理应用的时候,命令行的效率比手动操作高太多了。网上流传的各种“ADB精简列表”,核心原理就是通过pm包管理命令把不用的系统应用临时停用。
第二,日志抓取。开发或测试阶段遇到闪退、卡顿,最需要的就是logcat日志。ADB可以按应用、按进程、按级别筛日志,还能把日志实时输出到文件。这活儿在用户反馈“不知道怎么就崩了”的时候特别有用。
第三,输入模拟。通过input命令模拟点击、滑动、输入文字,这在自动化测试和脚本化的场景里是利器。配合Shell脚本,你能做很多看似很玄的事情,比如定时自动操作、批量点击等。
第四,系统参数读取和控制。屏幕分辨率、刷新率、电量状态、网络连接状态、无障碍服务开关等,这些都可以通过对应的命令查看和修改。配合脚本能实现很多有趣的玩法。
第五,文件传输。跟MTP那种图形界面拉文件的方式不同,ADB的push和pull是走命令行的,在拷贝大量文件、操作特定目录时稳定且可控。
2. 安装ADB:2023年这边建议直接下载平台工具
2.1 Windows平台:不用装乱七八糟的“一键安装包”
网上搜“ADB安装”有不少没头没尾的“一键傻瓜包”,我可以直接告诉你,别用。那些包里带了什么脚本、内置了什么广告、改了什么系统配置,完全不可控。官方早就提供了干净的独立工具包,叫Android SDK Platform-Tools,里面就包含ADB、Fastboot等核心工具,体积不大,随下随用。
具体步骤是这样的:
- 打开Android开发者官网的下载页面(开发者选项里的SDK Platform Tools页面),找到Windows版本下载,解压后你会看到一个
platform-tools文件夹。 - 把这个文件夹放到一个你熟悉的位置,比如
C:\platform-tools。 - 为了在任意目录都能直接使用
adb命令,需要配置环境变量。按下Win + R,输入sysdm.cpl,切换到“高级”选项卡,点击“环境变量”,在“系统变量”里找到Path,编辑并新建一项,填上你解压的platform-tools路径。 - 配置完之后,重新打开一个命令行窗口(注意是新的窗口,旧的不会生效),输入
adb version,如果返回了版本号,就说明安装成功了。
配置环境变量这一步,很多人会漏掉。如果你不想配置,也可以每次都在platform-tools文件夹的地址栏输入cmd回车,就自动在那个目录下打开命令行,然后输入adb命令,效果是一样的。
2.2 macOS和Linux平台:包管理器一条命令搞定
macOS用户如果装了Homebrew,直接执行:
brew install android-platform-tools它会把platform-tools自动链接到系统PATH里,省去手动配置环境变量的步骤。如果没装Homebrew,那就跟Windows一样,下载macOS版本的platform-tools压缩包,解压后在~/.zshrc里加上一行导出PATH的配置。
Linux平台更简单,Debian/Ubuntu家族直接:
sudo apt install android-tools-adbFedora系则是:
sudo dnf install android-tools装完之后同样先验证adb version是否正常输出。
2.3 装完先做这三件事:启动服务、杀掉服务、看设备
装好ADB后不要急着连手机,先熟悉三个最基本的管理命令,它们对应的功能是启动ADB服务端、停止服务端、列出已连接设备:
adb start-server adb kill-server adb devices很多人在连接出问题时会忽略一个万能操作——先adb kill-server,再adb start-server,最后adb devices。这个组合拳能解决大量“看似连接正常但命令无响应”的异常情况。原理是服务端偶尔会进入不太好的状态,比如5037端口被别的东西占了,或某个连接句柄卡死,重启服务端就能把它拉回正常状态。建议把它当成处理ADB异常的第一板斧。
3. 手机端准备和连接方式:USB与无线调试打通任督二脉
3.1 先打开开发者选项:每个安卓用户都应掌握的入口
不管用USB还是无线调试,手机端的准备工作是同一套。打开“设置”,找到“关于手机”,连续点击“版本号”7次,直到提示“您已进入开发者模式”。然后回到设置首页,就能看到“开发者选项”的入口了。
进入开发者选项后,把“USB调试”开关打开。有些手机(尤其是国产ROM)还藏着一个“USB安装”或“USB调试(安全设置)”的开关,如果不打开,后面用ADB安装应用时会报INSTALL_FAILED_USER_RESTRICTED权限错误。MIUI、ColorOS、OriginOS等系统都有类似的机制,记得一并开启。
这个操作我只提醒一次:开发者选项长期打开会稍微增加一些风险,比如连接陌生电脑时被授权调试。设备用完建议把USB调试关掉,尤其是不懂技术的人用的手机。
3.2 USB连接与首次认证:为什么一定要点“允许USB调试”
用数据线把手机连上电脑,首次执行adb devices时,手机会弹出一个RSA指纹授权框,显示“允许USB调试吗?”,后面跟着一串电脑的指纹信息。这个授权机制是防止陌生电脑直接连上你的手机。很多人不知道这点,看到弹窗习惯性点“取消”,然后电脑端一直显示unauthorized,就过来问为什么连不上。
正确操作是在手机上勾选“始终允许使用这台计算机进行调试”,然后点击允许。接着再执行adb devices,状态应该从unauthorized变成device。听到手机叮咚一声响,说明调试通道已经建立了。
这里需要注意一个很容易踩的坑:你用别人的电脑调自己的手机,或者自己的电脑调别人的手机,一定要看清楚那台电脑是否可信。如果误点了授权,可以在开发者选项里找到“撤销USB调试授权”,一键清除所有授权记录,重新来过。
3.3 无线调试:先有线配对,再无线操作
无线调试可以摆脱数据线的束缚,但它不是一步到位的。从Android 11开始,系统内置了比较完善的无线调试功能,但对很多用户来说,理解这套配对逻辑需要一点耐心。
操作流程是:手机和电脑连接同一个Wi-Fi,在开发者选项里打开“无线调试”,点进去,选择“使用配对码配对设备”。此时手机会显示一个6位配对码和当前手机的IP:端口。在电脑上执行:
adb pair 192.168.1.100:39067然后输入配对码,配对成功后,再查看无线调试页面显示的“IP地址和端口”,用adb connect连接:
adb connect 192.168.1.100:37617连接成功后再执行adb devices就能看到设备了。要留神的是,无线调试页面的端口每次连接都可能变化,连接时不要用旧的端口号硬连。断线后重新连接时,最好去手机上看一眼当前的端口。
3.4 模拟器用户怎么连接ADB
用夜神、MuMu、雷电这类模拟器时,它们是自带ADB连接的。PC端配置好ADB工具后,使用对应模拟器提供的adb连接命令即可。比如夜神模拟器默认的ADB端口是62001,用adb connect 127.0.0.1:62001就能连接。不同模拟器端口可能不同,建议查阅模拟器文档确认。连接成功之后,ADB的用法和真机完全一致,开发测试时非常方便。
4. 连接故障排查:ADB设备的四种状态掩藏的玄机
adb devices输出的设备状态,直接反映了当前的连接健康度。常见的状态有四种:device(正常)、unauthorized(未授权)、offline(离线)和no permissions(无权限)。每一种都对应着一套不同的排查思路。
4.1 unauthorized怎么解决
unauthorized状态表示ADB能看到这台设备,但手机端没有授权这台电脑。解决路径只有一条:在手机上确认弹窗并允许调试。如果你不小心点了“取消”,或者根本没看到弹窗,可以去开发者选项里点击“撤销USB调试授权”,然后重新插拔数据线,再次执行adb devices,弹窗就会重新出现。
有一种情况特别容易让人抓狂:手机上确实弹了框也点了允许,但电脑端还是unauthorized。这通常是USB数据线的数据传输不稳定,或者你手机系统里“仅充电”模式下不允许调试。可以换一个专门的数据线(不是那种只能充电的线),然后把USB连接模式切到“传输文件(MTP)”或“传输照片(PTP)”试试,这个细节我踩过不止一次。
4.2 device offline怎么解决
offline状态意味着设备曾连接成功,但现在通信断开了。可能的原因有几类:
- USB线接触不良或质量差,数据传输不稳定。
- USB接口供电不足,尤其是台式机前置面板的接口,推荐插后置主板接口。
- adb服务端状态异常。解决办法是重启ADB服务端,命令是:
adb kill-server adb start-server adb devices以上都没用的话,就把手机重启一下。重启对offline状态有奇效,原因有时候是手机的adbd进程进入了某种锁死的状态,重启能恢复。
4.3 列表为空或提示无权限
如果adb devices输出是空的,说明电脑端没有识别到USB设备。这时候先看看系统设备管理器里有没有出现带黄色感叹号的Android设备。如果存在,那就需要安装USB驱动。Windows下可以打开设备管理器,找到带感叹号的设备,右键更新驱动,选择“自动搜索”——驱动无法自动找到的话,去手机品牌官网下载专用USB驱动,或使用通用的Google USB驱动。
Linux用户如果提示no permissions,多半是udev规则没配好。常见处理方式是新增一个udev规则文件,加入对应的USB vendor ID,然后重启udev服务并重插设备。这个问题在Ubuntu等发行版上很常见,配置一次之后基本就不会再遇到。
4.4 5037端口被占用:看不见的祸根
ADB服务端依赖本机的5037端口工作。有时你启动服务后,设备列表还是空的,命令执行也特别卡,多半是端口被其他程序占了。执行:
netstat -ano | findstr :5037可以看到是哪个进程占用了端口。有时候是某些模拟器的残留进程,有时候是恶意程序。把对应进程结束掉,再重启ADB服务端就能恢复。这个问题很冷门,但遇到了非常浪费时间,建议记在小本本上。
5. ADB常用命令大全:从应用到文件再到设备信息
5.1 安装与卸载应用的几种姿势
安装应用最常见的写法:
adb install app.apk如果要覆盖安装(保留数据),加-r参数:
adb install -r app.apk如果安装失败,让你检查INSTALL_FAILED_USER_RESTRICTED这类权限问题,注意确认开发者选项里的USB安装权限已经打开。Android 13以后的一些机型还默认限制了安装应用必须经过确认弹窗,-r不一定能绕过,这种时候可以在命令后加上-t或配合pm install相关操作来临时降低限制。总之,遇到安装权限问题,先翻开发者选项,再想别的办法。
卸载应用:
adb uninstall com.example.app如果你想卸载但保留数据(某些应用重装后就怕丢登录状态),或者卸不掉,可以用下面的方法:
# 清除应用数据但保留安装包 adb shell pm clear com.example.app # 停用应用(不需要root) adb shell pm disable-user --user 0 com.example.app # 重新启用应用 adb shell pm enable com.example.apppm disable-user这招就是当前网络上各种“ADB冻结应用”“精简列表”的本质。它的原理是让系统认为这个应用是“被用户停用”的状态,不需要root,但效果等同于把应用藏起来了。注意不要停用系统核心组件,比如系统桌面、设置、输入法,否则手机可能变砖。这个警告不是开玩笑的,我先帮你把这句话画个重点。
5.2 文件传输:push和pull要有明确的思路
把电脑上的文件推到手机:
adb push 本地文件路径 /sdcard/目标路径把手机上的文件拉到电脑:
adb pull /sdcard/xx.jpg E:\saved\两个命令的格式都是“来源 目标”,跟Linux的cp习惯一致。需要注意,Android 11之后分区存储策略收紧,/sdcard/依然不是应用目录,但有些系统内部目录不能随意写。如果你往/data/local/tmp下传文件,这个路径在普通权限下是可写的,也是测试时常用的临时目录。
另外,如果你拉取的是大文件,可以用adb pull加进度显示吗?其实ADB默认会有进度条,只是不连续刷新。我实测传1GB以上的文件时更推荐用数据线,Wi-Fi调试虽然方便,但传输大文件的速度波动较大,有时会断开。
5.3 截图和录屏:不root也能优雅地抓证据
截图:
adb exec-out screencap -p > screen.png这个命令会把截图的二进制输出重定向到本地文件。注意使用exec-out而不是shell screencap,因为exec-out不会在输出内容里追加额外的换行或回车符,避免图片文件损坏。
录屏:
adb shell screenrecord /sdcard/record.mp4 --time-limit 30 --size 720x1280录屏默认最长时间3分钟,超过会自动停止。加--time-limit能控制时长,加--size能控制分辨率和码率,文件太大时很有用。录完后直接adb pull拉回电脑就行。这条命令在制作教程和提交Bug时都非常实用,安卓自身不自带内录声音,别指望它能录到麦克风。
5.4 查看设备基本信息:拿着参数去排查问题
查看设备型号:
adb shell getprop ro.product.model查看Android版本:
adb shell getprop ro.build.version.release查看CPU架构,这在给手机装对应的bin文件、上Magisk时有用:
adb shell getprop ro.product.cpu.abi查看屏幕分辨率:
adb shell wm size查看屏幕密度:
adb shell wm density查看电池状态,用adb shell dumpsys battery能看到电量、温度、充电状态等很详细的信息。上面热搜词里那句adb shell dumpsys battery set usb 0,实际上是在临时设置USB充电状态为关闭,用于模拟不充电场景下的功耗测试。如果你只是看看电池状况,不需要乱改参数,改完用dumpsys battery reset恢复即可。
6. ADB进阶实战:日志、模拟操作与系统级控制
6.1 抓取logcat日志:从入门到排查崩溃
logcat是Android的日志系统,ADB抓日志通常这么写:
adb logcat -v time > app.log-v time表示在每条日志前加上时间戳,排查问题时非常有必要,不然你根本不知道崩溃发生在哪一秒。> app.log是把所有日志重定向到文件,避免刷屏刷到你眼花。
如果只想看某个应用或者某个进程的日志,可以先查PID:
# 获取包名的进程ID adb shell pidof com.example.app然后按进程ID过滤:
adb logcat --pid=12345或者按标签过滤(很多应用或系统模块会打自己的tag):
adb logcat -s UnityActivity E这条命令的意思是指显示UnityActivity下级别为Error的日志。开发游戏、US应用时,这种过滤方式能让你从几十万行日志里迅速捞出关键错误。
日志抓取还有一个高频场景是抓取崩溃现场。在测试机上,先adb logcat -c清空缓冲区,再复现一次崩溃,最后adb logcat -d输出缓冲区内容到文件。这样能拿到一个干净、完整的崩溃日志。
6.2 用input命令模拟用户操作:解放双手的基础操作
input命令是我日常试玩自动化脚本的必备工具。它可以在手机上模拟点击、滑动、文本输入。
模拟点击:
adb shell input tap x yx y是屏幕坐标,你可以先用开发者选项里的“指针位置”功能打开触控坐标显示,这样就能看到手指按在哪里、对应什么坐标。
模拟滑动:
adb shell input swipe x1 y1 x2 y2 duration_ms比如模拟下拉状态栏,就是从头屏顶部往下滑动;模拟左右滑动翻页,就是从右往左或从左往右。duration_ms是滑动耗时,单位毫秒,想快就短一点,想模拟真人慢速滑动就设长一点。
模拟输入文字:
adb shell input text "hello"有两个坑要先提醒你:第一,这个命令对空格和特殊符号支持很差,空格在Shell里会被拆成两个参数,导致输入内容变形。解决方法是把空格转义成%s,比如input text hello%s world。第二,中文输入几乎不能用input text直接输入,因为它是通过KeyEvent的方式模拟英文键盘输入。想输入中文,通常的做法是用ADB把剪贴板内容写到系统,然后长按输入框粘贴,或者借助切入某个输入法的方式,但这已经超出基础ADB的能力范畴了。
6.3 屏幕刷新率调整与系统设置
很多手机默认屏幕刷新率只能在自己厂商的“设置”页选几档,但通过ADB可以直接指定一个系统认为合法的刷新率值:
# 查看当前支持的刷新率列表 adb shell settings put system peak_refresh_rate 120.0 adb shell settings put system min_refresh_rate 120.0如果你的手机系统字段名和这个不一样,就执行adb shell settings list system | grep refresh,看看当前机型的刷新率字段到底叫什么。热词里那一长串跟“屏幕刷新率”相关的内容,原理就是这个。需要强调的一点是:不要瞎改超出屏幕硬件能力的刷新率,轻则花屏,重则系统界面崩溃。改完后记得把参数回调到默认值。
6.4 应用联网控制与权限管理
不给应用联网权限,不想用第三方管理软件,用ADB也能搞定。Android 6以后每个应用都有独立的INTERNET权限,但普通权限模式下这个开关不一定会在设置里显示出来。通过AppOps(应用操作管理)机制可以直接控制:
# 检查某个应用的联网权限状态 adb shell appops get com.example.app INTERNET # 禁用联网 adb shell appops set com.example.app INTERNET deny # 恢复联网 adb shell appops set com.example.app INTERNET allow这条命令在国行手机上尤其好使,因为有些系统应用明明用不上,却又没法直接卸载,禁用联网能很大程度上断掉它的后台活动。不过要注意,部分国产ROM会自签框架或做额外管控,改完可能不生效,这时候就要回到“卸载/停用”的老路线上。
给应用授予无障碍权限,ADB也能“代劳”:
adb shell settings put secure enabled_accessibility_services com.example.app/com.example.app.AccessibilityService adb shell settings put secure accessibility_enabled 1这里的包名和服务名必须完全匹配,可以去应用安装目录下确认AndroidManifest.xml中AccessibilityService的完整路径。很多自动打卡、抢红包工具的原理都是这个,但我要提醒一句:无障碍权限能读取你屏幕上的所有内容,不要随便给不明应用开这个权限。
6.5 端口转发与更高级的方向
ADB还支持端口转发。比如你手机上的某个程序监听在8080端口,你希望电脑上访问localhost:8080就能访问到手机的端口,可以执行:
adb forward tcp:8080 tcp:8080这在调试手机上的Web服务、测试本地代理时很常用。类似的还有反向转发,adb reverse则是在手机上监听某个端口,把流量反过来导到电脑,开发React Native时你可能会接触这个命令。这些都是ADB真正强大的一面,学会它们后,你对“ADB只是一条安装/卸载命令”的印象会彻底改变。
7. 经验之谈:ADB的最佳使用习惯与避坑清单
最后聊点不怎么写在官方文档里的经验。
第一次用ADB连接手机,建议先做一次完整走通:adb devices看到device状态,执行一次adb shell echo ok,确认Shell能通,再操作复杂命令。这样能避免后面一堆命令都白敲一遍然后才发现根子上没连上。
写自动化脚本时,记得每个ADB命令后面加合理的等待时长。例如adb shell input tap执行后,界面切换需要时间,马上执行下一个指令大概率会失败。稳妥的做法是在Shell脚本里加上sleep一两秒的缓冲。
无线调试方便是方便,但每次连接都要确认端口,如果你经常调试,可以考虑用adb pair配对后直接用adb connect 127.0.0.1:随机端口的方式自动找出当前端口。不过坦白说,比起花时间写这种脚本,有线连接稳定可靠,数据传输又快,初学阶段老老实实用数据线就好。
把ADB驱动、platform-tools版本、手机系统版本这三者的兼容关系记住:ADB工具会向后兼容旧系统,但新系统可能需要新版本ADB才识别正常。遇到新手机、新系统突然连不上,先去更新platform-tools到最新版,再试其他办法。
就我个人实际使用来看,ADB这个东西真正难的不是某一命令怎么敲,而是你能否建立起“电脑和手机之间有一个可编程的调试桥梁”的认知。有了这层认知,你遇到任何疑问都会习惯性去查ADB能不能做、对应哪个子命令,而不是到处求人或者装各种不靠谱的第三方工具。希望这篇内容对你有一条清晰的入门路径,上手过程中遇到具体问题,欢迎按我上面说的方法去排查一遍,大概率能自己解决。