
平时折腾安卓设备不管是手机、平板还是电视盒子只要涉及深一点的调试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、关闭动画这些在部分手机上不需要rootADB就能做到。电视盒子折腾老款电视、电视盒子大多没有键盘鼠标打开ADB后用电脑remote操作比遥控器按来按去效率高太多。如果你也想把这些场景变成自己的技能库下面的内容按顺序看就行。环境配置部分我尽量写细一点因为很多命令本身不难难的是第一步设备连不上。2. 环境配置和连接排障从adb unauthorized到模拟器端口2.1 三步配好ADB环境ADB工具本身不需要安装它就是一个命令行工具包。正规做法是下载Android官方发布的platform-tools压缩包解压后里面有adb.exeWindows下还有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-5554Android 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秒超过时间会自动停止。需要停止的时候按CtrlC即可。要把视频拉回电脑再用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这套东西多试多折腾经验自然就来了。