☰
ADB调试实战指南:从环境搭建到高频命令与电视盒子玩法
2026/10/1 8:58:30 网站建设 项目流程

平时折腾安卓设备,不管是手机、平板还是电视盒子,只要涉及深一点的调试,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

不同模拟器端口不一样,常见的端口我整理一下:

模拟器端口
夜神 Nox62001(有时也会用62025)
网易MuMu7555,新版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设备端未授权,或授权被误拒撤销调试授权后重新连接,弹窗时务必点允许
显示offlineadb版本与设备端不兼容,或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这套东西,多试多折腾,经验自然就来了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询