1. 先理解ADB的底层逻辑:它到底是一条什么"桥"
如果你只是想在电脑上敲几条命令控制手机,那确实不用先把ADB的源码翻一遍。但现实是,我见过太多新手卡在同一个小地方:照着教程输入 adb devices,结果设备列表是空的,或者前面顶着一个 unauthorized,然后开始怀疑人生。这些问题的根子,几乎都出在没搞懂ADB的基本工作方式上。
ADB全称Android Debug Bridge,官方定位是"调试桥"。桥意味着它连接两岸,一头是你的电脑,另一头是安卓设备。先把这个框架装进脑子里,你才知道为什么有些命令必须加 adb shell,为什么插上手机没反应要先查驱动,为什么服务器偶尔抽风需要重启。这篇笔记就按我自己的学习路径来写:先讲原理,再搭环境,然后按需求过命令,最后把日志抓取和常见异常一次说清楚。
1.1 三端架构:Client、Server、adbd怎么分工
ADB由三部分组成:Client、Server、adbd。Client就是你电脑上敲的 adb 命令本身,负责把指令打包;Server是电脑后台常驻的一个服务进程,默认监听本机5037端口,负责发现设备、维护设备列表、转发指令;adbd则是运行在安卓设备上的守护进程,手机开启USB调试后由系统启动,接收Server传来的命令并在设备上执行。
用生活化的比喻:Client是前台客服,Server是调度中心,adbd是执行任务的办事员。你在前台说需求,前台转给调度中心,调度中心分配到具体办事员,办事员办完再把结果原路返回。
这里有个新手容易忽略的点:为什么不直接连设备,非要经过Server这一层?因为设备可能通过USB、网络、模拟器等多种通道接入,Server统一管理这些连接,还允许多个Client共享同一个服务进程。理解了这层,你就明白为什么很多教程强调"保持Server干净",也就能理解后面要说的 adb kill-server 为什么能解决一堆玄学问题。
1.2 为什么命令不好使时,总让你先kill-server
几乎所有ADB疑难杂症的通用开场白都是 adb kill-server 然后 adb start-server。核心原因是Server是常驻后台进程,它内部缓存着设备状态。当手机休眠、USB线被快速拔插、电脑上同时装了多个手机助手时,Server里的状态可能已经过时,导致设备一直显示 offline,或者指令发出去了没有响应。
kill-server 等于把整个调度中心推倒重建,所有设备重新被发现、重新握手,80%的连接类问题在这一步就能解决。这个操作代价极低、速度极快,所以遇到任何异常都值得先执行一轮"重启ADB服务",再往下排查。
1.3 新手学ADB前,先想清楚要用它干什么
ADB的学习路径因人而异。开发者需要它来安装调试包、抓崩溃日志、做自动化测试;玩机用户需要它来冻结预装应用、修改系统设置、清理厂商全家桶;还有一批人是为了给智能电视或电视盒子安装第三方软件、精简开机广告。目标不同,需要的命令清单完全不同。
我的建议是:别贪多,先明确一个具体需求。比如"把某个预装应用冻掉",就学 pm disable-user 相关几条命令;"想抓个闪退日志",就学 logcat 的过滤。带着问题去查、去用,用一次记一次,比从头到尾背命令有效得多。下面我就按"搭建环境→常用命令→日志抓取→进阶操作→异常排查"的顺序,把各个场景串起来讲。
2. 环境搭建:驱动、工具包、开发者选项,一步都别省
2.1 选择工具包:官方Platform Tools还是15秒安装器
ADB不是手机上的应用,而是电脑上的一组命令行工具。最推荐的来源是Android开发者官网的Platform Tools,解压出来就包含 adb.exe、fastboot.exe 等文件,Windows、macOS、Linux都有对应版本。国内用户如果官网下载不方便,也可以通过Android Studio自带的SDK Manager拉取,或者找正规大厂的镜像站。
解压之后有两种用法:一是每次都在解压目录里打开命令行操作,能用但麻烦;二是把目录路径加入系统环境变量PATH,这样在任意路径下都能直接敲 adb 命令。我强烈建议用第二种,一次配置,长期受益。
对Windows用户来说,如果不想手动配环境变量,可以考虑"15 seconds ADB Installer"这类一键安装器。它会自动把Platform Tools装到系统目录、配置好PATH,还附带驱动安装选项,比较适合不爱碰系统设置的朋友。不过这属于民间打包,下载时注意来源,安装时留个心眼,别被捆绑软件顺带装进电脑。
2.2 驱动安装的两个经典坑
Windows下连接安卓设备,第一个坎就是驱动。坑一:设备管理器里能看到一个带黄色感叹号的设备,显示为"Android"或"ADB Interface",说明驱动没正确安装。解决办法是右键更新驱动程序,手动指定到Google USB Driver或对应厂商驱动的解压目录。网上搜"机型+USB驱动"能找到各大厂商的官方驱动包,三星、小米、华为这些都有专门页面。
坑二:电脑上装了各种手机助手、刷机工具、模拟器,它们自带的ADB驱动版本很杂,可能互相覆盖。具体表现是:手机一插上,系统托盘弹出助手通知,然后 adb devices 里设备秒变offline。所以正式使用ADB前,把同类工具退出,最好卸载掉不需要的,只保留你真正要用的那套平台工具。
2.3 手机端准备:开发者模式、USB调试和授权弹窗
手机端准备工作就两步。第一步打开开发者选项,标准路线是"设置-关于手机-连续点击版本号7次",不同厂商入口位置有差别,但思路一样。第二步进入开发者选项,打开"USB调试"。部分机型还有"USB安装""USB调试(安全设置)"这类子开关,建议一并打开。
用数据线连接电脑后,手机屏幕会弹出"是否允许USB调试"的对话框,同时显示一串RSA指纹。这时候要在手机上勾选"始终允许",再点允许。很多人就是栽在这里:电脑上 adb devices 显示 unauthorized,其实是手机上的弹窗没点,或者之前手滑点了"不允许"。这是新手阶段最高频的异常,后面的排查章节我会展开讲。
2.4 无线连接:Android 11配对码和传统tcpip方式
ADB不一定要用数据线。手机和电脑在同一个局域网内时,可以走无线调试。Android 11及以上系统在开发者选项里提供了"无线调试"开关,开启后选择"使用配对码配对设备",电脑上执行 adb pair 手机IP:配对端口,输入屏幕上的配对码,完成配对后再执行 adb connect 手机IP:调试端口 即可连接。
老版本系统则需要先在USB连接状态下执行 adb tcpip 5555,让设备的5555端口开始监听,然后拔掉数据线,执行 adb connect 手机IP:5555。无线调试连不上的常见原因有三个:电脑和手机不在同一网段、路由器开了AP隔离、系统防火墙拦截了5037或5555端口。遇到连不上,按这三个方向查,大概率能解决。
3. 新手高频命令实战:按需求分组记,比死背强多了
3.1 设备状态三连:devices、get-state、version
一切操作开始前,先用 adb devices 确认设备在线。这个命令列出当前连接的所有设备,正常状态是 device;如果显示 unauthorized 是授权问题,显示 offline 是连接异常。adb devices -l 能看更多信息,比如设备型号和传输方式。adb get-state 返回设备状态,adb version 查看当前ADB版本。
这里有个多设备场景容易被忽略:电脑同时连着手机和模拟器时,devices 列表会全部显示,操作命令默认发给唯一设备;如果有多个设备,就必须用 adb -s 设备序列号 指定对象,否则命令会直接报错。序列号在 adb devices 输出的第一列,先看清楚再操作。
3.2 应用管理:安装、卸载、冻结、恢复
应用相关命令是日常使用频率最高的一组,我按用途拆开说。
- 安装应用:
adb install app.apk,加-r表示覆盖安装并保留数据,加-d允许降级安装,加-t允许安装测试包。日常最常用的是adb install -r。 - 卸载应用:
adb uninstall 包名卸载普通第三方应用。如果是系统应用,可以用adb shell pm uninstall --user 0 包名实现"当前用户卸载",效果等同于隐藏并移除,恢复时用adb shell pm install-existing 包名。 - 查看应用列表:
adb shell pm list packages -3列出所有第三方应用,不加-3就列出全部,后面可以接grep过滤关键字。 - 冻结应用:
adb shell pm disable-user --user 0 包名,冻结后应用图标消失、无法运行,恢复用adb shell pm enable 包名。冻结比卸载安全,因为它不修改系统分区,出问题随时能恢复。
经验提醒:冻结系统应用之前,先搜索确认包名对应什么功能。冻结桌面、设置、输入法、系统UI这类核心组件,很可能直接导致桌面崩溃或者设置打不开。我自己的习惯是每冻结一个包就立刻看看桌面和设置是否正常,确认无误再继续下一个,不批量操作。
3.3 截图录屏与文件互传
截屏最稳妥的姿势是两条命令:adb shell screencap -p /sdcard/screen.png先在手机上生成图片,再adb pull /sdcard/screen.png拉回电脑,也可以用&&连起来一次执行。
之所以不推荐直接写adb exec-out screencap -p > screen.png,是因为Windows的PowerShell里,重定向符默认按文本处理二进制数据,保存下来的PNG文件往往损坏打不开。Linux和macOS终端下exec-out方式没问题,Windows用户老老实实先存手机再pull。
录屏对应adb shell screenrecord /sdcard/video.mp4,在电脑终端按Ctrl+C停止。默认时长上限180秒,可以用--time-limit限制时间、--size限制分辨率、--bit-rate控制码率。文件互传反向操作是adb push 本地文件 手机路径,比如adb push test.apk /sdcard/。传大文件其实还是MTP模式直接拖拽更快,ADB更适合传少量配置和小文件。
3.4 模拟点击和文字输入(含ADB键盘)
adb shell input系列命令是自动化爱好者的心头好。adb shell input tap x y模拟点击屏幕坐标,adb shell input swipe x1 y1 x2 y2模拟滑动,后面加一个数字可以控制滑动时长。adb shell input keyevent每个数字对应一个按键,我列几个常用的:
| 键值 | 功能 |
|---|---|
| 3 | 主页 |
| 4 | 返回 |
| 187 | 多任务 |
| 66 | 回车 |
| 24 / 25 | 音量加 / 音量减 |
| 26 | 电源键 |
输入文字用adb shell input text "hello",但要注意它默认只支持ASCII字符,中文和特殊符号常常失败,空格要用%s代替。为了解决中文输入问题,社区里流传着一个叫"ADB键盘"的输入法应用,安装后启用并切换为当前输入法,再执行 input text 命令,内容会通过该输入法送达文本框,中文英文都能输入。切换命令是adb shell ime enable 包名/服务名和adb shell ime set 包名/服务名,先用adb shell ime list -s看看系统里有哪些输入法。
这套模拟能力常被用来做定时任务、无障碍辅助之类的自动化,比如有人拿它实现企业微信自动打卡。我得提醒一句:任何自动化操作前,先确认不违反公司制度、不涉及数据造假,合规使用才是正路。
4. adb logcat抓日志:一坨输出里怎么捞有效信息
4.1 输出格式与优先级过滤
logcat是安卓系统的日志系统,ADB可以把设备上的日志实时输出到电脑终端。别以为日志只有开发者才用,应用闪退、后台异常、系统卡顿,日志都是第一手证据。
裸敲adb logcat输出量巨大,所以必须学会过滤。每条日志包含日期时间、PID、TID、优先级、标签、消息内容。优先级从低到高依次是 V、D、I、W、E、F、S,对应Verbose、Debug、Info、Warn、Error、Fatal、Silent。过滤表达式用"标签:优先级"的格式,adb logcat *:E表示只看Error及以上,adb logcat ActivityManager:I *:S表示只看ActivityManager标签的Info及以上,其他全部静默。
| 优先级 | 含义 |
|---|---|
| V | 详细,最啰嗦 |
| D | 调试 |
| I | 信息 |
| W | 警告 |
| E | 错误 |
| F | 致命 |
| S | 静默 |
4.2 按应用包名/PID精确过滤
定位某个应用的日志,最有效的办法是先拿到应用进程号,再按PID过滤。命令组合是adb shell pidof 包名获取PID,然后adb logcat --pid=该PID,输出里就只剩这个应用进程的日志。新版ADB都支持--pid,老版本不支持时可以用adb logcat | grep 包名代替,虽然会有遗漏,但多数场景够用。
还有一个实用参数是-b。logcat日志按缓冲区划分:main是应用主日志,system是系统日志,crash是崩溃日志,events是事件日志。平时我们看的是main,但应用崩溃时,crash缓冲区的信息往往更直接。命令是adb logcat -b crash -d。加-d是dump模式,把当前缓冲区内容打印完立即退出,不会一直挂在那里刷屏。
4.3 复现问题时的标准日志抓取流程
正确抓日志的姿势不是问题发生了才开跑,而是先清空,再复现,最后落盘。具体流程:先执行adb logcat -c清空日志缓冲区,然后正常复现问题,最后adb logcat -d > log.txt把全部日志保存下来。这样log.txt里的内容就是问题发生前后的完整上下文,分析价值最高。
日志文件通常很大,拿到后先用关键词搜索,比如报错信息里的核心词、应用包名、崩溃类名,逐层缩小范围。Windows下看大文本文件别用记事本,几MB的文件会卡到你怀疑人生,建议用支持大文件搜索的文本工具。
另一个经验是:部分厂商ROM对logcat做了限制或过滤,如果发现日志不完整,检查开发者选项里有没有"日志记录器缓冲区大小"之类的选项,调大缓冲区再试。
5. 进阶玩法:权限授予、刷新率调整、禁止联网与精简系统
5.1 不root授权:pm grant与appops的妙用
很多应用要求的权限不需要root,通过ADB就能授予,核心是两个机制:pm grant用于授予危险权限,appops用于修改应用操作开关。比如给应用授予悬浮窗权限,执行adb shell appops set 包名 SYSTEM_ALERT_WINDOW allow;授权无障碍权限,要用adb shell settings put secure enabled_accessibility_services 包名/服务组件名再加上adb shell settings put secure accessibility_enabled 1。
这些操作对自动化测试和辅助功能开发很有用,很多"跳过开屏广告"类工具背后就是这套思路。提醒一下:settings put 修改的是系统配置,操作前最好先adb shell settings get看一下当前值,动手前记下原值,方便回滚。改错了别慌,把原值写回去就行。
5.2 屏幕刷新率、分辨率、DPI的修改和还原
现在的手机普遍是高刷屏,但部分机型默认不给满血刷新率。用ADB可以强制修改:adb shell settings put system peak_refresh_rate 120和adb shell settings put system min_refresh_rate 120,两条都设成120,系统就会倾向于以120Hz运行。查看当前值用adb shell settings get system peak_refresh_rate。不同机型字段可能不同,有的在global表里,有的叫refresh_rate,可以先get相关字段看看。
改分辨率用adb shell wm size 1080x1920,改DPI用adb shell wm density 420,改完立即生效。恢复用adb shell wm size reset和adb shell wm density reset。分辨率改小可以省电、降低渲染压力,但图标布局会变,部分应用可能显示异常;DPI改小则让界面显示更多内容、看起来更精致。这类修改属于系统级设置,如果改完屏幕显示异常,别慌,用reset命令恢复即可。前提是你记得命令,所以我建议把这类常用命令提前存成脚本文件。
5.3 禁止应用联网的操作和版本差异
后台偷偷联网、频繁弹广告、上传数据,这类问题很多人装第三方防火墙,但其实有个不用root的办法:adb shell appops set 包名 INTERNET deny。AppOps是安卓的应用操作权限框架,INTERNET开关对应网络访问能力,设为deny后该应用无法联网。
注意两点:第一,这个命令在Android 10及以上系统上效果明显,部分老版本或厂商定制UI不生效;第二,恢复联网用adb shell appops set 包名 INTERNET allow。我实测过,某些国产机型上应用走系统通道时,appops拦不住,这时候要么root后配合防火墙,要么就接受现实。禁网前先想清楚目的:为了去广告、防止后台上传、还是避免应用联网校验,目的明确再动手。
5.4 vivo、小米等机型的安全精简思路
网上经常看到"vivo adb精简列表""红米k70能冻结吗"这类帖子,本质上是教人用pm disable-user --user 0批量冻结厂商预装应用。这类列表可以参考,但不要照抄,因为同品牌不同型号、不同系统版本,包名和依赖关系差异很大。
我的做法是:先导出自己机器上的包名列表,adb shell pm list packages,逐个搜索确认功能,再决定是否冻结。优先冻结的通常是游戏中心、应用商店推荐位、广告服务、浏览器、视频音乐等无关应用。但凡名称里带launcher、systemui、settings、input、telephony、packageinstaller的组件,一律不碰。
精简系统的原则是"最小干预":能不动的就不动,宁可保留广告也不冒着弄崩系统的风险乱删。冻结后先用几天观察稳定性,某个功能异常了,用adb shell pm enable 包名解除冻结即可。在你确实清楚后果之前,永远选择冻结而不是卸载。
6. 连接异常排查:unauthorized、offline、模拟器和电视
6.1 unauthorized的成因与两条解决路径
这是新手提问区第一名。现象是 adb devices 输出设备名后面跟着 unauthorized。原因只有一个:手机没有确认电脑的RSA指纹授权。首次连接时手机应该弹出"允许USB调试"对话框,很多人没注意到,或者系统弹窗被拦截了;也可能是之前选过"不允许",授权被记录为拒绝。
解决办法分两条路。第一,在手机上撤销授权后重新插拔:进入"开发者选项-撤销USB调试授权",然后拔线重插,弹出对话框时勾选"始终允许"并确认。第二,命令行重启ADB服务:adb kill-server再adb start-server,有时是Server端缓存了旧的设备状态。这两招解决不了再查驱动,但九成unauthorized都在这里解决。
6.2 设备offline或反复断开的排查顺序
设备显示 offline,或者连接一两秒就断开,常见原因按出现概率排:USB线或接口问题、驱动版本冲突、手机锁屏后休眠断连、多个ADB服务互相抢占。
排查顺序我建议这样:先换一根数据线,尤其要确认是能传数据的数据线而不是纯充电线;再换USB口,优先主板直出的USB口,不要经过拓展坞;然后退出电脑上的手机助手类软件;最后adb kill-server重启服务。如果手机锁屏后必定断连,把开发者选项里的"屏幕不休眠"打开,或者连接时保持屏幕常亮。
还有一个容易被忽略的点:手机连接电脑后,下拉通知栏把USB用途从"仅充电"改成"文件传输/MTP",部分机型必须在这个模式下ADB才正常。
6.3 夜神等模拟器的ADB连接姿势
电脑上装了模拟器,模拟器通常自带一套ADB环境,系统PATH里的ADB和模拟器内置的ADB版本可能不一致,两边容易打架。最常见的现象是模拟器设置里显示"未检测到ADB",或者电脑端 adb devices 看不到模拟器。
解决办法很简单:在模拟器设置里找到"ADB调试"选项,一般会显示模拟器监听的端口,然后用电脑的 adb connect 127.0.0.1:端口 手动连接。不同模拟器默认端口不同,我整理了一份参考:
| 模拟器 | 常见ADB端口 |
|---|---|
| 夜神老版本 | 62001 |
| MuMu | 7555 / 5555 |
| 雷电 | 5555 |
| BlueStacks | 5555 |
如果连不上,先在任务管理器里把所有 adb.exe 进程都结束,再用自己本地的ADB重新 connect。连接成功后在模拟器里安装APK、抓日志、模拟点击,操作逻辑和真机完全一样。顺带说一句:模拟器走网络连接,天然没有USB驱动问题,新手练手完全可以用模拟器,省去一堆物理连接的烦恼。
6.4 老款创维电视开ADB的思路
智能电视和电视盒子本质是安卓系统,自然也可以用ADB。老款创维电视开启ADB的方式,不同固件差别很大,常见思路绕不开"进入工厂菜单"这一步。比较普遍的说法是在设置-本机信息页面,通过遥控器特定按键组合进入工厂模式,然后在工厂菜单里打开ADB开关。也有部分机型需要先安装第三方应用市场,再通过市场装一个ADB开关工具来修改系统属性。
具体到某一台电视,最靠谱的办法是去对应品牌的论坛搜"型号+工厂模式"或"型号+开启ADB",因为每个固件的入口都不一样。开启ADB后,如果电视支持网络并且你知道IP,就可以adb connect 电视IP:5555连接,然后做安装第三方应用、冻结系统应用之类的操作。
提醒一句:电视精简和手机一样有风险,冻结错了可能导致无法开机,操作前务必谨慎。如果只是单纯想给电视装个软件,直接用U盘装APK可能更省事;ADB是给那些被限制安装,或者需要移除系统应用的人准备的。
最后分享一点个人体会。ADB这个工具,刚接触时满眼都是命令、毫无头绪,但一旦建立起"客户端-服务端-设备端"这个框架,往后遇到任何问题都有了排查方向——要么是设备没连上,要么是权限没给够,要么是服务状态坏了。我自己的习惯是把常用命令写成带注释的脚本,比如"截图并拉回""抓日志并保存""先查询再冻结应用",需要的时候一键执行,既省时间又减少出错。新手的正确打开方式,不是把教程从头背到尾,而是带着一个具体的需求去用,用完一次记一次,用得多了,命令自然就长在脑子里了。