平时折腾安卓设备,不管是手机、平板还是电视盒子,只要涉及深一点的调试,ADB基本是绕不开的工具。很多人第一次听说ADB是因为刷机或者搞什么“精简列表”,后来才发现这玩意儿能干的事远不止刷机:装应用、传文件、抓logcat日志、改刷新率、冻结应用、连模拟器,甚至调无障碍权限,全都能通过它搞定。更重要的是,ADB不要求root,绝大多数安卓设备默认就能用,对普通用户也非常友好。
这篇帖子我打算把几年下来实际用到的ADB经验一次性整理清楚。不会只贴一堆冷冰冰的命令,每一条我都会说明它解决什么问题、什么场景下用、踩过哪些坑。内容覆盖环境搭建、连接排障、高频命令、日志分析、电视盒子调试、自动化脚本等,适合刚开始接触ADB的新手,也适合有一定经验但想查漏补缺的老手。
1. 先把ADB这件事说清楚
1.1 一句话解释ADB:电脑和安卓设备之间的“指挥棒”
ADB全称是Android Debug Bridge,中文一般叫安卓调试桥。名字里带“桥”字,它的作用也确实就是一座桥:架在电脑和安卓设备之间,让电脑能向手机、平板、电视盒子发送指令,也能把手机里的数据拉到电脑上。你可以把它理解成一根指挥棒,电脑这边敲一条命令,设备那边就执行一个动作。
它底层走的是TCP或USB通道,通过一个叫adb server的守护进程来转接。输入adb devices的时候,电脑端会启动服务,然后通过USB或者网络去发现设备,设备端则通过adbd进程来接收命令。整个链路不算复杂,但一旦某个环节断了,就会出现我们最常见的两种报错:adb unauthorized和device offline。后面我会专门讲这两个问题。
有一点值得先说明:ADB不是黑魔法,它调用的都是安卓系统本身开放的调试接口。几乎所有正规的刷机工具、手机助手、自动化测试框架(比如Appium)底层都是靠ADB来工作的。所以学ADB,本质上是在学安卓系统的一个标准入口,这个技能放到哪个设备上都通用。
1.2 我日常用ADB解决哪些问题
回头想想,我工作中和生活中用到ADB的频率相当高。最常见的几个场景包括:
- 应用调试:开发或者测试App时,需要安装测试包、查看崩溃日志、模拟点击,ADB是基础工具。
- 设备维护:帮家人清理手机预装软件时,用pm disable-user冻结应用比root后卸载更安全,不会物理删除系统文件。
- 文件管理:有些App把文件存在私有目录里,文件管理器看不到,但adb pull可以直接拉出来。
- 系统参数调整:比如改屏幕刷新率、DPI、关闭动画,这些在部分手机上不需要root,ADB就能做到。
- 电视盒子折腾:老款电视、电视盒子大多没有键盘鼠标,打开ADB后用电脑remote操作,比遥控器按来按去效率高太多。
如果你也想把这些场景变成自己的技能库,下面的内容按顺序看就行。环境配置部分我尽量写细一点,因为很多命令本身不难,难的是第一步设备连不上。
2. 环境配置和连接排障:从adb unauthorized到模拟器端口
2.1 三步配好ADB环境
ADB工具本身不需要安装,它就是一个命令行工具包。正规做法是下载Android官方发布的platform-tools压缩包,解压后里面有adb.exe(Windows下),还有fastboot等其它工具。下载渠道直接说developer.android.com,注意别从乱七八糟的下载站拿二次打包的版本,容易被夹带私货。
解压好之后,建议把platform-tools目录加进系统环境变量。Windows上的操作是:右键“此电脑” -> 属性 -> 高级系统设置 -> 环境变量,在Path里新增一条指向platform-tools目录的路径。这样之后在任何目录下打开终端,直接输adb命令就能识别。
macOS和Linux更简单,把platform-tools的路径追加到~/.zshrc或者~/.bashrc里就行。配好之后在终端里验证一下:
adb version如果输出版本号,环境就算通了。
这里有个小细节:很多人配完环境变量后发现终端还是提示“adb不是内部或外部命令”。原因是环境变量设置后需要新开一个终端窗口才生效,或者需要执行source ~/.bashrc。别傻傻地重启电脑,新开一个窗口基本就解决了。
- 当前目录启动:不配环境变量也行,但每次都要cd到platform-tools目录,效率低,建议配。
- 多版本工具:如果你同时用夜神模拟器的adb、或者别的定制adb,要注意PATH里的优先级,否则会出现“不同版本adb连不上设备”的问题。这个问题我后面会提。
2.2 真机连接:开发者选项、USB驱动和授权弹窗
真机连接是ADB最常见的场景。第一步是打开开发者选项和USB调试。不同品牌入口稍有差异,但规律是一致的:找到系统版本号,连续点7次,开发者选项就出来了。然后进入开发者选项,打开“USB调试”开关。
接下来用USB线连接电脑,此时手机屏幕上会弹出一个“允许USB调试吗?”的对话框,后面还有一串计算机的RSA密钥指纹。这个地方一定不要点太快,要勾选“始终允许使用这台计算机进行调试”再点允许。
如果连接后输入adb devices看到设备状态是unauthorized,那基本就是上一步没点允许,或者之前点了拒绝。解决办法很直接:手机端进入开发者选项,找到“撤销USB调试授权”,重新插拔USB线,再次弹窗时点允许。
驱动这块,Windows用户容易栽跟头。部分国产手机插上电脑后,设备管理器里出现黄色感叹号,那就是驱动没装好。最简单的办法是安装手机厂商的USB驱动,或者用各种手机助手让它自动装驱动。装好后设备管理器里能看到Android Composite ADB Interface之类的设备。macOS和Linux基本不需要额外驱动,插上就能识别。
2.3 模拟器怎么连:夜神等常见调试端口
不用真机的时候,Android模拟器是调试的好帮手。夜神模拟器的ADB模式很典型,它的adb是定制过的,一般不直接用系统adb连接,而是用夜神安装目录下的nox_adb.exe。连接命令是:
nox_adb.exe connect 127.0.0.1:62001不同模拟器端口不一样,常见的端口我整理一下:
| 模拟器 | 端口 |
|---|---|
| 夜神 Nox | 62001(有时也会用62025) |
| 网易MuMu | 7555,新版MuMu 12则是16384 |
| 逍遥模拟器 | 21503 |
| 雷电模拟器 | 5555(或emulator-5554) |
| Android Studio自带 | emulator-5554 |
连接成功后,同样用adb devices查看,会看到一个ip:port格式的设备。这里有个常见误区:用系统原生adb连接夜神时,有时会报offline,因为夜神模拟器要求的adb版本和系统自带的不匹配。解决办法就是用模拟器自带的adb来连,或者把platform-tools里的adb.exe换成模拟器版本。
2.4 常见连接故障解决:unauthorized、offline、找不到设备
我把几年里遇到最多的连接故障整理成了一张排查表,照着做基本能解决:
| 现象 | 原因 | 解决办法 |
|---|---|---|
| adb devices显示unauthorized | 设备端未授权,或授权被误拒 | 撤销调试授权后重新连接,弹窗时务必点允许 |
| 显示offline | adb版本与设备端不兼容,或USB不稳定 | 重插USB线,或升级platform-tools;模拟器请使用自带的adb |
| 找不到设备 | USB驱动未装,或数据线是纯充电线 | 换一根支持数据传输的数据线,安装厂商驱动 |
| connect之后显示“cannot connect” | 模拟器端口不对,或服务未启动 | 换端口重试,或查看模拟器设置里的adb选项 |
| 电脑无法识别但手机能充电 | 充电线不能传数据 | 换线即可,90%是这个问题 |
还有一个万能大招:重启adb服务。遇到莫名其妙的连接问题,先跑这两条命令:
adb kill-server adb start-server然后重新插拔USB线,绝大多数连接问题都能解决。我自己的习惯是:每次开始调试前先跑一次adb devices,确认链路畅通再往下走,这个习惯帮我省了不少排查时间。
3. 高频命令实测:传文件、截图、冻结、刷新率都能干
3.1 常用命令速查表
先给一张我在日常使用中最高频的命令表,后面再逐个展开:
| 命令 | 作用 |
|---|---|
| adb devices | 查看当前连接的设备列表 |
| adb install app.apk | 安装应用 |
| adb uninstall 包名 | 卸载应用 |
| adb shell pm list packages | 列出所有已安装应用的包名 |
| adb shell pm disable-user 包名 | 停用预装应用(冻结) |
| adb push 本地文件 手机路径 | 电脑文件传到手机 |
| adb pull 手机路径 本地目录 | 手机文件拉到电脑 |
| adb shell screencap 路径 | 截屏并保存到手机 |
| adb shell screenrecord 路径 | 录屏并保存到手机 |
| adb logcat | 抓取实时日志 |
| adb shell input text 字符串 | 向设备输入文本 |
| adb shell settings put 系统设置项 值 | 修改系统参数 |
| adb reboot | 重启设备 |
我不建议死记硬背,最好的方法是把它们分类记:设备相关的、应用相关的、文件相关的、系统参数相关的。下面按类别挑几个重点展开。
3.2 应用安装、卸载,以及红米K70这类机型的应用冻结
安装应用的常规命令是adb install。如果你是覆盖安装测试包,要加-r参数保留数据;如果安装的App和目标版本签名不一致,需要先卸载旧的。这种场景我用得最多的是:
adb install -r app.apk如果你的安装包比较大,建议加-s参数把应用装到SD卡,免得占满系统分区。
卸载就简单了:
adb uninstall 包名这里重点说一下冻结。所谓“冻结”其实是通过pm disable-user命令,把某些预装应用停用。它跟卸载不一样,卸载是把文件删掉,后者容易导致系统不稳定;冻结只是在当前用户空间禁用,需要恢复时随时可以enable-user回来。对于红米K70这类新机型,用户经常问“能不能用ADB冻结”,答案是能。比如冻结某款系统内置应用:
adb shell pm disable-user --user 0 com.miui.什么应用包名恢复冻结就是:
adb shell pm enable 包名这个命令最大的意义在于,你可以安全地精简掉不想看到的预装应用,不用root,也不怕删了系统文件开不了机。但我必须提醒一句:有些体系内应用被disable之后会引发其它功能异常,比如冻结了系统桌面或者输入法,后果就是手机变砖一样难用。所以冻结前先查清楚包名对应的应用,谨慎操作。
3.3 文件传输与截图录屏
文件操作这块,我举个实际例子。很多App把下载的文件存在/data/data/包名/这个私有目录里,普通文件管理器是看不到的,但用ADB可以直接拉出来:
adb pull /data/data/com.example/files/result.txt D:/backup/电脑传到手机就用push,反过来用pull。手机里的文件路径建议先用adb shell ls查一下再操作,不然容易遇到“路径不存在”。
截图和录屏是给老板演示、做测试报告时的高频操作。传统方式是手机上按音量键+电源键截图,但如果你在自动化测试或者连续抓多张图,用ADB可以一条命令完成:
adb shell screencap -p /sdcard/screen.png adb pull /sdcard/screen.png也可以直接一条命令截到当前目录:
adb exec-out screencap -p > screen.png录屏类似:
adb shell screenrecord --size 720x1280 --bit-rate 2000000 /sdcard/demo.mp4录屏默认有限时,最长为180秒,超过时间会自动停止。需要停止的时候按Ctrl+C即可。要把视频拉回电脑,再用pull即可。第一次用的时候我以为录屏是无限时的,结果录到3分钟自己停了,后来查了参数才明白是硬限制。
3.4 修改屏幕刷新率与显示参数
你搜“adb命令设置屏幕刷新率”时,看到的多数是这种命令:
adb shell settings put system min_refresh_rate 60 adb shell settings put system peak_refresh_rate 120或者:
adb shell settings put global refresh_rate 90不同厂商的设备对refresh_rate的属性名定义不太一样,小米部分机型用peak_refresh_rate,一加、realme等品牌可能用其他字段。最好先在设置界面手动切一下刷新率,然后用:
adb shell settings list system | grep refresh查当前系统的实际属性名,这样就不会改成一堆无效配置。
除了刷新率,DPI和分辨率也能通过ADB调。修改DPI会让桌面图标、字体大小发生变化,有些用户喜欢用它来获得更紧凑的显示效果:
adb shell wm density 420恢复默认就用:
adb shell wm density reset修改分辨率则用wm size,比如改成720p来降低GPU负载。这个参数在测试兼容性时好用,但平时不建议乱改,改完如果界面错乱,可以直接reset恢复。
4. 进阶玩法:logcat日志、ADB键盘与电视盒子调试
4.1 adb logcat抓取日志:从崩溃定位到实时过滤
logcat是ADB里最强大的命令之一,也是开发者日常离不开的。App崩溃、卡顿、网络连不上,都能从logcat里找到对应信息。最基础的用法是实时看日志:
adb logcat -v time-v time表示带上时间戳,方便定位问题。如果日志太多刷屏,可以抓取某个进程的日志,或者只抓崩溃日志:
adb logcat -b crash-b crash是安卓系统专门存放崩溃信息的缓冲区,很多闪退问题在这个缓冲区里能直接看到堆栈。抓完后想保存到文件,用:
adb logcat -d > app.log-d表示dump当前缓冲区内容后退出,适合抓完就走、不一直占用终端。需要过滤特定标签时,可以配合grep使用。比如只看网络相关的日志:
adb logcat -v time | grep -iE "network|http|socket"这里有个比较实用的排障思路:当用户反馈某个功能偶现异常时,先清空日志(adb logcat -c),然后让用户复现一次,复现完马上执行adb logcat -d把日志拉回来,这样拿到的日志最干净、最直接。
- 提示:手机厂商的定制系统可能会对logcat做限制,比如禁止普通应用读取它人日志。抓不到时先检查设备有没有开启“日志记录器缓冲区大小”相关选项。
4.2 ADB键盘与输入自动化
在带触屏的手机上,输入文字可以直接打字,但在电视盒子或者没有实体键盘的调试环境里,ADB键盘就很有用了。ADB键盘是一款开源的输入法应用,安装后把系统默认输入法切换成“ADB Keyboard”,然后就能通过ADB发送文字。它的好处是可以输入中文,而原生的input text命令只支持ASCII字符。
安装和激活的流程是:
adb install ADBKeyBoard.apk adb shell ime enable com.android.adbkeyboard/.AdbIME adb shell ime set com.android.adbkeyboard/.AdbIME之后通过广播方式往输入框发送指定文本:
adb shell am broadcast -a ADB_INPUT_TEXT --es msg "你好世界"这种方式在电视盒子上登录Wi-Fi、输入账号密码时非常好用,比遥控器一个个字母选快得多。如果你只是想在普通手机上模拟文字输入,可以用:
adb shell input text "hello"注意input text不支持中文,也不支持空格。需要空格时可以用%20代替,或者直接用ADB键盘方案。
4.3 禁止应用联网与授予无障碍权限
“adb禁止应用联网”也是经常被搜到的一个需求。Android本身没有提供一个通用的adb命令能直接限制某个App的联网权限,但不同版本有不同玩法。
在Android 10及以上系统,可以用appops命令去改应用的联网权限。示例:
adb shell cmd appops set 包名 INTERNET ignore这个命令在部分机型上有效,但也有不少系统不太支持。比如国内定制系统往往把联网控制做进了“手机管家”一类的应用里,要真正禁用联网还是得去系统设置界面操作。
如果你的设备已经root,可以用iptables直接封禁某个应用的联网能力,这个我没法给一个通用命令,因为不同设备、不同版本的iptables规则差异很大,而且需要自写脚本。我的建议是:优先用系统自带的联网管理功能,ADB只适合用来快速批量设置权限的个例。
授予无障碍权限是另一个高频需求。很多自动化脚本需要无障碍服务,但手动去设置里找很麻烦,ADB可以直接写:
adb shell settings put secure enabled_accessibility_services 包名/服务名 adb shell settings put secure accessibility_enabled 1需要注意,包名和服务名是特定的类名路径。比如某个无障碍服务类名是com.example.app/.MyAccessibilityService,那命令就是:
adb shell settings put secure enabled_accessibility_services com.example.app/.MyAccessibilityService授予后去设置里检查一下是否真的打开了。不同系统对这种写操作可能会有权限限制,不生效时只能手动开关一次再观察。
4.4 智能电视与盒子的ADB调试细节:动态密码与永久开启
电视和盒子是ADB的重度使用场景。很多老款创维电视、海尔电视等,打开ADB的方式和手机完全不同。手机是进开发者选项,电视则可能藏在工厂菜单里:设置 -> 本机信息 -> 使用遥控器输入特殊操作码,进入工厂菜单后就能看到ADB开关。
这里必须说明一下“adb动态密码计算器”的原理。部分电视厂商为了防止普通用户随意打开ADB,在ADB连接时要求输入一个动态密码,密码由设备MAC地址和内置密钥计算生成,通常是一个6位数字。网上流传的“动态密码计算器”本质就是把这个计算过程自动化了:输入设备MAC,工具根据已知算法算出当天或当次有效的密码。理解原理后,计算器只是一个工具,不必迷信,因为算法和密钥都是固定的。
对付这类设备,“永久打开ADB”则需要看厂商的设置方式。部分电视在设置里开启ADB后,系统重启会重置为关闭状态。如果你只是想每次连接不用重新开开关,可以尝试通过ADB修改系统属性,比如:
adb shell settings put global adb_enabled 1 adb shell setprop persist.security.adbinput 1但请务必注意,不同电视系统的变量名和持久化机制不一样,强行设置可能导致安全风险。我的建议是:ADB调试完成后随手关闭开关,不要图方便让电视长期保持调试开启状态。毕竟电视连接着家庭网络,多一个开放端口就多一分风险。
5. 自动化脚本与踩坑实录
5.1 一台电脑的ADB自动化:定时任务与脚本化操作
ADB配合脚本可以做很多自动化操作,比如定时截图、批量安装应用、自动跑测试。很多人在热词里搜“adb 企业微信 自动打卡”,就是想在固定时间点让ADB模拟点击。原理其实不复杂:用编程脚本在设定时间执行adb shell input tap或者adb shell input swipe,模拟人手点击屏幕。
但这里我想多说一句实话:拿ADB去钻考勤规则的空子,大概率会翻车,而且涉及企业内部管理规定和考勤纪律,存在合规风险。如果你是技术爱好者,可以在自己的Demo设备上验证自动化的可行性,但不要对着真实业务系统做这种操作。从技术角度讲,自动化输入在无障碍模式下是能实现的,但可靠性远不如人手动点,稍微弹个窗就会导致流程错乱。
在正经的自动化测试领域,ADB的价值要大得多。比如对App做压力测试时,可以用循环脚本连续安装、启动、卸载应用;做兼容性测试时,同一套脚本批量跑多个模拟器端口。结合Python的subprocess模块,或者直接写shell脚本,ADB都能成为很顺手的“自动化手臂”。
5.2 常见问题速查表
把我在评论区、私信里被问得最多的问题集中列一张表,方便你查阅:
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 输入adb devices显示“device unauthorized” | 手机没有允许电脑授权 | 手机上撤销调试授权并重新连接 |
| adb install安装失败报“INSTALL_FAILED_UPDATE_INCOMPATIBLE” | 签名不一致 | 先adb uninstall旧包再安装 |
| adb push文件一直卡着不动 | 文件太大或USB传输速率慢 | 检查USB线,改为Wi-Fi ADB连接 |
| 修改刷新率后屏幕闪烁 | 设置的刷新率超过屏幕硬件支持范围 | 用adb shell wm size reset或重置恢复 |
| 使用pm disable-user误冻结了桌面或系统UI | 命令打错包名 | 用pm enable包名恢复,必要时恢复出厂设置 |
| adb连接电视box一直连不上 | 电视ADB未开启,或需要动态密码 | 先进入工厂菜单确认ADB开关状态 |
我建议把这张表保存一份,哪天连不上设备就对照着查一遍,比到处问人要快得多。
5.3 我在实际调试中总结的避坑清单
最后分享几条只有踩过坑才会注意到的经验。
第一,别在公共电脑上开启ADB调试并保存授权。一旦电脑上留下RSA密钥,陌生人插上手机就能通过ADB安装恶意应用,甚至读取应用数据。调试完务必在手机上“撤销USB调试授权”。
第二,adb命令写错包名不可怕,可怕的是对系统组件乱用disable-user。我见过有人把系统输入法冻结了,结果屏幕弹不出键盘,最后只能恢复出厂设置。操作之前用pm list packages确认包名、确认这个App的真实用途再动手。
第三,不同品牌的设备对settings put命令的接受程度不一样。小米、vivo、OPPO、三星都有自己的定制字段,网上的命令不能照搬,最好先执行settings list看当前支持哪些配置项。改之前建议记下原始值,改坏了能迅速恢复。
第四,ADB工具本身记得定期更新。各厂商系统版本迭代很快,旧版adb有时无法识别新版Android设备会直接显示offline,更新platform-tools到最新版能避免大量排查时间。我用这个简单方法解决过好几台手机的offline问题。
个人的一点体会
玩ADB这几年,最大的感受是:命令本身不值钱,值钱的是排查问题的思路。很多人第一反应是找一条“万能命令”,但实际遇到问题后会发现,同一句命令在不同设备上的表现可能完全不同。与其背命令,不如先把连接链路弄明白——电脑、服务、通道、授权、驱动,每一步都通,后面自然顺畅。另外,每次拿到一台新设备,我习惯先adb shell getprop ro.product.model看下机型信息,再决定接下来的操作方向,这个习惯帮我避了很多雷。ADB这套东西,多试多折腾,经验自然就来了。