ARTICLE DETAIL

资讯详情

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

Android调试桥ADB完全指南:环境配置、高频命令与踩坑排查

Android调试桥ADB完全指南:环境配置、高频命令与踩坑排查 有多少人第一次拿到Android设备想装个调试工具结果在驱动、环境变量、设备授权这一条龙上就卡了一整天反正我当年折腾的时候光是adb devices列表里那行unauthorized就差点让我把电脑砸了。后来搞久了才发现adb这东西说白了就是个“Android设备的远程控制终端”你电脑上的命令行就是设备的遥控器。从装机到日常调试从抓取崩溃日志到冻结系统应用几乎每个玩机或开发场景都绕不开它。这篇文章我打算把整个adb工具链从头到尾捋一遍。包括怎么下载、怎么配置环境变量、怎么处理驱动和设备授权再到高频命令的真实用法重点是logcat日志抓取、应用管理、文件传输这几个场景最后附上一份我踩坑无数后整理出的问题排查手册。内容会很长但保证每一句都是我实际敲过验证过的经验不是那种抄来抄去的官方文档复读机。1. 内容整体设计与思路拆解先说一个很多人没想明白的问题你装的“adb”到底是个什么东西。adb全称是Android Debug Bridge中文叫“安卓调试桥”。它不是一个单一程序而是一套客户端-服务端-守护进程的三层架构你电脑上的adb命令是客户端电脑后台自动启动的adb server是服务端Android设备里的adbd守护进程负责接收指令。数据链路走的是USB线或Wi-Fi默认端口是5037这是本机里client和server通信用的端口不少人误以为是连手机用的其实不是。我为什么先讲这个架构因为后面几乎所有疑难杂症比如“adb devices有设备但offline”“端口被占用”“连接一会儿就断”本质都是这三层里某一环出了问题。如果你脑子里有这张结构图排查问题的思路会清晰得多。另外一个常见的误区是“adb工具包就是驱动”。经常有人问“我驱动都装了怎么还是连不上”其实adb的工具包是一套命令行程序驱动是让Windows识别手机硬件用的两者完全不搭边。很多安卓驱动包里会顺带把adb也集成进去但反过来安装了adb工具不等于装好了驱动。所以下载和安装这两个动作实际要分开做。还有设备侧的前提要求。Android 4.2.2之后的版本开发者选项里的“USB调试”开关默认是关闭的而且进入开发者选项的方式也比较隐蔽——需要在“设置-关于手机”里连续点击7次“版本号”才能解锁。这个门槛看似简单但我在实际给同事、朋友远程指导时发现至少有三分之一的人卡在这一步所以别跳过。2. 下载工具包与驱动安装实操2.1 官方工具包下载路径与版本选择获取adb工具包首选是Android开发者官网的“platform-tools”压缩包这是谷歌官方维护的命令行工具集合里面包含adb、fastboot、sqlite3这些常用的调试命令。下载页面会自动识别你的操作系统Windows对应的是ZIP压缩包下载完解压就能用不需要“安装”这个动作。Windows用户下载得到的platform-tools_rXX.X.X-windows.zip解压后你会看到一个platform-tools文件夹。我要提醒一句建议解压到一个固定且路径不复杂的位置比如D:\platform-tools。为什么因为后面配置环境变量需要引用这个路径如果随便丢在某个浏览器的下载目录里找起来很痛苦而且有些工具的路径解析对中文路径和空格支持不佳会引出一堆奇怪的bug。如果你想要更完整的功能比如后续可能用到DDMS、模拟器管理这些可以额外下载完整的Android Studio里面自带SDK Manager通过SDK Manager也能单独安装platform-tools。但对于只需要adb命令的读者单独下载platform-tools这个轻量包就足够了完全没必要为了个调试命令去装一个几个G的IDE。2.2 通用驱动与厂商专用驱动的选择逻辑驱动这块是新手最容易乱的地方。先说结论优先安装设备厂商官方提供的USB驱动其次是通用的Google USB Driver。为什么优先厂商驱动因为不同厂商的设备PIDProduct ID和VIDVendor ID不同通用的Google驱动虽然覆盖面广但某些老设备、冷门机型或特殊模式比如刷机模式下没有厂商驱动会直接识别失败。比如老款创维电视打开ADB后需要专门驱动这种家用电器类的设备厂商通常只在官方驱动包里才带对应配置通用驱动直接没戏。判断驱动是否正常最简单的方法是打开“设备管理器”找一个“便携设备”Portable Devices或“Android Device”分类。如果设备显示为带黄色感叹号的“未知设备Unknown Device”或“ADB Interface”带感叹号那就是驱动没对。这时候不要瞎下载“驱动精灵”“驱动人生”这类第三方工具尽量去设备制造商的官方支持页面搜索你的设备型号加“USB驱动”关键词下载对应的驱动包安装就行。安装完成后拔掉USB线重插一次等系统重新识别设备。如果还是感叹号右键选择“更新驱动程序”手动指向驱动文件所在目录而不是让系统“自动搜索”手动指定的成功率更高——因为Windows的自动搜索经常在线寻找后给你装一个不兼容的版本。这个细节我试了很多次手动指定基本一次成功。2.3 环境变量配置的两种方法和验证工具包和驱动都就绪后为了让adb命令能在任意目录下直接执行需要配置环境变量。如果不配置每次使用都要先cd到platform-tools目录下或者在命令前加上.\adb这实在太痛苦了。配好环境变量就像给命令设了个全局快捷键。Windows的配置流程是右键“此电脑”-“属性”-“高级系统设置”-“环境变量”。在下方的“系统变量”里找到Path点击编辑新建一条把platform-tools的完整路径例如D:\platform-tools添加进去。注意这里用的是文件夹路径不是adb.exe文件的路径。确定保存后务必关掉所有已经打开的终端窗口再重新打开因为环境变量的读取发生在进程启动时旧的终端不会拿到新配置。配置完验证方法在任意目录下打开cmd或PowerShell输入adb version。如果能看到类似Android Debug Bridge version 1.0.41和Version X.X.X这样的输出说明环境变量配置成功。如果提示“不是内部或外部命令”先检查是否在Path中正确添加了路径并重开了终端。我见过有人把路径加分号加错地方的也见过复制路径时多了个空格导致失败的这都算老生常谈但确实容易翻车。3. 设备连接、授权与权限管理3.1 USB连接之前的手机端设置检查连接设备这个环节我建议你按下面的清单检查一遍顺序不要乱乱了你可能会排查半天才发现是最基础的开关没开。第一进入“开发者选项”打开“USB调试”开关。这里有个细节有些定制ROM比如部分手机的游戏模式或省电模式会自动关闭USB调试所以如果之前连过没问题突然连不上了先回开发者选项看一眼开关是否还在开启状态。第二如果使用的是小米、vivo、OPPO等品牌的设备除了USB调试一般还需要开启“USB安装”这个选项。这是谷歌在Android 4.2后引入的安全机制未开启状态下即使adb已授权设备上安装APK时也可能失败或提示无权限。部分新机型甚至还有“USB调试安全设置”之类的高阶选项用于允许模拟点击和修改权限按需打开即可。第三在插入USB线之前设备上弹出的“是否允许USB调试”对话框一定要选择“始终允许使用这台计算机进行调试”再点击允许。如果不勾选“始终允许”每次连接都会重复弹窗且在自动化脚本场景下一旦没有及时点确认连接就中断了。这个细节在跑自动化测试时特别致命。3.2 adb devices、unauthorized、offline状态解析连接成功后输入adb devices命令行会显示一个设备列表。正常状态是device异常状态主要有两个unauthorized和offline。unauthorized出现的原因很直接设备端没有确认授权弹窗。解决办法是查看手机屏幕确认那个对话框并勾选“始终允许”。如果对话框没弹出来先输入adb kill-server再输入adb start-server重启adb服务然后拔插USB线触发重新授权。如果设备已经弹过框但依然unauthorized试试撤销所有USB调试授权在开发者选项里撤销后重新插线它会再次弹出授权框这次记得一定勾选“始终允许”。offline的含义则是设备连接了但通信异常。常见原因有三个一是USB线质量差或接口供电不足尤其是前置USB接口解决方法是换一根原装或至少是能传数据的数据线直接插到机箱后置USB口试试二是adb server版本和设备端的adbd版本不匹配输入adb kill-server后重启server它会重新尝试探测设备三是电脑端驱动异常或存在多个adb进程冲突检查任务管理器是否残留多个adb.exe全部结束后重连。还有一个冷门但实际遇到过的原因如果电脑上安装过某些手机助手类软件比如各种“XX助手”它们自带的旧版adb服务会和官方platform-tools抢5037端口导致设备显示offline或直接cannot connect to daemon。这时候要么彻底卸载这些助手要么在环境变量里确保官方platform-tools的路径排在前列让系统加载的是官方版本的adb。3.3 无线调试连接配置与速查USB线并不是adb的唯一连接方式。Android 11及以上系统正式支持了无线调试Wireless Debugging功能Android 10及以下系统也可以通过TCP/IP方式连接。这对那些USB接口损坏的设备或者需要远程调试的场景来说是解放生产力的配置。Android 11及以上的无线连接步骤先在开发者选项里打开“无线调试”然后进入“无线调试”设置页记录下设备IP地址和配对端口。电脑上执行adb pair ip:port输入设备屏幕上显示的6位配对码配对成功后再执行adb connect ip:port这里的端口和配对端口不同需要从设备界面读取。整个过程不需要USB线很方便。Android 10及以下的老设备无线连接方式先USB连接一次执行adb tcpip 5555让设备开启5555端口的TCP监听模式然后拔掉USB线执行adb connect 设备IP:5555。这里需要注意adb tcpip设置只在本次开机有效设备重启后该设置会丢失需要重新设置。此外确保电脑和设备在同一个局域网内如果路由器开启了AP隔离Guest网络功能也可能连不上。无线连接唯一的坑是稳定性USB线连接时线断了会立刻反馈而Wi-Fi连接时网络波动可能导致命令卡住几秒甚至十几秒才报错。在批量传输大文件的场景我更建议老老实实用USB线无线真的容易传一半就断。4. adb常用命令分类详解4.1 设备信息查询与系统管理命令把连接问题解决了剩下的就是命令本身的使用。我习惯把常用命令按“查询类”“操作类”“调试类”分开记忆这样使用的时候能快速定位。查询设备信息是排查问题的基础最常用的几个adb devices -l带详细信息的设备列表可以看到设备型号、设备名多设备场景下比裸的adb devices好用得多。adb shell getprop ro.product.model查看设备型号名称类似ro.product.*开头的属性还有很多可以按需查询。adb shell getprop ro.build.version.release查看Android系统版本号。adb shell cat /proc/cpuinfo查看CPU信息想要更友好的话用adb shell getprop ro.board.platform查看主芯片平台。adb shell dumpsys battery查看电池状态电量、温度、电压都能看到。配合set usb 0参数可以强制取消USB充电这在测试充电逻辑时需要用到。系统管理操作里adb reboot是重启设备adb reboot bootloader是进入Bootloader刷机模式adb reboot recovery是进入Recovery恢复模式。这三个命令别看简单用错模式可是会误触刷机流程的建议敲之前想清楚自己要干嘛。4.2 应用安装、卸载与权限管理应用管理是adb使用频率最高的场景之一掌握这些命令可以彻底摆脱图形界面的限制。安装APK的基础命令是adb install xxx.apk常见参数有-r覆盖安装保留应用数据适合安装同签名应用更新包时使用。-d允许降级安装也就是安装版本号比当前版本低的应用。直接用-r遇到签名一致但版本更低时会报错加上-d可强制通过。-t允许安装测试包AndroidManifest里设置了testOnly为true的APK。-g安装时直接授予所有运行时权限调试时很好用。在Android 6.0以上如果不加这个参数安装后很多权限都是默认关闭的自动化测试的APP可能直接崩掉。批量安装多个APK可以用adb install-multiple xxx1.apk xxx2.apk xxx3.apk但说实话这个命令的报错信息比较难读真需要批量装东西我更推荐写一个简单的for循环脚本。卸载命令是adb uninstall 包名后面跟的是com.xxx.xxx这样的完整包名不是应用名称。不确定包名时先执行adb shell pm list packages查看全量包名列表配合findstrWindows或grepLinux/macOS过滤关键词。比如想找微信的包名执行adb shell pm list packages | findstr tencent很快就能定位。pm命令在Android里属于PackageManager的管理入口前面提过的那几个好友列表都是这个命令的子集。另外还有几个进阶的adb shell pm clear 包名清空应用数据和缓存相当于恢复出厂设置里的某个应用。出现应用异常闪退时先用这个命令测试是不是数据导致的比卸载重装更快的验证方式。adb shell pm disable-user 包名禁用应用Android 9及以上支持。玩机圈常说的“冻结应用”就是这个操作但要注意某些系统应用被禁用后可能导致开机异常或系统功能缺失。adb shell cmd appops set 包名 RUN_IN_BACKGROUND ignore禁止应用后台运行。这个活动是借助AppOps机制限制权限比直接冻结更加温和发烧友之间经常用来控制后台驻留。在adb shell pm list packages后面加参数可以实现不同的过滤维度-s只查系统应用-3只查第三方应用-d只查已禁用应用组合起来用可以做应用体检。这也是我在做设备安全评估时养成的习惯——先看列表再逐个排查有没有来路不明的第三方应用。4.3 文件传输与Shell操作命令adb的文件传输本质是走Android的MTP替代方案速度稳定且不受Windows的“设备存储已满”逻辑干扰。推文件到设备adb push 本地路径 设备路径。比如把电脑上的test.apk推到设备的/sdcard/目录执行adb push test.apk /sdcard/。需要注意设备路径权限问题推送到/data/local/tmp/通常是可写的但如果推送到某些受保护的目录如根目录/会报Permission denied需要使用root权限或选择合规的目录。从设备拉文件adb pull 设备路径 本地路径。比如把/sdcard/Download/xxx.txt拉到当前目录执行adb pull /sdcard/Download/xxx.txt ./。批量拉取的话可以配合adb shell ls先查看目录内容再逐个拉取但建议直接把整个目录拉下来adb支持目录级递归传输。adb shell进入设备内置终端后你就可以像操作Linux一样管理设备文件系统。常用命令我不一一展开了只说一个实用技巧如果设备没有root/data目录下面的内容你是无权访问的这时候可以尝试adb shell run-as 包名以某个可调试应用的身份进入沙箱目录。这个命令对分析自有应用的数据存储结构特别好使是白盒测试场景下的必备技能。4.4 日志抓取与logcat深度实践adb logcat可能是最强大但也是用起来最容易懵的命令之一。很多人只知道执行adb logcat然后满屏滚日志然后不知道如何处理。实际上logcat是一个参数极其丰富的日志系统正确使用能帮你精准定位到每个崩溃点。抓取持久日志到文件adb logcat crash.log。但直接这样抓的日志很杂查看时非常痛苦。我建议先过滤优先级adb logcat *:E只输出Error级别的日志*:W是Warning级别从低到高是VVerbose、DDebug、IInfo、WWarning、EError、FFatal。加*:S则表示静默即什么都不输出经常作为过滤其他模块的“关闭开关”。有一种很实用的组合adb logcat *:S ActivityManager:I意思是只显示ActivityManager模块的Info级别以上日志。这种“白名单黑名单”的结构化过滤方式比单纯的*:E要精准得多。同理想看网络请求可以*:S OkHttp:D想盯崩溃可以*:S AndroidRuntime:E。清空已有日志adb logcat -c。在复现bug之前先清空一次然后再操作应用这样抓到的日志就是完整的一手现场不会混入历史噪声。这个操作逻辑和排查问题时先adb logcat -c再复现是一套标准打法。抓取崩溃日志的另一个关键参数是-b它用来切换不同的缓冲区。默认的是main缓冲区但崩溃堆栈往往不在main里而在crash缓冲区。完整抓取命令是adb logcat -b crash或adb logcat -b all full.log。-b all会同时输出main、system和crash三个缓冲区的内容唯一缺点是信息量大、文件体积膨胀快可能几十分钟就上百兆。平时抓bug我推荐分开抓先-b crash看堆栈再-b main看上下文。日志过滤还可以配合时间戳使用adb logcat -v time在每行日志前加上时间这个“带时间戳”特性对分析启动耗时特别有帮助。如果你需要分析性能加上-v threadtime它会显示线程ID和精确到微秒的时间配合Systrace工具可以完成初级的性能诊断。5. 常见问题与排查技巧实录5.1 adb unauthorized的完整排查流程unauthorized这个状态出现太频繁了值得单独拉出来写一段。遇到它不要慌按下面顺序排查看看手机屏幕是否有授权弹窗。有勾选“始终允许”点允许没有继续下一步。执行adb kill-server然后adb start-server重启服务。此时如果设备没有弹出弹窗进入手机“开发者选项”找到“撤销USB调试授权”点击后重新插线弹窗会再次出现。如果仍然无效检查电脑上的adb版本是否为官方最新版。某些“手机助手”自带的adb版本过旧兼容性差会卡在授权环节建议彻底卸载这些助手软件。还有一种情况如果设备开启了“仅充电”模式而非“文件传输(MTP)”模式也可能导致授权对话不出现。把USB连接模式切换成“传输文件”很多情况下就这么解决了。最后说一个绕开弹窗授权的终极技巧有些设备支持修改/data/misc/adb/adb_keys文件来预设公钥。但这需要root权限而且不同厂商的文件锁策略不同实际操作起来门槛较高。对普通用户来说上面四步已经覆盖了99%的场景没必要为了这个去折腾root。5.2 日志抓取常见报错与处理速查表整理一份我平时排查问题时对照查看的报错速查表方便你直接“抄作业”。报错信息原因解决办法device unauthorized未授权或授权失效查看手机弹窗授权或撤销授权后重新连接device offline通信异常重启adb服务换USB口/线关闭手助类软件cannot find device驱动未装或USB线不良检查设备管理器重新安装厂商驱动insufficient permissions for deviceLinux环境权限问题给adb添加udev规则或用root身份运行adb start-serverclosed连接被设备端中断解锁设备屏幕部分设备锁屏状态下会断开adb连接protocol fault (no status)USB通信不稳定换数据线换USB接口降低USB2.0速率试试adb server version doesnt match this client多版本adb冲突卸载多余手机助手确保系统加载的是官方adbmore than one device/emulator多设备连接但未指定加-s 设备序列号参数指定目标设备第8条多设备场景需要补充说明执行adb devices拿到设备序列号列表后操作单个设备必须在命令中加-s参数例如adb -s 设备序列号 install xxx.apk。不加的话adb会直接报错拒绝执行而不是自动挑选设备这是出于安全考虑的强制约束习惯之后反而觉得挺靠谱。5.3 在模拟器中配置adb的注意事项很多游戏玩家和开发者会用到模拟器如夜神、MuMu、蓝叠等。模拟器本质上是一个运行在PC上的虚拟Android系统而每个模拟器厂商对adb的接入方式都不完全一样。主流的模拟器在安装完成后通常自带一个内置的adb也允许你连接外部adb。但外部adb连接时的端口是模拟器自定义的比如夜神模拟器的adb端口一般是62001MuMu可能是7555。连接方式为adb connect 127.0.0.1:端口号。如果端口不对执行netstat -ano | findstr 端口也查不到对应监听连接就会失败。有些模拟器在设置界面会有“ADB调试”选项需要你先开启后外部adb才能连上。另外模拟器的架构不一定是ARM很多是x86架构这会导致安装某些原生ARM应用时出现兼容性问题报错信息往往是INSTALL_FAILED_NO_MATCHING_ABIS。这种情况在adb层面无解需要安装兼容包或改用ARM镜像的模拟器是不少新手绕不过去的弯。5.4 老设备/智能电视打开ADB的冷门经验除了手机和平板很多智能电视、电视盒子也支持adb调试。这一点在玩机圈很有市场比如老款创维电视如何打开adb就是频繁被搜索的问题。但这类的打开方式五花八门有的在“设置-关于-版本号”长按有的在“工厂菜单”里甚至有的需要用遥控器输特定代码。通用规律是先尝试进入“设置-关于”查看有没有“版本号”选项连续点击7次如果不行去应用商店搜一个“ADB开关”类的应用通过应用来开启调试模式。智能电视连接adb后常见的玩法是冻结系统自带广告应用、卸载无用预装软件、强制安装第三方应用。但在这里我必须提醒一句电视的系统应用比手机更脆弱很多电视的存储只有8GB可用空间极小一旦冻结了核心系统应用可能导致开机卡Logo或遥控失灵恢复时又没有方便的Recovery模式救砖极其痛苦。操作前务必先搞清楚哪些包名是核心系统依赖先pm disable-user而不是直接卸载给自己留条退路。6. 进阶玩法adb键盘输入与自动化场景之所以把“adb键盘”这个词条单独拿出来说是因为它真的解决过我的燃眉之急。adb shell input text命令可以模拟输入文本比如adb shell input text hello这个命令会自动在设备当前聚焦的输入框里输出hello字符串。如果文本里带空格或特殊符号需要用%s来转义空格例如hello%sworld特殊字符如、|、等需要相应的转义处理。这个方法在批量填写表单、自动化测试脚本里特别有用。但注意input text模拟的是键盘输入事件它不会走IME的联想和分词逻辑中文输入法下执行英文文本没有影响但中文往往无法直接输入。要输入中文得借助ADBKeyboard类的第三方输入法工具通过剪贴板或广播消息注入中文文本这就属于更底层的自动化方案了。按键模拟也很常用adb shell input keyevent 4相当于按一次返回键adb shell input keyevent 3是回到桌面Home键adb shell input keyevent 24是音量加。配合adb shell input swipe x1 y1 x2 y2 duration模拟滑动和adb shell input tap x y模拟点击基本就可以脱离双手操作设备了。这些命令组合起来就是最原始的移动端自动化框架。很多现成的自动化工具底层做的工作其实和这一套是共通的——只是把坐标执行、条件判断、控件识别包了一层更友好的壳。如果你想理解移动端自动化的原理亲手用adb把一套操作“点”完比直接学框架更能建立底层认知。7. 命令失败时的通用排查思路最后分享一套命令本身的排查思路。很多人执行adb命令报错后习惯去搜索引擎复制整个报错信息但报错信息里真正关键的往往是最后一行。第一看报错级别。如果错误是Error那大概率是执行逻辑出了问题比如目标位置没有权限、包名写错了、命令参数不合法。如果只是Warning或Failure那只是操作没生效但adb本身没崩根据提示调整参数即可。第二确认命令的执行环境。有些命令必须在adb shell内执行有些必须在宿主机上执行。比如adb install是宿主机命令执行环境是Windows/Linux/macOSpm install是设备内命令必须在adb shell里跑。混用会导致pm: not found之类的诡异错误。第三注意shell语法兼容性。Windows的cmd和PowerShell对单引号、双引号、转义符的处理不一致同样的命令在cmd里能跑在PowerShell里可能直接报语法错误。比如adb shell echo hello world在cmd里没问题在PowerShell里由于引号嵌套规则不同可能解析失败。遇到这种问题优先在cmd里复测一遍或者用--%停止PowerShell的解析。第四确认是否有多个adb实例在运行。如果任务管理器里有多个adb.exe进程一些命令会出现随机失败、卡死或连接到无关设备的情况。统一处理方式是adb kill-server再逐个结束残留的adb.exe进程最后重新执行命令。第五检查USB调试授权时效。部分系统更新或安全策略会在特定时间后撤销授权导致unauthorized问题复发。这种情况没有一劳永逸的办法只能重新授权习惯就好。这些思路虽然看起来基础但我遇到过太多人卡在“不知道为什么失败”的环节往往就是在执行环境和多实例这两点上没绕出来。我自己的习惯是如果一条adb命令行为异常先重启一次adb server再检查执行环境再考虑设备端问题——按照这个顺序排查解决速度最快。
返回列表