ADB命令实战指南:从基础连接到自动化测试的完整教程

📅 2026/8/7 2:57:07
ADB命令实战指南:从基础连接到自动化测试的完整教程
1. 从“救火队员”到“效率大师”ADB命令的实战价值如果你是一名移动端开发者、测试工程师或者是一名热衷于折腾手机、平板的极客那么ADBAndroid Debug Bridge这个名字你一定不陌生。它就像一把连接电脑与Android设备的“瑞士军刀”平时可能静静地躺在SDK的platform-tools目录里但一旦遇到真问题——比如应用闪退抓不到日志、手机变砖需要救砖、批量安装卸载应用、甚至是自动化测试——ADB往往是那个能把你从水深火热中捞出来的“救火队员”。然而很多朋友对ADB的认知可能还停留在adb devices查看连接和adb install安装应用这个层面这实在是有些大材小用了。今天我们就来系统性地梳理一下ADB命令目标不是罗列手册而是结合我这些年在一线开发、测试和搞机中踩过的坑、总结出的经验让你从“知道有这个东西”升级为“知道怎么高效用好它”真正成为掌控Android设备的“效率大师”。2. 连接与基础稳定沟通是第一步所有ADB操作的前提是你的电脑和Android设备之间建立了一条稳定、可靠的通信通道。这一步看似简单却埋着最多的“坑”。2.1 多种连接方式详解与选型ADB主要支持三种连接方式USB连接、网络连接Wi-Fi和无线调试Android 11。每种方式都有其最佳使用场景和注意事项。USB连接是最经典、最稳定的方式。它不依赖网络环境传输速率高特别适合刷机、传输大文件、进行需要高带宽的操作。操作步骤大家可能都熟悉在手机的“开发者选项”中开启“USB调试”用数据线连接电脑然后在电脑终端执行adb devices如果看到设备序列号后面跟着device字样就表示连接成功。这里有个关键细节数据线质量至关重要。我遇到过无数次连接不稳定、时断时续的问题最后排查下来多半是用了劣质或只能充电不能传输数据的线。建议备一根原装或品牌的数据线专用于调试。注意首次通过USB连接一台新设备时手机会弹出“允许USB调试吗”的RSA密钥指纹确认对话框。务必勾选“始终允许”并点击确定。如果没看到弹窗可以尝试重插数据线或检查开发者选项是否真的已开启。网络连接Wi-Fi ADB让你摆脱线缆的束缚非常方便。传统方法是先用USB线连接执行adb tcpip 5555命令将设备监听端口切换到TCP/IP模式然后拔掉线执行adb connect 设备IP地址:5555。它的优点是灵活设备可以放在一边远程操作。但缺点也很明显依赖同一局域网速度受Wi-Fi质量影响且如果设备重启或网络环境变化连接会断开需要重新用USB线执行adb tcpip来初始化颇为麻烦。无线调试Android 11及以上是谷歌官方推荐的无线连接方式解决了传统Wi-Fi ADB需要先USB初始化的问题。在开发者选项中找到“无线调试”启用它。你会看到一对IP地址和端口号例如192.168.1.100:42425。在电脑上直接使用adb pair IP:端口命令并输入手机上显示的配对码即可完成配对。之后就可以用adb connect IP:端口进行连接了。这种方式更安全需要配对码也更方便是未来无线调试的主流。连接方式选型建议日常开发调试优先使用USB连接稳定压倒一切。需要设备远离电脑或进行自动化测试使用无线调试Android 11。旧设备或无无线调试选项使用传统网络连接但做好需要反复初始化的心理准备。2.2 连接故障的完整排查链路当adb devices列表为空或显示unauthorized/offline时别慌按照以下链路一步步排查检查物理层换一根已知良好的数据线换一个USB接口优先使用主板后置接口供电更稳。检查设备端确认手机“开发者选项”已开启。进入“关于手机”连续点击“版本号”7次可激活确认“USB调试”开关已打开。如果是首次连接查看手机屏幕是否有RSA密钥确认弹窗。如果是无线连接确认设备与电脑在同一局域网IP地址是否正确防火墙是否阻止了5555等端口。检查电脑端确认ADB服务已启动。可以尝试adb kill-server然后adb start-server重启ADB守护进程。检查设备驱动Windows下常见问题。在“设备管理器”中查看是否有带感叹号的“Android Device”或“ADB Interface”如有需要安装对应的USB驱动通常可通过安装完整的Android SDK或手机厂商提供的PC套件解决。是否有其他程序如第三方手机助手、模拟器占用了ADB端口尝试关闭它们。终极手段重启ADB服务、重启手机、重启电脑。这个“重启三连”虽然听起来像玄学但确实能解决很多偶发的底层通信问题。3. 设备管理与信息获取知己知彼百战不殆连接成功后我们首先需要了解我们的设备。ADB提供了一系列命令来获取设备状态和详细信息这对于问题诊断、环境确认和脚本编写至关重要。3.1 核心状态与属性查询命令adb devices -l比adb devices更详细会列出设备的型号product和连接类型usb或network。adb get-state获取设备当前状态通常是device正常、offline连接异常或bootloader引导模式。adb shell getprop这是信息宝库。它会打印出设备的所有系统属性ro.*只读persist.*持久化sys.*运行时。我们常用它来获取特定信息adb shell getprop ro.product.model获取设备型号如“Pixel 6”。adb shell getprop ro.build.version.release获取Android版本号如“13”。adb shell getprop ro.serialno获取设备序列号与adb devices显示的一致。adb shell getprop ro.build.type获取构建类型user代表用户版权限低userdebug或eng代表调试版权限高可做更多操作。3.2 系统状态监控与日志抓取adb shell dumpsys输出所有系统服务的状态信息内容极其庞大。通常我们会配合grep或findstron Windows来过滤需要的信息。adb shell dumpsys meminfo package_name查看指定应用的内存使用详情是分析内存泄漏的利器。adb shell dumpsys cpuinfo查看CPU占用情况。adb shell dumpsys battery查看电池状态电量、健康状况、充电状态。adb shell dumpsys window displays查看屏幕显示信息包括分辨率、密度等。adb logcat抓取系统日志这是调试应用崩溃、分析问题根源的核心工具。直接运行会持续输出滚动的日志。常用参数adb logcat -v time在每行日志前加上时间戳便于定位。adb logcat -s TAG只过滤显示包含特定TAG的日志例如adb logcat -s MyApp。adb logcat *:E只显示错误Error及以上级别的日志在排查崩溃时非常有用。adb logcat -c清空当前的日志缓冲区。实战技巧当应用发生崩溃时一个高效的流程是先adb logcat -c清空旧日志然后复现崩溃紧接着执行adb logcat -v time *:E crash.log将错误日志保存到文件再在文件中搜索你的应用包名或“FATAL”、“CRASH”等关键字。3.3 屏幕操作与录屏adb shell screencap -p /sdcard/screen.png截取屏幕截图并保存到设备存储。然后可以用adb pull /sdcard/screen.png .拉到电脑上。一键截图到电脑adb exec-out screencap -p screenshot.png注意是exec-out不是shell这个命令直接将二进制数据流输出到电脑效率更高。adb shell screenrecord /sdcard/demo.mp4录制屏幕默认最多180秒支持--size、--bit-rate等参数调整画质和大小。录制时按CtrlC停止。adb shell input模拟输入事件是自动化测试的基石。adb shell input tap x y在坐标(x, y)处模拟点击。adb shell input swipe x1 y1 x2 y2 [duration]模拟从(x1,y1)滑动到(x2,y2)可指定持续时间毫秒。adb shell input text “hello”输入文本“hello”。注意无法输入中文和一些特殊字符。adb shell input keyevent keycode模拟按键例如adb shell input keyevent 26是电源键3是Home键4是返回键。KEYCODE列表可以通过adb shell input keyevent不加参数查看部分或查阅Android官方文档。4. 应用生命周期管理安装、卸载与数据操控对应用进行安装、卸载、清理数据是开发和测试中的高频操作。这里面的门道也不少。4.1 安装与卸载的进阶参数adb install path_to_apk基本安装命令。-r替换已存在的应用保留数据。这是最常用的参数之一在迭代开发时不需要先卸载再安装。-t允许安装测试APK即使AndroidManifest.xml中没有android:testOnly”true”有些构建版本可能需要。-d允许降级安装版本号比已安装的低。-g授予APK中声明的所有运行时权限。对于需要动态权限的应用安装后无需手动点击授权非常方便自动化。组合使用示例adb install -r -g app-debug.apk表示覆盖安装并自动授予所有权限。adb uninstall package_name卸载应用。-k卸载应用但保留数据和缓存。这个参数要慎用通常用于测试数据是否导致问题。下次安装同名应用时会恢复这些数据。4.2 应用数据与缓存的高级操作有时我们不想卸载应用只想清空它的数据相当于在设置里点击“清除数据”或者需要备份/恢复特定应用的数据。adb shell pm clear package_name清除应用数据。这比卸载重装更快能快速将应用恢复到首次安装的状态是测试的常用操作。adb backup -f backup.ab -apk -shared -all这是一个已废弃但有时仍有用的完整备份命令需要设备确认。它可以备份应用及其数据、共享存储等。但由于安全限制和兼容性问题在新设备和Android版本上可能失败。更实用的方案直接操作/data/data/和/sdcard/。但这需要root权限。对于已root的设备或模拟器备份应用私有数据adb shell su -c “tar -czf /sdcard/data_backup.tar.gz /data/data/package_name”然后adb pull /sdcard/data_backup.tar.gz .。恢复将备份文件推送到设备然后adb shell su -c “tar -xzf /sdcard/data_backup.tar.gz -C /”。重要提示直接操作/data/data/风险极高且不同应用的数据结构不同恢复后可能导致应用崩溃。仅建议高级用户在明确知道自己在做什么的情况下用于备份游戏存档等特定场景。4.3 应用信息查询与进程管理adb shell pm list packages列出所有已安装应用的包名。-f显示包名和对应的APK路径。-s只显示系统应用。-3只显示第三方应用。-e只显示启用的应用。–user user_id多用户设备上列出指定用户的应用。Android支持多用户和工作资料。结合grep过滤adb shell pm list packages | grep mycompany快速找到自己开发的所有应用。adb shell pm path package_name显示指定应用APK文件的安装路径。adb shell pm dump package_name导出指定应用的完整信息权限、活动、服务等内容非常详细可用于分析。adb shell ps或adb shell ps -A查看系统进程列表。可以结合grep查找自己的应用进程查看其PID进程ID和内存占用。adb shell am活动管理器Activity Manager命令用于启动组件、发送广播等。adb shell am start -n package_name/activity_full_name启动一个Activity。例如adb shell am start -n com.example.myapp/.MainActivity。adb shell am force-stop package_name强制停止一个应用。比在最近任务里划掉更彻底。adb shell am broadcast -a action发送一个广播。5. 文件传输与系统操作深入设备腹地ADB也是电脑和设备之间传输文件、甚至直接修改系统文件的桥梁。5.1 文件推送与拉取adb push local remote将电脑上的文件或目录推送到设备。示例adb push ./update.zip /sdcard/。注意路径权限通常只能推送到/sdcard/、/storage/emulated/0/等外部存储目录或/data/local/tmp/这个临时目录无需root。尝试推送到系统目录如/system会因权限不足而失败。adb pull remote local将设备上的文件或目录拉取到电脑。示例adb pull /sdcard/DCIM/Camera ./photos/拉取相机照片。拉取应用私有数据需要rootadb shell su -c “cat /data/data/package/files/db.sqlite” ./db.sqlite。5.2 Shell下的文件与进程操作进入adb shell后你就拥有了一个设备的终端。常用的命令和Linux/Bash类似ls,cd,pwd,cat,echo,rm,mkdir,cp,mv基础文件操作。ps,top,kill进程查看与管理。kill -9 pid可以强制结束进程。df查看磁盘空间使用情况。chmod,chown修改文件权限和所有者通常需要root。grep文本搜索在分析日志或配置文件时必不可少。例如在shell里logcat | grep “MyApp”。find查找文件。例如find /sdcard -name “*.jpg”。5.3 权限提升与系统分区操作需要Root对于已root的设备可以在adb shell命令前加上su -c来以root权限执行单条命令或者先执行adb shell再在shell里执行su切换到root用户。高危操作警告以下操作可能使设备变砖仅供高级用户了解操作前务必确认并备份。adb remount将/system分区重新挂载为可读写。这是修改系统文件如hosts文件、内置应用的前提。此命令通常只在工程模式或已解锁system分区的设备上有效。adb shell mount -o rw,remount /system另一种重新挂载/system为可读写的方式。adb shell “cat /sdcard/new_hosts /system/etc/hosts”替换系统的hosts文件需要先remount。adb shell pm disable-user package_name禁用某个系统应用需要root。例如禁用厂商预装的臃肿软件。adb shell pm enable package_name可以重新启用。6. 高级技巧与自动化脚本释放ADB的真正潜力当单个命令满足不了复杂需求时组合使用ADB命令或者将其嵌入脚本能实现强大的自动化。6.1 命令组合与管道操作ADB命令可以像Linux命令一样组合使用。连续执行使用连接命令前一个成功才执行后一个。adb devices adb logcat -c adb logcat -v time log.txt。管道传递在adb shell内部或与本地命令结合。例如统计日志中某个错误出现的次数adb logcat -d | grep -c “Fatal exception”。循环与条件可以编写Shell脚本.sh或批处理文件.bat在里面使用for循环、if条件判断来批量操作设备或应用。# 示例批量安装当前目录下所有APK for apk in *.apk; do echo “Installing $apk…” adb install -r -g “$apk” done6.2 多设备管理当同时连接多台设备多部手机、多个模拟器时需要在命令中指定目标设备。adb devices会列出所有设备序列号。使用-s serial_number参数指定对哪台设备操作。例如adb -s emulator-5554 install app.apk。使用-e参数指定对唯一的模拟器操作使用-d参数指定对唯一的USB设备操作当连接了多个不同类型设备时。6.3 实战场景自动化测试与批量操作脚本假设一个测试场景需要在一台设备上反复安装测试APK清空数据启动应用进行一些操作然后抓取日志。#!/bin/bash # auto_test.sh PACKAGE_NAME“com.example.myapp” APK_PATH“./app-debug.apk” LOGFILE“test_$(date %Y%m%d_%H%M%S).log” echo “开始自动化测试…” | tee -a $LOGFILE for i in {1..10}; do echo “第 $i 轮测试” | tee -a $LOGFILE # 1. 卸载旧版本可选-r覆盖安装通常更快 # adb uninstall $PACKAGE_NAME # 2. 安装应用覆盖安装并授权 adb install -r -g $APK_PATH 21 | tee -a $LOGFILE # 3. 清空应用数据确保每次起点一致 adb shell pm clear $PACKAGE_NAME 21 | tee -a $LOGFILE # 4. 启动主Activity adb shell am start -n $PACKAGE_NAME/.MainActivity 21 | tee -a $LOGFILE sleep 3 # 等待应用启动 # 5. 模拟一些用户操作 adb shell input tap 500 1000 # 点击某个按钮 sleep 1 adb shell input text “test$i” sleep 1 adb shell input keyevent 4 # 按返回键 # 6. 抓取本轮日志片段 echo “ 第 $i 轮日志开始 ” $LOGFILE adb logcat -d -v time –pid$(adb shell pidof -s $PACKAGE_NAME) $LOGFILE 21 echo “ 第 $i 轮日志结束 ” $LOGFILE # 7. 强制停止应用 adb shell am force-stop $PACKAGE_NAME sleep 2 done echo “自动化测试完成日志保存在 $LOGFILE”这个脚本展示了如何将多个ADB命令组合起来形成一个完整的自动化测试流程。你可以根据自己的测试需求修改其中的操作步骤和等待时间。6.4 性能监控简易脚本除了dumpsys meminfo和cpuinfo我们还可以写一个简单的脚本周期性地抓取某个应用的内存和CPU占用。#!/bin/bash # monitor.sh PACKAGE_NAME“com.example.myapp” INTERVAL2 # 采样间隔秒 DURATION60 # 监控时长秒 echo “时间, CPU%, 内存PSS(KB)” performance.csv end$((SECONDSDURATION)) while [ $SECONDS -lt $end ]; do # 获取进程PID pid$(adb shell pidof -s $PACKAGE_NAME) if [ -z “$pid” ]; then echo “应用未运行” sleep $INTERVAL continue fi # 获取CPU和内存信息这里简化处理实际解析top或dumpsys meminfo输出更准确 # 示例使用dumpsys meminfo获取PSS内存 mem_info$(adb shell dumpsys meminfo $PACKAGE_NAME | grep “TOTAL PSS:” | awk ‘{print $3}’) # 注意CPU占用率获取较复杂可能需要解析top或/proc/stat此处省略细节 echo “$(date %H:%M:%S), N/A, $mem_info” performance.csv sleep $INTERVAL done echo “监控结束数据已保存到 performance.csv”这个脚本提供了一个思路框架实际应用中需要更精细地解析adb shell top -n 1或adb shell dumpsys cpuinfo的输出来获取准确的CPU百分比。ADB的强大远不止于此它还与fastboot刷机模式、bugreport生成完整的设备诊断报告等工具链紧密结合。掌握这些命令意味着你掌握了与Android设备深度对话的能力。从简单的文件传输到复杂的自动化测试从问题排查到性能调优ADB都是你工具箱里不可或缺的利器。我个人的体会是不要试图一次性记住所有命令而是从实际需求出发遇到问题知道用什么命令去解决或者去查询多用几次自然就熟了。最好的学习方法就是现在就打开终端连上你的设备把上面提到的命令亲手敲一遍看看它们的输出到底是什么。实践出真知在移动开发和调试这条路上ADB绝对是你值得花时间深挖的伙伴。