资讯详情

adb原理与实战:Android调试命令详解

📅 2026/9/9 14:20:31 | 华诺云谱 👁 阅读
adb原理与实战:Android调试命令详解
玩Android开发或者做智能设备调试的同学应该都跟adb打过交道。这玩意儿平时不起眼但真要排查个问题、装个包、看个日志少了它还真不行。我最早接触adb是刚入行那会儿连环境变量都配不明白后来被各种奇葩报错折磨了几轮才把adb的常用命令摸清楚。其实adb没有想象中那么复杂核心逻辑就一句话通过一条USB线或网络通道让电脑能对手机发号施令。今天这篇文章就从原理到实战把平时用得上、踩过坑的adb命令一次性讲透适合刚入门Android开发和测试的同学也适合做智能电视、手表、车机等安卓设备调试的朋友收藏备用。adb全称Android Debug Bridge翻译过来是安卓调试桥。它之所以叫“桥”是因为它的职责就是连接电脑端和安卓设备两端帮你在中间传话。无论是安装APK、复制文件、查看日志、模拟点击还是读取电池状态、系统信息都可以通过adb完成。相比在屏幕上点点点adb是命令行操作效率高出不少尤其是在批量处理、自动化测试、设备出厂调试这些场景下面几乎是唯一选择。下面我按实际使用频率和操作顺序把这一整套命令讲一遍。1. adb的工作原理搞懂它你才知道命令为什么会生效1.1 adb的三端架构很多人用过adb devices却不知道这背后其实是三部分在配合工作。第一部分是电脑端的adb客户端也就是我们在终端里敲的命令行工具第二部分是设备端常驻的adbd守护进程它在安卓系统里后台运行等待接收指令第三部分是电脑端与设备端之间的adb server它由客户端自动启动监听本机端口并管理所有连接关系。你敲一条adb命令流程是客户端告诉serverserver再通过USB或网络转发给设备里的adbdadbd执行完再把结果原路返回。这套架构最直观的体验就是server挂掉后所有adb命令都会卡住或报错。所以遇到adb没反应我第一反应就是先执行adb kill-server再执行adb start-server把中间这个传话筒重启一遍。80%的连接异常都能这么解决。1.2 理解“调试桥”的逻辑命令就好记了记住一个关键点adb命令的通用结构是“adb 操作对象 动作”。操作对象主要是devices设备、shell设备里的命令行、install安装器、push/pull文件传输这些动作就是具体做什么。比如adb devices是列出设备adb shell是进入设备终端adb install是安装应用。把这层逻辑捋顺后很多命令根本不需要背看到结构就能猜出七八分。搞清楚原理之后下面从环境配置开始一步步把整套命令落地。环境这关过不去后面全是空谈。2. 环境搭建把adb装好少走一半弯路2.1 不同系统下的安装方式先说Windows。最简单的方案是直接下载Google官方的Platform Tools压缩包解压到固定目录比如D:\platform-tools然后把目录路径加进系统环境变量Path里。这个包里有adb.exe、AdbWinApi.dll这些文件一共也就十几MB比装一整个Android Studio轻量太多。如果你想省事也可以装一个带adb的集成工具但我个人建议用官方包干净且没有多余依赖。macOS用户就简单了有Homebrew的话直接执行brew install --cask android-platform-tools安好后adb就在PATH里了。Linux用户同理Ubuntu/Debian可以sudo apt install android-tools-adbCentOS/RHEL可以用sudo yum install android-tools-adb。不同发行版包名可能略有差异装不上就搜一下对应版本。如果你已经在用Android Studio其实它自带了adb路径在SDK目录的platform-tools下。Windows默认在C:\Users\你的用户名\AppData\Local\Android\Sdk\platform-toolsmacOS在~/Library/Android/sdk/platform-tools。但注意这个路径下的adb不一定被全局识别还是得手动配环境变量。2.2 环境变量配置与验证Windows配置环境变量右键“此电脑→属性→高级系统设置→环境变量”在系统变量里找到Path新建一行填入platform-tools的完整路径。改完之后一定要新开一个终端窗口再验证不然不会生效。验证命令很简单adb version如果输出了类似Android Debug Bridge version 1.0.41这样的信息就说明装好了。输出版本号只是为了确认命令能执行接下来执行adb devices此时列表应该是空的因为你还没插设备。这一步能通过就说明环境完全正常。2.3 装好之后最常见的环境坑我经常在群里看到有人问“adb不是内部或外部命令”这个报错的本质就是系统找不到adb程序也就是环境变量没配好或者没新开终端。另外Windows下还有一个高频报错adb: createfilew nul failed: 系统找不到指定的文件这个我遇到过好几次原因多半是系统环境变量里的Path被某些软件改坏了导致adb调用系统空设备nul时失败。解决办法是检查Path变量把缺失的%SystemRoot%\system32等基础项补回去然后重启终端。如果还不行就把platform-tools里的文件完整复制到另一个干净目录重配一次。3. 设备连接从USB到无线以及各种稀奇古怪的连接问题3.1 开启USB调试的正确姿势设备端必须打开“开发者选项”里的USB调试。不同版本安卓打开开发者选项的方式略有不同大部分是连续点击“版本号”7次。Android 9以下一般点完之后就出现开发者选项Android 10以上可能还需要在设置里手动进入开发者选项界面才能看到USB调试开关。连接之后手机会弹出“是否允许USB调试”的授权对话框勾选“始终允许”再确认。如果没弹窗多半是驱动问题或者数据线只能充电不能传数据。这里建议直接换一根原装数据线试试很多人排查半天最后发现是线的问题。3.2 多设备场景下的目标指定如果电脑连着多台设备adb会直接报错说检测到多个设备并要求你指定目标。列出所有设备用adb devices结果里会显示每台设备的序列号和状态。序列号是唯一的比如RK3566ABCDEF或emulator-5554这类的。指定具体设备执行命令时在adb后面加-s参数adb -s RK3566ABCDEF shell getprop ro.product.model这条命令的意思是让序列号为RK3566ABCDEF的设备执行getprop输出产品型号。多设备场景下-s参数几乎每个命令都能配建议养成习惯避免操作错设备。我在同时调试两台开发板时没加-s差点把演示机的应用给卸了从那以后所有命令都老老实实带序列号。3.3 无线调试实战USB线不够用或者设备离电脑远的时候无线调试是更好的选择。前提是手机和电脑在同一个局域网里。传统方式分两步第一步先用USB连接手机执行adb tcpip 5555这条命令让设备在5555端口开启adb监听。然后拔掉USB找到手机的IP地址在电脑上执行adb connect 192.168.1.100:5555返回connected to 192.168.1.100:5555就成功了。不过要注意手机重启后需要重新用USB执行一次tcpip命令因为你设置的端口不会永久保留。Android 11及以上还有更便捷的无线调试方式系统设置里直接就有“无线调试”选项打开后可以生成配对码执行adb pair 192.168.1.100:37623然后输入配对码配对成功后就可以直接用adb connect连了。我实测下来这个方式比老的tcpip法更稳定不需要插USB适合调试智能手表、电视盒子这类不方便插线的设备。3.4 unauthorized和找不到设备的排查思路连接手机时如果adb devices显示unauthorized说明设备端没有确认授权或者你点了“否”。这时候可以先重新插拔USB再确认手机屏幕上的授权弹窗如果弹窗不再出现可以到开发者选项里选择“撤销USB调试授权”重新插线再授权一次。如果执行adb devices直接什么都没有先检查驱动、换端口、换线再杀server重启。特别注意有些安卓设备比如部分智能电视默认隐藏了usb调试选项需要先打开“ADB调试”开关。像小天才手表这类需要校验码的设备虽然也是adb设备但厂商会做一层额外的授权校验需要在手表上查看校验码配合厂商工具获取验证后才允许连接不能直接用普通手机的授权流程硬来。4. 应用管理装、卸、查、杀一套带走4.1 安装APK的几种方式与参数应用安装是日常高频操作基本命令是adb install 你应用的路径.apk但实际项目里我几乎不直接这样装而是常用带参数的形式。-r表示覆盖安装保留数据和旧版本覆盖升级-d表示允许降级安装也就是新版本号比旧的低也能装-g表示安装时直接授予所有运行时权限适合测试应用时省去一个个点授权的麻烦。组合起来一般是adb install -r -d -g 你应用的路径.apk如果你想验证应用安装到系统分区并常驻可以用-s参数安装到SD卡或者通过root后用adb remount配合adb push把APK放到系统目录。但这些都是特殊场景普通调试用install就够了。还有一点我之前踩过坑adb install不支持安装那些写着“仅限特定系统”或者签名为testkey的APK到非root设备上会提示INSTALL_FAILED_UPDATE_INCOMPATIBLE。这种一般是签名不一致导致的先把旧包卸载再装新版就能解决。4.2 卸载应用卸载命令很简单adb uninstall 包名注意这里写的是包名不是应用名字。想知道包名可以用下面的查询命令。如果想卸载的时候保留应用数据文件加-k参数。比如要卸载微信但保留聊天记录及相关文件就执行adb uninstall -k com.tencent.mm。当然实际调试中大多数时候直接卸干净就好-k只适合特殊情况。如果只是想“禁用”某个应用而不是卸载可以执行adb shell pm disable-user 包名恢复用pm enable 包名。这个操作在调试预装应用时非常有用能模拟用户手动停用应用的效果不用真的卸载。4.3 查询应用信息与包名定位要查到某个应用对应的包名先列出设备上所有已安装应用adb shell pm list packages输出几百行眼睛看不过来更好用的是用-f参数查看包名和APK路径用-3只看第三方应用adb shell pm list packages -3当你只记得应用名字里的某个关键词比如要找“相机”可以用:adb shell pm list packages | grep cameraWindows的cmd不支持grep可以用findstradb shell pm list packages | findstr camera包名拿到后启动应用就有了依据。想直接启动某个应用的主界面adb shell am start -n 包名/Activity完整路径Activity路径不好记的话不固定写死可以先在应用运行状态下执行adb shell dumpsys window | grep mCurrentFocus这条命令会返回当前处于前台的窗口组件格式类似mCurrentFocusWindow{xxx 包名/Activity路径}直接复制到am start命令里就能重新拉起对应页面。4.4 进程停止与缓存清理调试时经常遇到应用卡死、数据残留的问题。强制停止应用adb shell am force-stop 包名相当于在设置里点“强行停止”比杀进程更彻底连后台服务也会一起停掉。如果你需要清理应用缓存目录但不卸载应用可以用adb shell pm clear 包名这个命令会清空应用的数据和缓存相当于恢复出厂状态。它和force-stop的区别是pm clear连数据库、SharedPreferences这些数据都清干净所以只适合在需要干净环境重现bug的时候使用别随手就敲。5. 文件传输与路径权限5.1 push和pull的基本用法往设备里放文件用push从设备里取文件用pull。这两个命令的本质就是文件复制和Linux的scp或者Windows的copy差不多但走的是adb通道。adb push 本地文件路径 设备目标路径 adb pull 设备文件路径 本地保存路径举个例子我想把电脑上的test.apk放到手机的Download目录adb push E:\apk\test.apk /sdcard/Download/注意目标路径要以/结尾表示放到这个目录下如果不以/结尾adb会认为它是完整文件名。这个细节我掉过坑本来想放进目录结果它直接创建了一个没有扩展名的文件后面排查了半天才发现。从设备往电脑拉日志文件同理adb pull /sdcard/logcat.txt C:\logs\5.2 常见存储路径与权限说明安卓的存储路径分两大类。/sdcard/和/storage/emulated/0/这俩是外部存储普通应用在授权后都可以读写属于用户可见的区域。/data/data/包名/属于应用私有内部存储默认情况下非root设备上普通用户无法直接访问执行adb shell后也会提示permission denied。这也是为什么很多新手pull应用数据库文件时报错的原因。如果你调试的是车机、电视盒子这类带root权限的设备可以先用adb root或者adb remount提权再访问系统目录。提权失败的话退而求其次可以用adb backup命令备份应用数据但这种方式的兼容性和限制比较多不如直接root来得爽快。另外补充一个东西Android 7及以上引入了content URI机制。你在logcat里经常能看到类似content://com.baidu.searchbox.fileprovider/baiddpath/...这样的路径片段这是应用通过FileProvider对外暴露文件访问地址不是真实文件路径。adb pull不能直接用它需要先在应用里把这个URI转成真实路径或者用adb shell content query去查ContentProvider这个属于进阶玩法普通调试用不上但知道它不是损坏路径就行别浪费时间硬拉。5.3 反向端口转发调试手机里访问电脑本地服务时会用到reverse命令。例如手机里的浏览器要访问电脑上8080端口的开发者服务可以执行adb reverse tcp:8080 tcp:8080这样手机访问localhost:8080就会转发到电脑的8080端口。这个命令在调试WebView、H5页面、模拟App调用本地接口的时候非常方便不用改代码里的服务器地址也不需要设备连到外网。6. 日志排查logcat与dumpsys的实战用法6.1 logcat基础过滤与保存看日志是adb最高频的用途。安卓系统日志全部走logcat输出你可以理解为设备端有一个环形缓冲区实时记录所有进程打印的日志。最简单的用法是实时看全部日志adb logcat但这样刷屏太严重基本没法看。更实用的做法是按标签过滤比如你只关心MainActivity相关的输出adb logcat -s MainActivity-s参数等于指定标签并隐藏其他所有内容。如果应用有多个标签可以在-s后面用空格隔开连续加adb logcat -s MainActivity OkHttp保存日志到本地文件方便回传分析adb logcat -v time C:\logcat.txt-v time会在每行日志前面加上日期和时间这个信息在排查问题时非常重要能定位崩溃发生的时序。同样Windows控制台输出重定向后实时显示会关掉让命令跑一段时间然后按CtrlC停止日志就已经写进文件里了。6.2 logcat的进阶过滤技巧如果日志太多了想同时排除一些无关内容可以用grep管道过滤。Windows下注意用findstr且cmd对特殊字符处理比较麻烦建议把所有日志先存文件再读取。adb logcat -v time | findstr error AndroidRuntimeAndroid自带的崩溃日志会打上AndroidRuntime标签看到这个标签的内容基本就找到了崩溃栈。过滤ERROR级别的日志还可以用adb logcat -v time *:E*:E表示所有标签下只显示Error及以上级别的日志。这个组合适合快速扫描设备有没有明显异常。调试原生崩溃时你甚至会把整个logcat按照进程区分先执行adb ps -A | grep 包名找到进程PID再用--pid进程号只输出该进程的日志这样干净得多。6.3 dumpsys——系统服务的体检报告dumpsys是adb shell下最强大的诊断工具之一它把系统里各服务当前的状态全部导出。比如看电池电量与充电状态adb shell dumpsys battery返回内容包括电量百分比、充电状态、温度等。更厉害的是它还能统计每个进程的耗电情况需要在设备上先开启完整统计adb shell dumpsys batterystats --enable full-wake-history开启后正常使用设备一段时间最后导出报告分析。这个命令对排查待机异常耗电、唤醒锁占用问题非常有效能清楚看到哪个应用长时间持有wakelock。虽然Android Studio自带的Profile工具也能做这事但命令行的优势是能批量跑、能在无人值守的测试机上用。其他常用的dumpsys服务还有adb shell dumpsys meminfo 包名 # 查看单个应用内存使用 adb shell dumpsys window # 查看窗口状态与焦点 adb shell dumpsys activity # 查看Activity任务栈 adb shell dumpsys package 包名 # 查看应用安装与权限详情这些命令输出都很长可以配合grep/findstr过滤关键词。想查看完整的服务列表执行adb shell dumpsys -l即可。7. 屏幕调试与自动交互7.1 截图与录屏UI自动化或者bug复现的时候截图和录屏是刚需。截图命令adb shell screencap -p /sdcard/screen.png adb pull /sdcard/screen.png C:\screen.png也可以更省事利用Windows或macOS的命令管道直接把截图存到本地adb exec-out screencap -p screen.png这个命令不走设备存储直接字节流转到本地。Windows下注意要用cmd而不是PowerShell否则容易遇到编码问题。录屏命令在Android 4.4以上可用adb shell screenrecord --time-limit 10 /sdcard/video.mp4--time-limit最大只能设180秒超过会自动分段。录屏的分辨率默认是设备分辨率也可以加--size 720x1280降低体积。录制结束会自动保存再用pull拉回电脑。7.2 input模拟触摸与按键用input命令可以实现对设备的自动化操作。模拟点击屏幕的某个坐标adb shell input tap 540 1200坐标可以通过截图后用看图工具查看。模拟滑动adb shell input swipe 540 1500 540 300 500最后的500是滑动持续时间单位毫秒。模拟键盘按键用keyevent比如按Home键、返回键、菜单键adb shell input keyevent KEYCODE_HOME adb shell input keyevent KEYCODE_BACK adb shell input keyevent KEYCODE_MENU其实在讲input命令之前有必要先说明一个关键前提这些模拟交互命令本质上是向系统注入InputEvent事件不是真的触摸屏幕。所以即使手机锁屏或者有弹窗事件照样可以注入到系统层只要系统接收就会触发对应动作。这也让input命令成了做自动化回归测试的利器。7.3 结合input实现自动化测试雏形只有单一命令还不够把它组合起来才是完全体。比如一个最简单的自动安装并启动应用的脚本在Windows批处理里可以写成adb install -r test.apk adb shell monkey -p 包名 -c android.intent.category.LAUNCHER 1monkey的-p指定包名后面的数字是随机事件数设置成1就只会启动应用。要做简单的UI点击流程就连续用input tap模拟用户点击。做长按、拖拽这类复杂手势用input swipe多段组合也能勉强实现。模拟器里控制游戏本质上也是这套逻辑。很多手机游戏或模拟器可以通过adb的input命令直接注入点击和按键比起图像识别加鼠标模拟效率更高且不容易被游戏检测到。我自己就用这个方法给模拟器里的游戏分配了快捷键先通过adb devices确定模拟器序列号再用-s emulator-5554 input tap对指定模拟器输出点击再配合命令行的循环结构就能实现简单的自动刷本脚本。7.4 修改系统设置与内核参数input之外adb shell还能直接改系统设置项。比如修改系统全局动画缩放让设备看起来更流畅adb shell settings put global window_animation_scale 0 adb shell settings put global transition_animation_scale 0 adb shell settings put global animator_duration_scale 0再比如自动开启飞行模式adb shell settings put global airplane_mode_on 1 adb shell am broadcast -a android.intent.action.AIRPLANE_MODE --ez state true通过settings put能配置大部分系统设置这比在设置界面里手工找到对应开关快得多。如果你要长时间跑性能测试还可以顺手把屏幕超时调到最长或直接保持常亮。8. 常见问题速查表与实战心得整理了日常使用中频率最高的几个问题可以直接对照排查现象可能原因处理方式adb不是内部或外部命令PATH未配置或终端未重启重新配置环境变量后新开终端adb devices无设备驱动问题/数据线不支持数据/授权未确认换线换口、重装驱动、撤销授权重试设备显示unauthorized电脑未获得授权设备端确认弹窗或撤销授权重新弹多设备时命令报错未指定目标设备加-s 序列号参数createfilew nul failedWindows环境变量Path异常修复系统变量补齐System32路径设备offlineadb server与设备连接不稳定执行adb kill-server重启或重新插拔pull权限不足目标文件在应用私有目录root提权或用pm backup等方式迁移最后说几个我这几年摸索出来的经验。第一批量操作设备时优先写一个shell脚本或批处理脚本把devices的输出解析成列表再循环执行比自己一台台手敲命令快几个数量级。第二凡是涉及长时间运行的命令比如logcat导出、dumpsys采集一定要给输出文件加时间戳后缀不然同一文件名覆盖后你根本不知道哪份是哪个时间段的。第三adb命令虽然功能强但它毕竟是一个调试工具在出厂固件、生产测试、车机设备这类场景下尽量把命令封装成脚本给同事使用避免有人误操作把系统应用卸载或者把用户数据清空。关于adb还有非常多的衍生玩法和调试技巧比如通过adb shell获取设备底层传感器数据、修改屏幕密度、批量给不同设备安装不同应用等等。文章里提到的这些都是平时最基础、最常用、踩坑率最高的那批。你先照着用起来等真正遇到具体问题的时候再根据报错信息往深了查慢慢就会有自己的命令工具箱了。我个人的体会是adb用得好不好不在于背了多少参数而在于遇到问题时能不能快速定位出是哪一层的故障——环境、连接、权限还是设备本身。把这层思路理顺adb真的就是一把趁手的螺丝刀简单、可靠、离不开。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。