ARTICLE DETAIL

资讯详情

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

ADB 下载与命令全攻略:环境配置、设备连接与 logcat 日志排查

ADB 下载与命令全攻略:环境配置、设备连接与 logcat 日志排查 我最早碰 ADB是因为一台老手机装不上某个 APK厂商又不给解锁权限到处搜都只找到零散的命令片段最后绕了一大圈才搞明白问题的关键不在手机而在电脑和手机之间缺了一条可靠的“调试通道”。后来做安卓项目几乎每天都要跟 ADB 打交道下载、配置、抓日志、传文件、改系统设置这一套流程已经熟练到形成肌肉记忆了。这里把“ADB 下载”和“ADB 命令”从零开始完整梳理一遍不仅说清楚每条命令怎么用还会把常见报错背后的原因讲透。内容可以看成一份可以直接照着操作的 ADB 使用手册适合刚入门的人也适合那些用过几条简单命令、但遇到 unauthorized、logcat 刷屏、模拟器连不上等问题时一头雾水的朋友。1. 下载之前先把 ADB 这套工具的组成搞明白1.1 ADB 不是单条命令而是一整套调试链路很多人以为 ADB 就是一个叫 adb 的 exe这不算错但理解得太浅后面真出问题时容易抓瞎。ADB 全称 Android Debug Bridge翻译过来是“安卓调试桥”它由三个部分组成电脑端运行的 adb 客户端、电脑后台运行的 adb server以及设备端运行的 adbd 守护进程。你每次在命令行敲adb devices实际发生的事情是adb 客户端先把请求发给电脑上的 5037 端口adb server 接收到请求后通过 USB 线或者网络找到设备再和设备端监听 5555 端口的 adbd 建立通信。整个过程就像你打电话给前台前台再帮你转接给总经理办公室——你直接面对的是 adb 客户端但真正干活的是设备里的 adbd。理解这条链路对排查问题非常重要。比如你敲命令后提示“cannot connect to daemon”八成是 adb server 没起来或者 5037 端口被占了提示 unauthorized说明客户端到服务端这段通了但设备端没有在授权弹窗上允许你的电脑。命令报错的样子五花八门但只要心里有这条链路的图谱就能顺着每一段去排查。1.2 下载渠道对比为什么建议优先官方 platform-toolsADB 工具的下载渠道很多但建议首选官方渠道。Android 开发者官网提供了 platform-tools 压缩包Windows、macOS、Linux 三个平台都有下载后解压就能用里面除了 adb还附带 fastboot、sqlite3、etc1tool 等调试工具。这个压缩包体积不大更新也跟得上系统版本遇到 Android 新版本连接问题通常升级一下就能解决。Github 上也有 google 官方维护的 platform-tools 仓库可以获取发布版适合 GitHub 访问更顺畅的场景。不建议去一个不知名的下载站拿所谓的“一键版 ADB 工具包”特别是有各种绑定软件、要我付费解锁功能的版本。那里面很有可能文件被改造过轻则命令跑不通重则被植入了不该有的东西。真要用第三方整合包也要找社区里历史悠久、口碑稳定的项目拿到手之后先校验压缩包的哈希值再解压。下面是我整理的一份渠道对比直接照着选就行渠道优点缺点适合场景Android 开发者官网 platform-tools官方、更新及时、无捆绑需要能正常访问开发者网站所有用户强烈建议首选GitHub 官方仓库 Releases版本明确、可查看更新说明部分地区访问速度一般开发者和喜欢跟踪新版本的人国内软件镜像站下载速度快需要自己判断是否干净官网确实不方便访问时的备用选择各种第三方“全能工具包”多个工具打包、开机就能用容易捆绑、版本旧、有安全风险不建议使用尤其是陌生站点1.3 下载之后第一件事验证 adb 是否真的能用不管从哪个渠道下载解压后先进入 platform-tools 目录在命令行里执行一次adb version看到类似下面的输出就说明基本可用Android Debug Bridge version 1.0.41 Version 34.0.4-10934264 Installed as /Users/xxx/platform-tools/adb如果提示“adb 不是内部或外部命令”不是你下载的文件坏了而是没有把 adb 所在目录加到系统环境变量里。这个问题非常普遍专门接在下面一节讲。2. 环境配置与设备连接新手翻车率最高的环节2.1 Windows 下配置 adb 环境变量的完整流程大多数人第一次跑adb命令失败都是栽在环境变量上。Windows 下配置 adb 环境变量一点也不难但顺序错了很容易找不到入口。先把解压出来的 platform-tools 文件夹放到一个固定的位置比如 D 盘根目录下的D:\platform-tools然后按下面的步骤操作右键“此电脑”选择“属性”点击“高级系统设置”。在弹出的“系统属性”窗口里点击右下角“环境变量”。在“系统变量”区域找到名称为 Path 的变量选中后点击“编辑”再点击“新建”把 platform-tools 的完整路径加进去。一路点“确定”退出重新打开一个命令行窗口执行adb version。这里有个隐藏问题很多新手改完环境变量之后继续用旧的命令行窗口测试结果还是提示找不到命令然后就以为自己配置错了。Path环境变量是在程序启动时读取的已经开着的窗口不会自动更新必须关掉重开。macOS 和 Linux 用户相对简单把解压后的 adb 路径加到 shell 配置文件的 PATH 里即可比如编辑~/.zshrc或~/.bashrc加一行export PATH$PATH:/path/to/platform-tools然后source一下。2.2 手机开启开发者模式和 USB 调试的隐藏细节电脑端准备好了设备端还要做两件事打开“开发者选项”和“USB 调试”。一般在“设置-关于手机”里连续点击“版本号”7 次系统会提示已经进入开发者模式。但有些手机厂商把入口藏得很深比如部分 vivo、荣耀机型需要在“设置-系统管理-关于手机”里连点软件版本号或者还要再输入一次锁屏密码才生效。打开 USB 调试之后插上数据线手机通常会弹两个提示一个是“是否允许 USB 调试”另一个是“充电还是传输文件”。很多人卡在这里如果手机只选了“仅充电”adb 会识别不到设备。建议插线之后手动把 USB 模式切换到“文件传输”或者“传输文件”大部分机型在这个模式下 adb 握手最稳定。有一点值得注意部分手机第一次弹授权窗口时可能会因为你在忙碌过程中稍慢了点几秒后就自动消失了。这种情况下不要反复拔插数据线直接在通知栏里看有没有“USB 调试授权”相关的提示点进去重新触发或者关掉再打开 USB 调试开关。2.3 adb devices 的状态列到底在告诉你们什么连接好设备后输入adb devices -l你会看到类似这样的输出List of devices attached R58M32ASPAZ device product:polaris model:MI_8 device:dipper transport_id:1这里面的状态列是关键它一般有几种device、unauthorized、offline、no permissions偶尔还会出现 recovery 或 sideload 状态。看到device说明一切正常可以继续执行命令了unauthorized表示设备端没有允许这台电脑授权offline表示设备曾连上过但连接不稳定或者 adb server 状态异常。如果你只想快速确认有没有识别到设备用不带-l的adb devices就够了。但要判断设备型号、transport 等信息-l提供的细节能帮上不少忙尤其是电脑上连着多台设备的时候通过 model 字段能快速区分是哪一台。2.4 模拟器和电视的 ADB 连接方式和手机大不一样真机通过 USB 线连接没什么好说的但模拟器和电视走的完全是另一条路。拿夜神模拟器举例启动模拟器后在命令行执行adb connect 127.0.0.1:62001如果连接成功adb devices里会出现127.0.0.1:62001这台设备。但很多朋友的版本不一定默认用 62001 端口不同模拟器的端口差异很大比如有些模拟器用 7555有些用 21503还有的会在模拟器目录里自带一个 adb 端口配置文件。最稳妥的办法是先打开模拟器的“设置”界面看它显示的 ADB 调试端口是多少或者去模拟器安装目录里搜一下配置文件里的端口号再 connect。电视上的 ADB 就不太好弄了因为大多数电视没有标准 USB 调试模式。以老款创维电视为例我记得在设置菜单里有一个“开发者选项”或“ADB 调试”开关有些型号还要进入“工厂菜单”才能打开。这个过程不是统一的不同电视型号的菜单结构差别极大。我只能建议先在“设置-关于本机”里连续按确认键尝试进入开发者模式。打开之后部分电视会显示一个动态密码要求你在电脑上执行配对命令时输入这个密码是设备随机生成的不存在什么“计算器”能提前算出来只能看屏幕上的实际显示。2.5 unauthorized 这个提示绕不开但很好解adb unauthorized是高频问题核心原因就一句话设备端没有信任这台电脑。第一次连接时手机上会弹出一个“允许 USB 调试吗”的界面并且显示一串 RSA 密钥指纹必须勾选“始终允许来自这台计算机的调试”并点击允许授权才算建立。如果你点太快点了拒绝或者之前允许过但换了电脑、刷了系统设备的信任记录会失效。这时候不要再反复执行 adb devices正确做法是在手机上进入开发者选项找到“撤销 USB 调试授权”或者“清除授权记录”再重新插线重新弹窗重新允许。有些线下设备连不上并不是授权问题而是 adb server 本身抽风了执行一次复位adb kill-server adb start-server再执行adb devices通常就能恢复。3. 高频命令实战装应用、导文件、改设置3.1 包管理命令查、装、卸、停一次讲清日常操作里和 APK 打交道最多所以包管理命令必须掌握。装应用最基础的是adb install命令后面跟 APK 文件路径adb install -r app.apk-r表示覆盖安装并保留数据升级测试版本时必须加。adb uninstall后面跟包名比如adb uninstall com.example.demo。卸载系统预装应用时很多人习惯直接adb shell pm uninstall -k --user 0加包名这里的-k是卸载应用但保留数据--user 0是只对当前用户生效相当于让应用“消失”而不是彻底从系统分区删掉。这个做法在小米、红米、vivo 这类机型上很常用后面讲冻结应用时还会再提。想查看设备上安装了哪些应用用adb shell pm list packages输出结果默认只显示包名长到看不见有用信息这时管道加grep过滤就很重要了比如adb shell pm list packages | grep wechat。pm list packages还能接很多参数比如-s只看系统应用-3只看第三方应用-d只看被禁用的应用。排查预装应用时这三个参数配合起来非常高效。3.2 push 和 pull把文件送进设备或者把文件取回来文件传输是最直观的 ADB 功能。把电脑上的文件推到手机adb push local.txt /sdcard/Download/把手机里的文件拉到电脑adb pull /sdcard/Download/result.png ./这里的路径有讲究。/sdcard/在绝大多数设备上就是内置存储但它其实是一个符号链接实际指向/storage/emulated/0/。如果你要对某个应用的数据目录操作比如导出应用的私有文件那在 Android 11 以前能直接访问Android 11 以后很多目录会受到权限限制push 到/data/data/包名/会失败这是系统权限机制在起作用不是 ADB 坏了。传输文件时我还习惯先看下设备目录里有什么用adb shell ls /sdcard/Download/确认路径存在避免 pull 一个不存在的文件时干等。移动、删除、重命名等文件操作只需要在adb shell后面接 Linux 命令adb shell rm /sdcard/test.txt adb shell mv /sdcard/a.txt /sdcard/b.txt很多人在熟悉 adb 命令的同时也顺便把 Linux 命令练熟了就是这个原因。3.3 截图、录屏和刷新率调整比第三方工具靠谱截图和录屏是日常报告问题的利器。ADB 截图常用的是adb exec-out screencap -p screen.pngscreencap -p生成 PNG 格式的截图再通过exec-out把二进制数据直接输出到电脑文件。为什么不推荐先保存到设备再 pull因为中间多一步写入读取速度反而不稳定。录屏命令是screenrecord保存到设备上再拉回来更稳妥adb shell screenrecord --time-limit 10 /sdcard/demo.mp4关于设置屏幕刷新率很多朋友可能没想到 ADB 也能做。比如某些不支持在设置里直接切换刷新率的机型可以用adb shell settings put system peak_refresh_rate 120 adb shell settings put system min_refresh_rate 120但这里必须提醒一句不是所有机型都认这两个字段部分厂商用的是surfaceflinger相关的 props 或者自研的帧率控制模块。动手前先执行adb shell dumpsys display查看当前显示模式列表确认设备支持 120Hz 再改否则强行设置可能导致屏幕闪烁甚至无法点亮。3.4 用 settings 命令管理系统参数的思路Android 系统的设置项大多存放在 settings 数据库里分 system、secure、global 三个表。ADB 提供了直接操作这套数据库的通道adb shell settings list system adb shell settings get global airplane_mode_on adb shell settings put system screen_brightness 128这种方式非常适合批量修改设置不用在屏幕上一个个点。但风险在于字段名拼写错不会报错只是静默不生效有些字段改了之后需要重启才能看到效果某些厂商还对字段做了限制普通权限改不动。所以我的建议是改之前先用settings get看下原值做好记录改完如果不对就马上改回去。遇到gpedit.msc这类 Windows 命令打不开的情况跟 ADB 无关是系统策略或者权限问题不要混在一起排查。3.5 让应用无法联网appops 的正确用法“adb 禁止应用联网”这个需求经常出现在各种精简教程里。Android 系统提供了一组叫 appops 的权限操作接口通过它可以管理一些普通设置里不展示的权限比如后台联网adb shell cmd appops set com.example.app INTERNET deny执行成功之后这个应用调用联网接口时会被系统拦截。恢复联网就是adb shell cmd appops set com.example.app INTERNET allow这个命令在部分系统版本上对第三方应用有效但对系统应用可能不生效。如果执行之后应用依然能上网那可能是应用本身使用了系统签名或者走了更底层的网络通道光靠 appops 是拦不住的。碰到这种情况不要继续折腾 ADB考虑直接用专业的防火墙应用或者路由层限制。4. logcat 日志抓取从刷屏到精准定位4.1 为什么一执行 logcat 就被淹没adb logcat是你排查安卓问题时的最强助手也是新手最容易懵掉的地方。不加任何参数直接执行屏幕上会疯狂滚动各种 tag 的系统日志看起来毫无规律。这是因为 logcat 默认会输出所有缓冲区里的所有优先级日志而系统后台几十个服务每秒钟都在产生大量记录。它本质上是一个环形缓冲区系统不断往里面写新日志会覆盖旧日志。所以你的任务不是“把日志看完”而是找到一条精准的过滤表达式把无用的信息剔除掉。4.2 过滤参数与保存文件记住这几个组合就够logcat 最常用的参数有这么几个组合adb logcat -v time-v time显示当前时间方便对应操作时机。-v threadtime会同时显示线程 ID 和精确到毫秒的时间排查崩溃问题强烈建议用这个。adb logcat -s AndroidRuntime:E这里的-s是静默模式表示只显示指定 tag 的指定优先级内容。AndroidRuntime是 Java 层崩溃时输出堆栈的 tag后面跟:E表示只看 Error 级别。这是抓应用闪退日志的核心命令。adb logcat -c-c清空日志缓冲区确保接下来抓到的日志是操作之后发生的而不是历史残留。adb logcat -b crash可以直接读取崩溃缓冲区里面专门保存崩溃相关记录不用和主日志混在一起。保存到文件方面最简单的做法是在电脑端重定向输出adb logcat -v threadtime app.logCtrlC 中断后日志就留在当前目录的 app.log 里。有些场景要长时间抓取那我会用设备端写文件的方式adb shell logcat -v threadtime -f /sdcard/logcat.log日志直接写在设备存储里不占用 USB 传输带宽适合现场不方便操作电脑的情况。4.3 一个实际崩溃日志的分析演练假设某个应用一点开就闪退。打开开发者模式让应用处于关闭状态执行adb logcat -c然后启动应用几秒后切回命令行按 CtrlC再抓AndroidRuntime的堆栈adb logcat -v threadtime -s AndroidRuntime:E如果应用确实抛出未捕获异常你会看到类似FATAL EXCEPTION: main的字段下面跟着java.lang.NullPointerException和一行行标着包名、类名、行号的堆栈信息。定位到at com.example.demo.MainActivity.onCreate(MainActivity.java:42)这种内容问题通常就出在那个类的那一行。如果AndroidRuntime的 tag 下什么也没有但应用还是闪退就要考虑是不是没有崩溃逻辑的 native 层问题。这时改抓DEBUG标签或者用adb logcat -b crash看崩溃缓冲区经常能看到类似libc开头的段错误记录。判断方向对了排查效率会高很多。4.4 用 bugreport 做整体抓取给复杂问题留全证据排查系统级问题比如耗电异常、系统服务崩溃单抓 logcat 往往不够。这时候用adb bugreport可以一次性把系统日志、配置文件、内存信息、网络状态、电池状态等合成一个压缩包传给开发人员分析。执行方式adb bugreport bugreport.zip这个命令会运行一段时间不要中途拔线等它自然结束再检查文件。bugreport 文件比较大时间范围也比较长阅读时需要有点耐心。它适合那种“反正说不清原因只能先留个全记录”的场景帮助我抓到过不少藏在日志深处的异常。5. 模拟器、电视、手机跨设备连接命令的差异与雷区5.1 模拟器连接的端口知识不要死记硬背模拟器本质上是一个运行在电脑上的 Android 虚拟机它一般会监听电脑的某个端口adb 通过这个端口和它通信。夜神模拟器比较常见的是 62001但也有部分版本用其他端口MuMu 模拟器早期是 7555逍遥模拟器常见 21503还有些模拟器会直接在设置界面里把 ADB 调试端口标出来在模拟器设置里搜“ADB”就能看到。我的经验是不要在多个模拟器之间混着 connect 同一个端口否则会出现 adb server 端口记录错乱的情况。多开多个模拟器时单独给每个实例分配不同端口并且用adb devices确认每一台都状态正常后再操作。遇到模拟器连接失败先用adb kill-server重启 adb server再重新 connect成功率最高。5.2 电视上的 ADB 调试开关与动态密码电视和盒子这类设备没有屏幕输入版的标准授权流程很多型号采用“打开 ADB 开关后屏幕显示动态密码电脑端输入密码配对”的方式。这个动态密码一般是设备每次开启调试时随机生成的我看到有人搜索“adb 动态密码计算器”这里明确说一句动态密码就是随机码不存在计算器想连上只能看设备屏幕上显示的是什么。不同品牌电视打开 ADB 的方式混乱不堪比如老款创维有些型号需要进入工厂菜单在“常用开关”里找“ADB 调试”。电视永久打开 ADB 这件事我不建议这么干因为电视联网后一直暴露 adb 调试端口安全风险远比拿不到调试权限要大。测完了就关掉需要时再开成本并不高。5.3 无线调试没有数据线时的连接方法手机无线调试对日常操作非常方便尤其是设备已经拿在手里身边没有合适数据线的时候。Android 11 及以上系统支持原生无线调试先在手机开发者选项里打开“无线调试”然后手机会显示一组配对专用的 IP 地址和端口用adb pair 192.168.1.100:37123按提示输入手机上显示的 6 位配对码配对成功后再执行adb connect 192.168.1.100:39123端口以手机界面显示为准不同机型每次可能不一样。Android 10 及以下的老系统没有 pair 机制要先用 USB 连接执行一次adb tcpip 5555再拔线之后才能用adb connect 设备IP:5555无线连接。这个操作重启手机后会失效需要重新设置。设备类型和连接方式我整理成了一张表设备类型连接方式常用命令常见坑安卓手机USB 线或无线调试adb devices未开 USB 调试、未授权模拟器adb connect 127.0.0.1:端口adb connect 127.0.0.1:62001端口记错、多实例冲突电视盒子网络 adbadb connect 电视IP动态密码不匹配、开关隐藏深6. 进阶玩法冻结应用、模拟电池状态、数据备份6.1 用 pm disable-user 冻结应用而不是暴力卸载很多朋友想精简系统预装应用看到网上有人整理“vivo adb 精简列表”之类的帖子就直接复制粘贴执行。这种做法有风险不同设备、不同系统版本的预装包名不一样而且别人认为安全的包在你机器上可能是关键组件。安全起见应该先执行adb shell pm list packages -s查看完整的系统应用包名列表再逐一确认。确认之后用adb shell pm disable-user --user 0 包名冻结应用而不是卸载。因为冻结可以随时恢复adb shell pm enable 包名如果真的想卸载某个预装应用pm uninstall -k --user 0 包名也是只针对当前用户不会改动系统分区之后可以通过cmd package install-existing 包名恢复。红米 K70 这类的设备理论上都可以用pm disable-user冻结应用和品牌关系不大但要注意别把系统桌面、设置、系统 UI 冻结掉否则桌面直接进不去。动手之前先把要禁用的包名存到电脑文件里出一份“后悔清单”。6.2 dumpsys 系列命令比设置界面更懂系统adb shell dumpsys后面能接很多服务名用来查系统内部状态。排查耗电问题时看电池服务和耗电排行adb shell dumpsys battery adb shell dumpsys power测试续耗时会用到模拟插电状态热词里提到的dumpsys battery set usb 0就是强制通知系统当前 USB 连接状态为关闭这在某些功耗测试场景下可以用来骗过系统让它认为已经拔掉 USB。执行完这类模拟命令之后一定要记得恢复默认否则系统会一直停留在非正常状态adb shell dumpsys battery reset查看当前活跃 Activityadb shell dumpsys activity activities查看某个应用的内存占用adb shell dumpsys meminfo 包名这些都是开发调试中特别实用的组合比在设置界面里翻数据全面得多。6.3 数据备份与其他便捷操作Android 12 之前有一个adb backup命令可以把应用数据打包备份到电脑adb backup -apk -shared -all -f backup.ab但它的兼容性一直不太稳定较新的系统版本中已经逐渐被遗忘。日常备份数据我更习惯直接adb pull把需要保存的文件目录拉出来简单直接。备份之外ADB 还能模拟很多人工操作adb shell input text hello可以往输入框里直接输入文本adb shell input keyevent KEYCODE_HOME模拟按 Home 键adb shell am force-stop 包名强制停止应用。这些命令组合起来等于一台电脑远程遥控所有已连接的设备。7. 连接与权限异常的排查速查7.1 找不到设备先别怀疑线材adb devices输出空列表很多人第一反应是换线。但根据我的实际经验原因排名大概是USB 调试没打开、USB 模式选错、驱动有问题、最后才是线材。排查时先看手机屏幕有没有授权弹窗再看 USB 模式是不是“仅充电”然后到 Windows 设备管理器里找到带感叹号的 Android 设备右键更新驱动。实在不行换个原装线试试。adb服务本身也有可能卡死快速复位一次adb kill-server adb start-server7.2 连接反复断开多半不是 adb 的问题连接后过几秒就变 offline通常是 USB 线供电不稳定或者接口松动。换一个直连主板背面的 USB 口关机重启 adb server问题一般能解决。还有一种情况是电脑上开了多个虚拟机软件虚拟机和 adb server 抢 5037 端口导致设备频繁掉线。关闭不用的安卓模拟器相关进程再执行adb devices看是否恢复。7.3 权限不足和操作受限的错误执行adb pull /data/data/包名/xxx提示 permission denied这是 Android 分权机制的限制不是命令写错。普通 adb 会话没有 root 权限无法直接读取应用私有目录。换个能访问的路径或者让应用自身把文件输出到/sdcard/下。执行pm disable-user如果是关键系统组件可能也会被系统保护阻止这是正常现象换一个非关键应用再试即可。最后分享一个我个人的小习惯所有可能影响系统状态的 adb 命令我都会先看一眼当前值执行前复制一份命令到备忘录执行后立刻验证能恢复的恢复不能恢复的查文档。几分钟的谨慎能省下后面几个小时的折腾。ADB 这套工具越用越顺手但永远值得对它保持一点敬畏。
返回列表