1. 为什么ADB命令是移动测试工程师的瑞士军刀
在移动应用测试领域,ADB(Android Debug Bridge)就像一把多功能工具刀,几乎参与了测试流程的每个环节。我至今记得第一次用adb logcat抓到崩溃日志时的兴奋——那是一个深夜,应用在特定机型上随机崩溃的问题困扰团队两周,直到通过ADB实时日志锁定了内存泄漏的堆栈轨迹。
ADB作为Android SDK的一部分,本质上是一个客户端-服务器程序,包含三个核心组件:
- 客户端:运行在开发机器上的命令行工具(就是你输入的adb命令)
- 守护进程:在设备后台运行的adbd服务
- 服务端:管理客户端与守护进程通信的中间层
这种架构使得我们能够通过USB或网络与设备交互,即便设备没有图形界面。对于测试工程师来说,掌握ADB意味着获得了直接与Android系统对话的能力。
注意:使用ADB前需确保设备已开启开发者选项和USB调试模式。不同Android版本开启方式略有差异,通常需要在"关于手机"中连续点击版本号7次激活开发者选项。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 设备管理:从连接到授权的完整链路
2.1 连接设备时的"设备未授权"陷阱
当首次执行adb devices看到unauthorized状态时,新手常会陷入困惑。这其实是Android的安全机制在起作用。解决方案分三步:
- 检查设备是否弹出授权对话框(部分ROM会默认隐藏)
- 撤销所有USB调试授权(在开发者选项中找到"撤销USB调试授权")
- 重新插拔USB线,此时设备会明确弹出授权请求
对于云手机或模拟器,可能需要额外步骤:
bash复制# 夜神模拟器专用端口连接
adb connect 127.0.0.1:62001
# MuMu模拟器查看端口号
netstat -ano | findstr "5037"
2.2 多设备管理技巧
当同时连接多台设备时,每个命令都需要通过-s <serial>指定目标设备。我习惯用这个别名快速切换设备:
bash复制alias adb1='adb -s 192.168.1.100:5555'
alias adb2='adb -s emulator-5566'
更高效的方式是使用adb -e(针对模拟器)和adb -d(针对USB设备)的快捷方式。对于无线调试,记得先通过USB执行:
bash复制adb tcpip 5555
adb connect <device_ip>
3. 应用管理:超越install/uninstall的深度操作
3.1 安装APK的隐藏选项
基础的adb install存在几个实用变体:
bash复制# 保留数据安装(升级时特别有用)
adb install -r app.apk
# 允许降级安装(测试回滚场景)
adb install -d app.apk
# 分卷APK安装(Google Play风格)
adb install-multiple base.apk split_config.arm64_v8a.apk
遇到INSTALL_FAILED_VERSION_DOWNGRADE错误时,可以组合使用-d和-r参数,或者更彻底地:
bash复制adb uninstall com.example.app
adb install app.apk
3.2 应用数据清除的原子操作
adb shell pm clear命令比手动删除/data/data目录更安全完整。测试账号注销流程时,我常用这个组合命令:
bash复制adb shell pm clear com.example.app && adb shell am start -n com.example.app/.MainActivity
对于需要设备管理员权限的应用(如企业MDM),清除前需要先移除管理员身份:
bash复制adb shell dpm remove-active-admin com.example.app/.DeviceAdminReceiver
4. 文件操作:设备与PC间的数据桥梁
4.1 双向文件传输的细节控制
adb push/pull支持目录递归操作,但有几个实用参数少有人知:
bash复制# 同步模式(确保文件完全写入)
adb push -sync local_dir /sdcard/remote_dir
# 只传输新文件(类似rsync)
adb push -n local_file /sdcard/
# 显示详细进度
adb push -p large_file.zip /sdcard/
从设备拉取文件时,遇到Permission denied可以尝试:
bash复制adb exec-out run-as com.example.app cat files/data.json > local.json
4.2 直接编辑设备文件
通过组合命令实现免下载编辑:
bash复制adb pull /sdcard/config.xml
vim config.xml
adb push config.xml /sdcard/
更高级的做法是使用adb shell配合vi(如果设备有busybox):
bash复制adb shell vi /sdcard/config.xml
5. 日志系统:从基础到高级的过滤技巧
5.1 logcat的七种武器
标准用法之外,这些参数能极大提升效率:
bash复制# 显示带颜色的日志(需要终端支持)
adb logcat -v color
# 只显示某个APP的日志(无需grep过滤)
adb logcat --pid=$(adb shell pidof -s com.example.app)
# 持续监控崩溃日志
adb logcat -b crash
我常用的复合过滤器:
bash复制adb logcat -v threadtime | grep -E 'AndroidRuntime|Crash|Exception|FATAL'
5.2 日志持久化与回放
完整的日志采集方案应该包含:
bash复制# 开始记录
adb logcat -v threadtime -f /sdcard/full.log &
# 一段时间后...
killall adb
# 回放特定时间段的日志
awk '/03-15 14:00:/,/03-15 15:00:/' /sdcard/full.log
对于ANR问题,一定要同时抓取traces.txt:
bash复制adb pull /data/anr/traces.txt
6. 自动化测试的ADB进阶用法
6.1 输入事件模拟的精准控制
不同于Monkey的随机操作,精确的输入模拟应该这样:
bash复制# 点击特定坐标(需先知道屏幕分辨率)
adb shell input tap 500 1200
# 滑动(起始坐标+结束坐标+持续时间ms)
adb shell input swipe 300 800 300 400 200
# 文本输入(支持中文需先设置IME)
adb shell ime set com.android.inputmethod.latin/.LatinIME
adb shell input text "测试ABC123"
6.2 屏幕截图与录屏技巧
高质量截图方案:
bash复制adb exec-out screencap -p > screen.png
# 带时间戳的自动命名
adb shell screencap -p /sdcard/$(date +%s).png
录屏时注意:
bash复制# 限制录制时间为10秒
adb shell screenrecord --time-limit 10 /sdcard/demo.mp4
# 指定比特率(默认4Mbps)
adb shell screenrecord --bit-rate 8000000 /sdcard/hd.mp4
7. 性能数据采集的ADB方案
7.1 内存占用的多维分析
综合内存分析命令组合:
bash复制# 整体内存概况
adb shell dumpsys meminfo
# 单个应用内存详情
adb shell dumpsys meminfo com.example.app
# 连续监控(每2秒刷新)
watch -n 2 adb shell dumpsys meminfo com.example.app
7.2 CPU/GPU性能采样
使用systrace的简化版方案:
bash复制adb shell atrace -t 10 gfx view sched freq > trace.log
针对卡顿分析的特别命令:
bash复制adb shell dumpsys gfxinfo com.example.app
adb shell dumpsys SurfaceFlinger --latency
8. 特殊场景下的ADB妙用
8.1 绕过界面直接修改设置
快速修改开发者选项:
bash复制adb shell settings put global adb_enabled 1
adb shell settings put system screen_off_timeout 600000
修改系统属性(需要root):
bash复制adb shell su -c "setprop debug.layout false"
8.2 应用权限的批量管理
查看和授予权限:
bash复制adb shell dumpsys package com.example.app | grep permission
adb shell pm grant com.example.app android.permission.ACCESS_FINE_LOCATION
撤销危险权限的自动化方案:
bash复制for perm in $(adb shell pm list permissions -d -g | awk -F':' '{print $2}'); do
adb shell pm revoke com.example.app $perm
done
在真实项目中,我常用这些命令搭建自动化测试环境。比如有一个金融APP需要测试GPS定位功能,通过ADB可以模拟各种定位场景:
bash复制# 设置特定经纬度(国金中心)
adb shell am start-foreground-service -n com.example.app/.LocationService \
--ef longitude 121.506377 --ef latitude 31.243615
当测试车机系统(如8155芯片平台)时,ADB over WiFi是必须掌握的技能。先通过USB连接执行:
bash复制adb tcpip 5555
adb connect 192.168.1.200:5555
之后就可以无线调试,这在车内测试场景非常实用。
