
很多人的adb入门体验其实不太愉快手机插上电脑驱动装了半天好不容易在cmd里敲出adb devices结果要么是空荡荡的一行“List of devices attached”要么就是一句冷冷的“unauthorized”再问群里得到的回复往往是“换根线试试”。我第一次接触adb的时候也卡在这几步上当时心里挺郁闷的——明明开了USB调试手机上也点了允许怎么就不认呢后来把adb的底层机制啃了一遍才明白这套东西的逻辑并不复杂。它本质上就是一条从电脑到安卓设备的标准调试通道只是大多数人一开始只背命令不究原理遇到问题自然只能瞎猜。这篇内容我打算把这些年的经验串一遍从原理讲到实操覆盖环境搭建、设备连接、常用命令以及电视盒子这类特殊设备的真实玩法。适合刚接触adb的开发者也适合那些偶尔需要用它解决一次设备问题的普通用户。1. 先搞懂adb在背后干了什么再谈操作不少人在学adb时一上来就背命令遇到问题全靠搜索结果就是这次解决了下次又踩。我建议先花点时间搞清楚这套机制adb全称Android Debug Bridge翻译过来就是“安卓调试桥”。它由三部分组成Client、Server、Daemon。Client就是你在电脑终端里敲的adb命令本身负责接收用户输入Server是运行在电脑后台的服务进程默认监听5037端口相当于调度中心Daemon是运行在安卓设备里的adbd进程真正执行命令的干活主力。三者的关系我常用一个外卖场景类比Client是你下单用的AppServer是平台调度系统Daemon是骑手。你敲一条指令App把需求传给调度系统调度系统找到对应骑手骑手跑腿执行结果再沿着原路返回。为什么要区分这三个角色因为调试场景里电脑可能同时连着多台设备Server需要统一维护设备列表另一端设备端的adbd需要跟Server做端到端通信。如果所有命令都直接由Client点对点发到设备多设备管理会变得非常混乱。理解了这层结构很多报错就不用慌了。1.1 第一次连接时的授权窗口本质是密钥交换很多新手第一次插上手机敲adb devices后设备状态会显示为unauthorized同时手机上弹出一个“是否允许USB调试”的对话框。有人习惯性点了“允许”有人手滑点了“不再询问”结果下次换台电脑又一脸懵。这个弹窗的本质是密钥交换。电脑端的adb会生成一对RSA密钥第一次连接时把自己的公钥发给设备设备弹窗询问用户是否信任这台电脑。点“允许”之后电脑的公钥被存到设备端以后这台电脑再连接就不用重复询问。这个过程和SSH首次连接时确认主机指纹的逻辑很像只是adb把密钥预置在~/.android/adbkey中Windows下是C:\Users\用户名\.android。如果你发现同一台电脑连接新设备时反复要授权或者直接卡在unauthorized处理方式很简单到手机的开发者选项里找到“撤销USB调试授权”点一下再重新连接强制双方重新走一遍密钥交换流程。设备端存的是公钥电脑端存的是私钥只要其中一侧的密钥变了握手就会失败这是理解授权问题的基础。1.2 端口和“-s”参数多设备环境下怎么交流Server监听在电脑的5037端口adbd在无线调试时监听设备的5555端口但很多人会把这两个端口搞混。其实只要记住5037永远在电脑上5555是无线调试时设备上的监听端口。查询当前连接状态用adb devices就够了它会列出设备序列号和当前状态device、unauthorized、offline。多台设备同时连着电脑时命令如果不指定设备Server会报“more than one device”。这时候在命令前面加adb -s 设备序列号就能把命令定向到某一台。比如adb -s 192.168.1.100:5555 install app.apk adb -s 0123456789ABCDEF shell dumpsys battery这就是多设备调试的基础写法后面做自动化脚本时还会用到。adb devices输出里第一列就是序列号无线连接时序列号通常是“IP:端口”的格式。2. 环境搭建中最容易翻车的三个环节驱动、环境变量、设备识别环境搭建本身不难但有几个坑几乎是新手必踩的。我这些年帮人排过不少环境问题问题基本集中在三个环节工具的来源、驱动的匹配、环境变量的配置。2.1 用官方platform-tools别碰第三方“一键包”第一步是下载adb工具包。现在网上能搜到一大堆“ADB一键安装包”我不建议用原因有两个一是版本老旧某些新机型连上后可能识别不到二是有安全风险第三方打包的东西你没法保证里面没有捆绑或后门。正确做法是去Google官方下载SDK Platform Tools对应地址是developer.android.com的Tools页面。下载解压后就是一个platform-tools目录里面有adb.exe、fastboot.exe等文件绿色免安装。我习惯把它放到固定路径比如C:\adb方便后面配环境变量。2.2 驱动问题的完整排查链路Windows上最邪门的环节就是驱动。手机插上电脑后系统经常只把它识别成“便携设备”MTP而不是调试用的ADB接口。这时候adb devices输出就是空的。很多人在这一步卡住其实原理不复杂Windows需要把手机的USB接口以“ADB Interface”或“Android Composite ADB Interface”的方式枚举出来adb server才能跟设备通信。不同的枚举模式对应不同的驱动驱动缺失或版本不对设备就“隐身”了。排查链路我一般按这个顺序走确认手机开启开发者选项和USB调试。部分国产手机还需要在“开发者选项”里额外打开“USB调试安全设置”之类的二级开关。确认USB连接模式。通知栏里把USB用途从“仅充电”改成“文件传输/MTP”纯充电模式下很多机型不会暴露ADB接口。打开设备管理器查看“便携设备”或“Android Device”下面有没有带黄色感叹号的项。有感叹号说明驱动没对上。右键更新驱动手动定位到Google USB Driver解压目录或者安装手机厂商的USB驱动。拔插一次数据线再运行adb devices。之前有位朋友用的华为手机电脑上一直没弹出“Android Composite ADB Interface”和“HDB”相关的驱动项折腾了好几天。最后发现是系统自动装了MTP驱动但没装ADB驱动设备管理器里挂着黄色感叹号。手动更新驱动后立刻就好了。这类现象在Windows 10、11上格外常见因为系统会自动“匹配”驱动但匹配到的未必是对的。2.3 环境变量配置让adb命令在任何目录都能用环境变量配好之前你得在cmd里先进到platform-tools目录才能运行adb.exe很不方便。配置方法很简单Windows系统属性-高级-环境变量在Path里新增platform-tools所在路径如C:\adb确定后重新开一个cmd窗口输入adb version能打印版本号就成功了。macOS和Linux则是把export PATH$PATH:/你的路径/platform-tools这行追加到~/.zshrc或~/.bashrc然后source一下。这里有一个很小的坑修改完环境变量后已经打开的cmd窗口不会自动生效必须新开一个。这不是你配置错了是窗口缓存了旧的环境变量值。2.4 adb devices “无设备”的一站式排查表下面的表格是我排查“无设备”问题时最常用的清单建议收藏。现象可能原因处理方式完全看不到设备线材只支持充电不支持数据换一根质量好的数据线尽量短一点能看到设备但状态unauthorized授权弹窗未确认或密钥过期手机端确认弹窗或撤销授权重连设备状态offlineadb server状态异常或端口被占用执行adb kill-server再adb start-server设备管理器有黄色感叹号驱动不对手动更新为ADB Interface驱动只有便携设备没有ADB接口USB模式不对切到文件传输/MTP模式设备曾经能连突然不行开发者选项被关闭或USB调试被重置重新开启并拔插表格里的每一项我都踩过尤其是offline状态和线材问题出现的频率远比你想象中高。3. 设备连接与权限管理USB、无线与unauthorized机制设备连接分两种方式USB线和无线网络。日常开发调试绝大多数场景用USB就够但电视盒子、智能音箱这类没有屏幕或屏幕难操作的设备无线连接反而是主力方案。3.1 USB连接的正确姿势先说USB连接的标准流程。以一台安卓手机为例在设置中找到“关于手机”连续点击“版本号”7次直到提示进入开发者模式。回到设置主界面进入“开发者选项”打开“USB调试”。用数据线连接电脑通知栏选择“文件传输/MTP”模式。手机弹窗询问是否允许USB调试勾选“一律允许”再点确定。电脑端运行adb devices看到状态为device即成功。有几处容易被忽略开发者模式入口在一些深度定制系统上可能藏得比较深比如某些品牌会把“版本号”放在“关于”的二级菜单里部分手机在插入线缆后如果选择“仅充电”甚至不会弹授权窗口所以MTP模式这个细节不要跳过。3.2 无线连接为什么必须先USB连一次无线调试的命令只有两条adb tcpip 5555 adb connect 192.168.x.x:5555但有一个前提第一次必须用USB线连接并完成授权然后才能执行adb tcpip 5555让设备的adbd开始监听5555端口。之后拔掉USB线再用adb connect连接设备的局域网IP即可。有人会问为什么不能一开始就直接adb connect呢因为无线调试端口默认是关闭的。之所以这么设计就是要保证只有已经通过USB建立过信任关系的电脑才有权限打开网络调试入口否则同一个局域网里的任何设备都能随意连接安全上直接无法接受。这个“先USB信任后无线连接”的模型和路由器首次配置的机制有很多相通之处。3.3 adb unauthorized的套路化排查unauthorized是被问得最多的一个状态它的本质是设备端没有这台电脑的信任密钥。按下面的顺序处理成功率最高手机屏幕亮着吗如果弹窗出来了点“允许”。如果之前勾了“不再询问”却没点允许弹窗不会再出得去开发者选项撤销授权重来。没弹窗拔线重插或者在开发者选项里点“撤销USB调试授权”。还是不行执行adb kill-server再adb start-server重启电脑端的server进程。如果上面都不行确认一下电脑上有没有多个adb版本在打架。曾经有一台电脑装了Android Studio自带的adb、platform-tools和某模拟器自带的adb三个版本同时存在端口冲突导致授权一直失败。最后把其他版本从PATH里去除只保留一个问题秒解。务必注意adb授权等于把自己手机上大量的调试能力全部交给这台电脑不要在公共场所乱点陌生电脑的“允许”弹窗。4. 高频命令的底层逻辑与实战组合基础环境搞定后命令本身反而不难。难的是理解每条命令在背后做了什么理解了之后组合起来就会很顺手。4.1 安装与卸载为什么用命令行更可控安装应用的命令adb install -r app.apk adb install -r -d app.apk-r表示覆盖安装并保留数据适合升级版本时用-d允许降级安装适合把新版本回退到旧版本。这些能力手机自带的安装器不一定支持尤其降级安装很多时候在UI上根本找不到入口。卸载命令adb uninstall com.example.app adb shell pm uninstall --user 0 com.example.app第一条是普通卸载用户应用第二条可以指定用户ID在某些场景下甚至能卸载部分系统应用。恢复系统应用用adb shell pm install-existing 包名。关于对系统应用的卸载我强烈建议只在确有需要时操作并且记录好包名方便恢复。网络上一键精简脚本经常删除一些看似无用的系统组件但厂商深度定制的系统里组件间依赖关系很隐蔽删了某个服务可能桌面崩溃、通知异常甚至无法进入桌面。4.2 shell命令从图形界面之外直接操作系统adb shell命令是另一个高频入口。adb shell后面跟的是Linux shell命令比如adb shell ls /sdcard/ adb shell cat /proc/meminfo adb shell dumpsys batterydumpsys尤其值得研究它是一个系统服务状态转储工具后面可以跟battery、package、activity、window等关键字能拿到图形界面看不到的系统状态比如电池温度、分辨率、当前Activity栈。启动一个应用也可以走命令行adb shell am start -n com.example.app/.MainActivity后面跟的是“包名/Activity完整类名”。如果不知道Activity名可以用adb shell cmd package resolve-activity --brief 包名或者直接用monkey命令adb shell monkey -p com.example.app -c android.intent.category.LAUNCHER 1monkey这条命令本质是通过Monkey工具发出一个系统级的启动Intent它比直接写死Activity名称省事在不知道入口Activity时经常用。注意后面的数字“1”代表只发送一次事件不加数字的话monkey会持续产生随机操作事件这个区别很多人会忽略。4.3 截图、录屏与输入模拟UI自动化的地基截图有两种常见写法adb exec-out screencap -p screen.png adb shell screencap /sdcard/screen.png adb pull /sdcard/screen.png ./区别在于exec-out会直接把截图字节流输出到当前终端的stdout重定向到本地文件即可省去了在设备上存一份再pull的中间步骤。如果只是想快速截一张图第一种更高效。注意Windows的cmd重定向可能会有奇怪问题建议用PowerShell或者直接第二种。录屏命令比较特殊它会一直阻塞终端直到手动停止adb shell screenrecord /sdcard/demo.mp4按CtrlC停止停止后文件会保存到设备再adb pull到电脑。很多新手以为它卡死了实际只是还在录制。输入模拟是UI自动化的基础adb shell input keyevent KEYCODE_HOME adb shell input text hellokeyevent后面跟的是按键码常用的是KEYCODE_HOME、KEYCODE_BACK、KEYCODE_POWER、KEYCODE_APP_SWITCH。input text可以往当前输入框输入文本但它默认不支持中文这是很多人在“adb输入文本”上遇到的常见坑。想输入中文要么装ADB Keyboard这类输入法要么通过剪贴板加输入法粘贴的方式间接实现。4.4 logcat用日志定位崩溃的正确姿势抓日志是开发调试里最实用的一项。基础命令adb logcat -v time app.log加-v time会在日志行前带上时间戳CtrlC停止。但直接抓全量日志很啰嗦系统进程、网络进程、蓝牙进程的噪音全混在一起。按崩溃场景来抓的推荐组合是adb logcat -c adb logcat *:E error.log-c清空之前的缓冲区*:E只看错误级别以上的日志然后复现一次崩溃error.log里基本就是这次崩溃的关键信息。如果想要某个应用自己的日志可以用pid过滤adb shell pidof -s 包名 adb logcat --pid上面得到的pid还有Android 8.0以后独立的崩溃缓冲区查闪退可以优先用adb logcat -b crash实际操作用一个比较给力的场景复现崩溃前先-c清空缓冲区再打开App操作崩溃后立刻adb logcat -b crash拿到的日志几乎只包含这次崩溃相关内容定位效率高很多。5. 真实场景电视盒子、应用管控与多设备思路命令讲了一大堆最终还是要落到真实场景。热词里的“老款创维如何打开adb”“tcl电视第三方应用安装权限”“酷开京东打开adb”等搜索反映的就是电视和机顶盒这个特殊品类的需求。5.1 给电视盒子开启ADB调试的通用思路电视盒子这类设备跟手机最大的区别是没有触摸屏操作靠遥控器而且很多盒子的USB口要么被隐藏要么插上U盘后系统不识别。通用的开启路径是设置-关于-版本号连点7次-进入开发者模式-打开ADB调试/网络调试。不同品牌位置不一样创维和酷开系一般在设置的“关于”里TCL有的版本会放在“系统信息”或“高级设置”里。如果实在找不到直接搜“品牌型号ADB开启方法”按型号搜比自己瞎翻快得多。连接方式上没有USB口给电脑调试的盒子用无线连接更合适。先在同一局域网里让电脑能ping通盒子的IP然后直接adb connect 192.168.x.x:5555有些盒子默认开着5555有些需要先USB连接一次打开。具体要看固件实现。盒子连上之后最常见的需求就是装第三方APK。通过adb install安装很多时候可以绕开系统里“未知来源”的限制因为ADB这条通道本身就带了安装权限。这也是为什么“使用adb工具打开tcl电视第三方应用安装权限”很热门——直接在系统设置里找安装开关往往比用ADB命令还难。5.2 用adb做应用管控查看、禁用与恢复应用管理相关的命令大概就是这几个adb shell pm list packages // 查看全部已装应用 adb shell pm list packages -3 // 只看第三方应用 adb shell pm disable-user --user 0 包名 // 禁用某个应用 adb shell pm enable 包名 // 重新启用 adb shell pm install-existing 包名 // 恢复被移除的系统应用热词里“miui14精简adb删除列表”“vivo adb卸载系统软件”大概率就是这类操作。我要提醒的是网络上一键精简列表不能直接抄因为同一厂商的不同系统版本预装的包名和依赖关系变动很大。而且禁用是比卸载更安全的操作——禁用只是让应用对当前用户不可见、不启动但没有删除数据随时可以恢复。真不建议一上来就uninstall系统应用特别是厂商的账号服务、桌面、系统UI相关的包。5.3 关于adb二次开发和多设备并发的思考热词里还有一个“qml adb 多设备并发、线程池用法”说明有朋友已经在尝试把adb命令集成到自己的工具里了。大体思路没问题多台设备同时连电脑时每条命令用-s参数指定目标设备程序里用线程池并发执行每个线程持有自己的连接信息即可。不过有一个细节要注意如果程序自己启动adb server同一时间同一个adb server是全局共享的多线程并发操作时设备状态和输出是交错在一起的。稳妥的做法是每个线程执行命令时都显式加上-s参数并且不要拷贝多份不同版本的adb.exe混用避免server端口冲突。这篇文章不把这块展开太深先把单机操作吃透再谈自动化是更合理的路径。提示以上针对电视盒子和应用管理的内容只适用于你自己拥有或已获授权调试的设备。不要对他人设备或未授权设备执行任何调试操作。6. 几个能显著提升adb使用体验的小习惯最后分享一些实操层面的个人习惯不一定写在官方文档里但很管用。第一多备几根短数据线。我遇到过不少“设备连不上”的求助最后发现是线材只支持充电不支持数据传输。手机原装线大概率没问题但市面上不少“快充线”只保留电源针脚数据针脚是空的专门坑新人。第二优先用官方platform-tools并且保持更新。新系统、新机型有时候老版本adb会出现兼容问题升级tools之后莫名其妙就好了这种修复成本几乎为零。第三操作前先备份。尤其在禁用或卸载系统应用之前把包名记下来万一出现问题adb shell pm install-existing或pm enable能救命。很多人删完系统应用桌面崩溃就是因为没做这个小小的记录。第四学会重启server。当你说不清为什么出问题时先执行adb kill-server再adb start-server可以解决相当一部分诡异问题。它相当于把电脑端的调度中心重置一遍类似给电脑重启一轮。第五把常用命令写成脚本。我自己会把“连接盒子后一键安装APK并启动”写成批处理把“抓取当前应用崩溃日志”也写成脚本下次用的时候双击就能跑。adb这种命令行工具最大的价值就是可以被脚本化不要浪费这个优势。adb这套东西说到底就是一条从电脑到安卓设备的稳定通道。原理并不高深难点全在细节驱动对不对、授权有没有、命令参数带没带对。把这些细节一次弄明白后面不管是刷机、调试、抓日志还是给电视盒子装应用都会顺很多。希望这篇内容能帮你少走几步弯路。