ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

ADB从入门到进阶:安装连接、常用命令与实战排查指南

ADB从入门到进阶:安装连接、常用命令与实战排查指南 ADB这东西玩安卓的人迟早都会碰上。不管你是做开发调试、测试自动化还是单纯想折腾自己的手机把那些用不上的系统应用冻结掉、抓个崩溃日志、给手机截图录屏ADB都是一把绕不开的钥匙。很多教程要么只讲某一条命令的用法要么上来就丢一堆参数把人看晕真正从零开始、把原理和实操一次性讲透的内容反而少见。这篇文章我就按自己的使用习惯把整套ADB的安装、连接、排错到常用命令、进阶玩法串一遍。不搞那种“照着敲一遍但完全不知道在干嘛”的复读机式教学每一步都会告诉你为什么要这么做、底层发生了什么、遇到问题往哪个方向查。1. 先搞清楚ADB是什么它不只是个“命令行工具”1.1 一个类比帮你理解ADB到底在做什么ADB全称是Android Debug Bridge翻译过来是“安卓调试桥”。很多人第一次听到“桥”这个字觉得抽象我换个说法你就明白了ADB就是你电脑和手机之间的一条专用数据通道。平时你用数据线连手机电脑上只能看到存储盘这是因为手机默认开的是MTP传输协议。ADB这条通道不一样它是走Android系统内部的调试端口让电脑能直接向手机系统下发指令。你可以把它理解成给医生做手术用的内窥镜不是只看看表皮而是能直接伸到系统内部去操作。这个“桥”是三层结构的我实际排查问题的时候经常要跟这三层打交道客户端就是你电脑上运行的adb命令负责解析你的输入把指令包装好发出去。服务端当你运行任何adb命令时它会自动在电脑后台启动一个守护进程就是adb start-server干的事负责监听本机的5037端口管理所有客户端和设备的通信。守护进程手机端也会有一个对应的adbd进程服务端通过USB线或Wi-Fi连接到这个进程真正在手机上执行指令的是它。清楚了这一层结构后面很多问题你就能自己推断了。比如报错“connection refused”你第一反应就应该是服务端没起来或者端口被占用而不是去折腾手机。1.2 ADB能做什么从入门到退坑都用得上ADB的权限说大不大说小不小。它不是你手机系统的root但在很多场景下已经能操作大部分系统级功能了。我自己日常用下来最有价值的主要是这几个方向第一应用管理。安装、卸载、停用、启用应用都不需要动手点屏幕尤其在批量处理应用的时候命令行的效率比手动操作高太多了。网上流传的各种“ADB精简列表”核心原理就是通过pm包管理命令把不用的系统应用临时停用。第二日志抓取。开发或测试阶段遇到闪退、卡顿最需要的就是logcat日志。ADB可以按应用、按进程、按级别筛日志还能把日志实时输出到文件。这活儿在用户反馈“不知道怎么就崩了”的时候特别有用。第三输入模拟。通过input命令模拟点击、滑动、输入文字这在自动化测试和脚本化的场景里是利器。配合Shell脚本你能做很多看似很玄的事情比如定时自动操作、批量点击等。第四系统参数读取和控制。屏幕分辨率、刷新率、电量状态、网络连接状态、无障碍服务开关等这些都可以通过对应的命令查看和修改。配合脚本能实现很多有趣的玩法。第五文件传输。跟MTP那种图形界面拉文件的方式不同ADB的push和pull是走命令行的在拷贝大量文件、操作特定目录时稳定且可控。2. 安装ADB2023年这边建议直接下载平台工具2.1 Windows平台不用装乱七八糟的“一键安装包”网上搜“ADB安装”有不少没头没尾的“一键傻瓜包”我可以直接告诉你别用。那些包里带了什么脚本、内置了什么广告、改了什么系统配置完全不可控。官方早就提供了干净的独立工具包叫Android SDK Platform-Tools里面就包含ADB、Fastboot等核心工具体积不大随下随用。具体步骤是这样的打开Android开发者官网的下载页面开发者选项里的SDK Platform Tools页面找到Windows版本下载解压后你会看到一个platform-tools文件夹。把这个文件夹放到一个你熟悉的位置比如C:\platform-tools。为了在任意目录都能直接使用adb命令需要配置环境变量。按下Win R输入sysdm.cpl切换到“高级”选项卡点击“环境变量”在“系统变量”里找到Path编辑并新建一项填上你解压的platform-tools路径。配置完之后重新打开一个命令行窗口注意是新的窗口旧的不会生效输入adb version如果返回了版本号就说明安装成功了。配置环境变量这一步很多人会漏掉。如果你不想配置也可以每次都在platform-tools文件夹的地址栏输入cmd回车就自动在那个目录下打开命令行然后输入adb命令效果是一样的。2.2 macOS和Linux平台包管理器一条命令搞定macOS用户如果装了Homebrew直接执行brew install android-platform-tools它会把platform-tools自动链接到系统PATH里省去手动配置环境变量的步骤。如果没装Homebrew那就跟Windows一样下载macOS版本的platform-tools压缩包解压后在~/.zshrc里加上一行导出PATH的配置。Linux平台更简单Debian/Ubuntu家族直接sudo apt install android-tools-adbFedora系则是sudo dnf install android-tools装完之后同样先验证adb version是否正常输出。2.3 装完先做这三件事启动服务、杀掉服务、看设备装好ADB后不要急着连手机先熟悉三个最基本的管理命令它们对应的功能是启动ADB服务端、停止服务端、列出已连接设备adb start-server adb kill-server adb devices很多人在连接出问题时会忽略一个万能操作——先adb kill-server再adb start-server最后adb devices。这个组合拳能解决大量“看似连接正常但命令无响应”的异常情况。原理是服务端偶尔会进入不太好的状态比如5037端口被别的东西占了或某个连接句柄卡死重启服务端就能把它拉回正常状态。建议把它当成处理ADB异常的第一板斧。3. 手机端准备和连接方式USB与无线调试打通任督二脉3.1 先打开开发者选项每个安卓用户都应掌握的入口不管用USB还是无线调试手机端的准备工作是同一套。打开“设置”找到“关于手机”连续点击“版本号”7次直到提示“您已进入开发者模式”。然后回到设置首页就能看到“开发者选项”的入口了。进入开发者选项后把“USB调试”开关打开。有些手机尤其是国产ROM还藏着一个“USB安装”或“USB调试安全设置”的开关如果不打开后面用ADB安装应用时会报INSTALL_FAILED_USER_RESTRICTED权限错误。MIUI、ColorOS、OriginOS等系统都有类似的机制记得一并开启。这个操作我只提醒一次开发者选项长期打开会稍微增加一些风险比如连接陌生电脑时被授权调试。设备用完建议把USB调试关掉尤其是不懂技术的人用的手机。3.2 USB连接与首次认证为什么一定要点“允许USB调试”用数据线把手机连上电脑首次执行adb devices时手机会弹出一个RSA指纹授权框显示“允许USB调试吗”后面跟着一串电脑的指纹信息。这个授权机制是防止陌生电脑直接连上你的手机。很多人不知道这点看到弹窗习惯性点“取消”然后电脑端一直显示unauthorized就过来问为什么连不上。正确操作是在手机上勾选“始终允许使用这台计算机进行调试”然后点击允许。接着再执行adb devices状态应该从unauthorized变成device。听到手机叮咚一声响说明调试通道已经建立了。这里需要注意一个很容易踩的坑你用别人的电脑调自己的手机或者自己的电脑调别人的手机一定要看清楚那台电脑是否可信。如果误点了授权可以在开发者选项里找到“撤销USB调试授权”一键清除所有授权记录重新来过。3.3 无线调试先有线配对再无线操作无线调试可以摆脱数据线的束缚但它不是一步到位的。从Android 11开始系统内置了比较完善的无线调试功能但对很多用户来说理解这套配对逻辑需要一点耐心。操作流程是手机和电脑连接同一个Wi-Fi在开发者选项里打开“无线调试”点进去选择“使用配对码配对设备”。此时手机会显示一个6位配对码和当前手机的IP:端口。在电脑上执行adb pair 192.168.1.100:39067然后输入配对码配对成功后再查看无线调试页面显示的“IP地址和端口”用adb connect连接adb connect 192.168.1.100:37617连接成功后再执行adb devices就能看到设备了。要留神的是无线调试页面的端口每次连接都可能变化连接时不要用旧的端口号硬连。断线后重新连接时最好去手机上看一眼当前的端口。3.4 模拟器用户怎么连接ADB用夜神、MuMu、雷电这类模拟器时它们是自带ADB连接的。PC端配置好ADB工具后使用对应模拟器提供的adb连接命令即可。比如夜神模拟器默认的ADB端口是62001用adb connect 127.0.0.1:62001就能连接。不同模拟器端口可能不同建议查阅模拟器文档确认。连接成功之后ADB的用法和真机完全一致开发测试时非常方便。4. 连接故障排查ADB设备的四种状态掩藏的玄机adb devices输出的设备状态直接反映了当前的连接健康度。常见的状态有四种device正常、unauthorized未授权、offline离线和no permissions无权限。每一种都对应着一套不同的排查思路。4.1 unauthorized怎么解决unauthorized状态表示ADB能看到这台设备但手机端没有授权这台电脑。解决路径只有一条在手机上确认弹窗并允许调试。如果你不小心点了“取消”或者根本没看到弹窗可以去开发者选项里点击“撤销USB调试授权”然后重新插拔数据线再次执行adb devices弹窗就会重新出现。有一种情况特别容易让人抓狂手机上确实弹了框也点了允许但电脑端还是unauthorized。这通常是USB数据线的数据传输不稳定或者你手机系统里“仅充电”模式下不允许调试。可以换一个专门的数据线不是那种只能充电的线然后把USB连接模式切到“传输文件(MTP)”或“传输照片(PTP)”试试这个细节我踩过不止一次。4.2 device offline怎么解决offline状态意味着设备曾连接成功但现在通信断开了。可能的原因有几类USB线接触不良或质量差数据传输不稳定。USB接口供电不足尤其是台式机前置面板的接口推荐插后置主板接口。adb服务端状态异常。解决办法是重启ADB服务端命令是adb kill-server adb start-server adb devices以上都没用的话就把手机重启一下。重启对offline状态有奇效原因有时候是手机的adbd进程进入了某种锁死的状态重启能恢复。4.3 列表为空或提示无权限如果adb devices输出是空的说明电脑端没有识别到USB设备。这时候先看看系统设备管理器里有没有出现带黄色感叹号的Android设备。如果存在那就需要安装USB驱动。Windows下可以打开设备管理器找到带感叹号的设备右键更新驱动选择“自动搜索”——驱动无法自动找到的话去手机品牌官网下载专用USB驱动或使用通用的Google USB驱动。Linux用户如果提示no permissions多半是udev规则没配好。常见处理方式是新增一个udev规则文件加入对应的USB vendor ID然后重启udev服务并重插设备。这个问题在Ubuntu等发行版上很常见配置一次之后基本就不会再遇到。4.4 5037端口被占用看不见的祸根ADB服务端依赖本机的5037端口工作。有时你启动服务后设备列表还是空的命令执行也特别卡多半是端口被其他程序占了。执行netstat -ano | findstr :5037可以看到是哪个进程占用了端口。有时候是某些模拟器的残留进程有时候是恶意程序。把对应进程结束掉再重启ADB服务端就能恢复。这个问题很冷门但遇到了非常浪费时间建议记在小本本上。5. ADB常用命令大全从应用到文件再到设备信息5.1 安装与卸载应用的几种姿势安装应用最常见的写法adb install app.apk如果要覆盖安装保留数据加-r参数adb install -r app.apk如果安装失败让你检查INSTALL_FAILED_USER_RESTRICTED这类权限问题注意确认开发者选项里的USB安装权限已经打开。Android 13以后的一些机型还默认限制了安装应用必须经过确认弹窗-r不一定能绕过这种时候可以在命令后加上-t或配合pm install相关操作来临时降低限制。总之遇到安装权限问题先翻开发者选项再想别的办法。卸载应用adb uninstall com.example.app如果你想卸载但保留数据某些应用重装后就怕丢登录状态或者卸不掉可以用下面的方法# 清除应用数据但保留安装包 adb shell pm clear com.example.app # 停用应用不需要root adb shell pm disable-user --user 0 com.example.app # 重新启用应用 adb shell pm enable com.example.apppm disable-user这招就是当前网络上各种“ADB冻结应用”“精简列表”的本质。它的原理是让系统认为这个应用是“被用户停用”的状态不需要root但效果等同于把应用藏起来了。注意不要停用系统核心组件比如系统桌面、设置、输入法否则手机可能变砖。这个警告不是开玩笑的我先帮你把这句话画个重点。5.2 文件传输push和pull要有明确的思路把电脑上的文件推到手机adb push 本地文件路径 /sdcard/目标路径把手机上的文件拉到电脑adb pull /sdcard/xx.jpg E:\saved\两个命令的格式都是“来源 目标”跟Linux的cp习惯一致。需要注意Android 11之后分区存储策略收紧/sdcard/依然不是应用目录但有些系统内部目录不能随意写。如果你往/data/local/tmp下传文件这个路径在普通权限下是可写的也是测试时常用的临时目录。另外如果你拉取的是大文件可以用adb pull加进度显示吗其实ADB默认会有进度条只是不连续刷新。我实测传1GB以上的文件时更推荐用数据线Wi-Fi调试虽然方便但传输大文件的速度波动较大有时会断开。5.3 截图和录屏不root也能优雅地抓证据截图adb exec-out screencap -p screen.png这个命令会把截图的二进制输出重定向到本地文件。注意使用exec-out而不是shell screencap因为exec-out不会在输出内容里追加额外的换行或回车符避免图片文件损坏。录屏adb shell screenrecord /sdcard/record.mp4 --time-limit 30 --size 720x1280录屏默认最长时间3分钟超过会自动停止。加--time-limit能控制时长加--size能控制分辨率和码率文件太大时很有用。录完后直接adb pull拉回电脑就行。这条命令在制作教程和提交Bug时都非常实用安卓自身不自带内录声音别指望它能录到麦克风。5.4 查看设备基本信息拿着参数去排查问题查看设备型号adb shell getprop ro.product.model查看Android版本adb shell getprop ro.build.version.release查看CPU架构这在给手机装对应的bin文件、上Magisk时有用adb shell getprop ro.product.cpu.abi查看屏幕分辨率adb shell wm size查看屏幕密度adb shell wm density查看电池状态用adb shell dumpsys battery能看到电量、温度、充电状态等很详细的信息。上面热搜词里那句adb shell dumpsys battery set usb 0实际上是在临时设置USB充电状态为关闭用于模拟不充电场景下的功耗测试。如果你只是看看电池状况不需要乱改参数改完用dumpsys battery reset恢复即可。6. ADB进阶实战日志、模拟操作与系统级控制6.1 抓取logcat日志从入门到排查崩溃logcat是Android的日志系统ADB抓日志通常这么写adb logcat -v time app.log-v time表示在每条日志前加上时间戳排查问题时非常有必要不然你根本不知道崩溃发生在哪一秒。 app.log是把所有日志重定向到文件避免刷屏刷到你眼花。如果只想看某个应用或者某个进程的日志可以先查PID# 获取包名的进程ID adb shell pidof com.example.app然后按进程ID过滤adb logcat --pid12345或者按标签过滤很多应用或系统模块会打自己的tagadb logcat -s UnityActivity E这条命令的意思是指显示UnityActivity下级别为Error的日志。开发游戏、US应用时这种过滤方式能让你从几十万行日志里迅速捞出关键错误。日志抓取还有一个高频场景是抓取崩溃现场。在测试机上先adb logcat -c清空缓冲区再复现一次崩溃最后adb logcat -d输出缓冲区内容到文件。这样能拿到一个干净、完整的崩溃日志。6.2 用input命令模拟用户操作解放双手的基础操作input命令是我日常试玩自动化脚本的必备工具。它可以在手机上模拟点击、滑动、文本输入。模拟点击adb shell input tap x yx y是屏幕坐标你可以先用开发者选项里的“指针位置”功能打开触控坐标显示这样就能看到手指按在哪里、对应什么坐标。模拟滑动adb shell input swipe x1 y1 x2 y2 duration_ms比如模拟下拉状态栏就是从头屏顶部往下滑动模拟左右滑动翻页就是从右往左或从左往右。duration_ms是滑动耗时单位毫秒想快就短一点想模拟真人慢速滑动就设长一点。模拟输入文字adb shell input text hello有两个坑要先提醒你第一这个命令对空格和特殊符号支持很差空格在Shell里会被拆成两个参数导致输入内容变形。解决方法是把空格转义成%s比如input text hello%s world。第二中文输入几乎不能用input text直接输入因为它是通过KeyEvent的方式模拟英文键盘输入。想输入中文通常的做法是用ADB把剪贴板内容写到系统然后长按输入框粘贴或者借助切入某个输入法的方式但这已经超出基础ADB的能力范畴了。6.3 屏幕刷新率调整与系统设置很多手机默认屏幕刷新率只能在自己厂商的“设置”页选几档但通过ADB可以直接指定一个系统认为合法的刷新率值# 查看当前支持的刷新率列表 adb shell settings put system peak_refresh_rate 120.0 adb shell settings put system min_refresh_rate 120.0如果你的手机系统字段名和这个不一样就执行adb shell settings list system | grep refresh看看当前机型的刷新率字段到底叫什么。热词里那一长串跟“屏幕刷新率”相关的内容原理就是这个。需要强调的一点是不要瞎改超出屏幕硬件能力的刷新率轻则花屏重则系统界面崩溃。改完后记得把参数回调到默认值。6.4 应用联网控制与权限管理不给应用联网权限不想用第三方管理软件用ADB也能搞定。Android 6以后每个应用都有独立的INTERNET权限但普通权限模式下这个开关不一定会在设置里显示出来。通过AppOps应用操作管理机制可以直接控制# 检查某个应用的联网权限状态 adb shell appops get com.example.app INTERNET # 禁用联网 adb shell appops set com.example.app INTERNET deny # 恢复联网 adb shell appops set com.example.app INTERNET allow这条命令在国行手机上尤其好使因为有些系统应用明明用不上却又没法直接卸载禁用联网能很大程度上断掉它的后台活动。不过要注意部分国产ROM会自签框架或做额外管控改完可能不生效这时候就要回到“卸载/停用”的老路线上。给应用授予无障碍权限ADB也能“代劳”adb shell settings put secure enabled_accessibility_services com.example.app/com.example.app.AccessibilityService adb shell settings put secure accessibility_enabled 1这里的包名和服务名必须完全匹配可以去应用安装目录下确认AndroidManifest.xml中AccessibilityService的完整路径。很多自动打卡、抢红包工具的原理都是这个但我要提醒一句无障碍权限能读取你屏幕上的所有内容不要随便给不明应用开这个权限。6.5 端口转发与更高级的方向ADB还支持端口转发。比如你手机上的某个程序监听在8080端口你希望电脑上访问localhost:8080就能访问到手机的端口可以执行adb forward tcp:8080 tcp:8080这在调试手机上的Web服务、测试本地代理时很常用。类似的还有反向转发adb reverse则是在手机上监听某个端口把流量反过来导到电脑开发React Native时你可能会接触这个命令。这些都是ADB真正强大的一面学会它们后你对“ADB只是一条安装/卸载命令”的印象会彻底改变。7. 经验之谈ADB的最佳使用习惯与避坑清单最后聊点不怎么写在官方文档里的经验。第一次用ADB连接手机建议先做一次完整走通adb devices看到device状态执行一次adb shell echo ok确认Shell能通再操作复杂命令。这样能避免后面一堆命令都白敲一遍然后才发现根子上没连上。写自动化脚本时记得每个ADB命令后面加合理的等待时长。例如adb shell input tap执行后界面切换需要时间马上执行下一个指令大概率会失败。稳妥的做法是在Shell脚本里加上sleep一两秒的缓冲。无线调试方便是方便但每次连接都要确认端口如果你经常调试可以考虑用adb pair配对后直接用adb connect 127.0.0.1:随机端口的方式自动找出当前端口。不过坦白说比起花时间写这种脚本有线连接稳定可靠数据传输又快初学阶段老老实实用数据线就好。把ADB驱动、platform-tools版本、手机系统版本这三者的兼容关系记住ADB工具会向后兼容旧系统但新系统可能需要新版本ADB才识别正常。遇到新手机、新系统突然连不上先去更新platform-tools到最新版再试其他办法。就我个人实际使用来看ADB这个东西真正难的不是某一命令怎么敲而是你能否建立起“电脑和手机之间有一个可编程的调试桥梁”的认知。有了这层认知你遇到任何疑问都会习惯性去查ADB能不能做、对应哪个子命令而不是到处求人或者装各种不靠谱的第三方工具。希望这篇内容对你有一条清晰的入门路径上手过程中遇到具体问题欢迎按我上面说的方法去排查一遍大概率能自己解决。
返回列表