
1. ADB概述与环境搭建
什么是ADB?
ADB(Android Debug Bridge)是Android SDK中的一个多功能命令行工具,它允许开发者和测试人员与Android设备进行通信。作为连接开发环境和Android设备之间的桥梁,ADB在移动端测试中发挥着至关重要的作用。
ADB架构组成
环境搭建步骤
1. 下载Android SDK Platform Tools
# Windows
# 下载 platform-tools 并解压到指定目录
# 将路径添加到系统环境变量PATH中
# macOS
brew install android-platform-tools
# Linux (Ubuntu/Debian)
sudo apt-get install android-tools-adb
2. 验证安装
adb version
# 输出示例:
# Android Debug Bridge version 1.0.41
# Version 33.0.3-8952118
3. 设备准备
在Android设备上启用开发者选项:
- 设置 → 关于手机
- 连续点击"版本号"7次
- 返回设置 → 开发者选项
- 开启"USB调试"
2. ADB核心命令详解
基础命令结构
ADB命令的基本语法结构如下:
adb [-d|-e|-s <serialNumber>] <command>
命令分类体系
3. 设备管理与连接
设备发现与连接
查看连接的设备
# 列出所有连接的设备
adb devices
# 详细信息显示
adb devices -l
# 输出示例:
# List of devices attached
# emulator-5554 device product:sdk_gphone64_arm64 model:sdk_gphone64_arm64 device:generic_arm64
# RF8M802WK0J device usb:2-1 product:beyond1lte model:SM_G973F device:beyond1
多设备环境下的设备选择
# 通过序列号指定设备
adb -s RF8M802WK0J shell getprop ro.product.model
# 指定USB连接设备
adb -d shell getprop ro.product.model
# 指定模拟器设备
adb -e shell getprop ro.product.model
TCP/IP无线连接
# 步骤1:通过USB连接并启用TCP/IP模式
adb tcpip 5555
# 步骤2:获取设备IP地址
adb shell ip addr show wlan0
# 步骤3:断开USB,通过IP连接
adb connect 192.168.1.100:5555
# 验证连接
adb devices
连接状态管理
4. 应用程序测试命令
应用安装与卸载
APK安装
# 基本安装
adb install app.apk
# 强制安装(覆盖已存在的应用)
adb install -r app.apk
# 安装到SD卡
adb install -s app.apk
# 允许测试APK安装
adb install -t app.apk
# 安装多个APK(适用于App Bundle)
adb install-multiple base.apk config.arm64_v8a.apk config.zh.apk
应用卸载
# 卸载应用
adb uninstall com.example.app
# 卸载但保留数据
adb uninstall -k com.example.app
应用生命周期管理
Activity管理器(AM)命令
# 启动Activity
adb shell am start -n com.example.app/.MainActivity
# 启动Activity并传递参数
adb shell am start -n com.example.app/.MainActivity \
-e "key1" "value1" \
-e "key2" "value2"
# 强制停止应用
adb shell am force-stop com.example.app
# 启动Service
adb shell am startservice -n com.example.app/.MyService
# 发送广播
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED
应用测试流程
5. 系统信息获取与监控
设备信息查询
基本设备属性
# 获取设备型号
adb shell getprop ro.product.model
# 获取Android版本
adb shell getprop ro.build.version.release
# 获取API级别
adb shell getprop ro.build.version.sdk
# 获取设备序列号
adb shell getprop ro.serialno
# 获取CPU架构
adb shell getprop ro.product.cpu.abi
系统状态监控
# 内存使用情况
adb shell cat /proc/meminfo
# CPU信息
adb shell cat /proc/cpuinfo
# 磁盘使用情况
adb shell df -h
# 运行的进程
adb shell ps | grep com.example.app
性能监控命令
dumpsys系统服务
# 内存使用详情
adb shell dumpsys meminfo com.example.app
# 电池使用情况
adb shell dumpsys battery
# CPU使用统计
adb shell dumpsys cpuinfo
# 网络统计
adb shell dumpsys netstats
# 应用权限信息
adb shell dumpsys package com.example.app
实时监控工具
top命令监控
# 实时系统资源监控
adb shell top -n 1
# 监控特定进程
adb shell top -p $(adb shell pidof com.example.app)
性能监控流程图
6. 文件传输与管理
文件传输操作
push和pull命令
# 从本地推送文件到设备
adb push local_file.txt /sdcard/
# 推送整个目录
adb push local_directory/ /sdcard/test/
# 从设备拉取文件到本地
adb pull /sdcard/test_result.log ./
# 拉取整个目录
adb pull /sdcard/Pictures/ ./device_pictures/
文件权限与管理
# 查看文件权限
adb shell ls -l /sdcard/test_file.txt
# 修改文件权限(需要root)
adb shell chmod 755 /data/local/tmp/test_script.sh
# 创建目录
adb shell mkdir -p /sdcard/test_logs/
# 删除文件
adb shell rm /sdcard/test_file.txt
# 删除目录
adb shell rm -rf /sdcard/test_directory/
数据备份与恢复
应用数据管理
# 备份应用数据
adb backup -f backup.ab com.example.app
# 恢复应用数据
adb restore backup.ab
# 备份所有应用数据
adb backup -all -f full_backup.ab
# 备份系统数据
adb backup -system -f system_backup.ab
文件操作工作流
7. 网络调试与分析
端口转发设置
本地端口转发
# 将设备端口转发到本地
adb forward tcp:8080 tcp:8080
# 查看转发列表
adb forward --list
# 删除特定转发
adb forward --remove tcp:8080
# 删除所有转发
adb forward --remove-all
反向端口转发
# 将本地端口转发到设备
adb reverse tcp:8080 tcp:8080
# 查看反向转发列表
adb reverse --list
# 删除反向转发
adb reverse --remove tcp:8080
# 删除所有反向转发
adb reverse --remove-all
网络连接监控
网络状态查询
# 查看网络接口信息
adb shell ip addr show
# 查看路由表
adb shell ip route show
# 查看DNS配置
adb shell getprop net.dns1
# 监控网络连接
adb shell netstat -an
网络流量分析
# 查看应用网络使用统计
adb shell dumpsys netstats detail
# 实时网络流量监控
adb shell cat /proc/net/dev
# 特定应用的网络统计
adb shell dumpsys package com.example.app | grep -i network
网络测试架构
8. 自动化测试集成
测试脚本编写
Bash脚本示例
#!/bin/bash
# ADB自动化测试脚本
APP_PACKAGE="com.example.testapp"
APK_PATH="./app-debug.apk"
TEST_DEVICE=""
# 函数:选择测试设备
select_device() {
devices=($(adb devices | grep -v "List" | awk '{print $1}'))
if [ ${#devices[@]} -eq 0 ]; then
echo "未发现连接的设备"
exit 1
elif [ ${#devices[@]} -eq 1 ]; then
TEST_DEVICE=${devices[0]}
else
echo "发现多个设备,请选择:"
select device in "${devices[@]}"; do
TEST_DEVICE=$device
break
done
fi
echo "选择的测试设备: $TEST_DEVICE"
}
# 函数:安装测试应用
install_app() {
echo "正在安装应用..."
adb -s $TEST_DEVICE install -r $APK_PATH
if [ $? -eq 0 ]; then
echo "应用安装成功"
else
echo "应用安装失败"
exit 1
fi
}
# 函数:启动应用
start_app() {
echo "启动应用..."
adb -s $TEST_DEVICE shell am start -n $APP_PACKAGE/.MainActivity
sleep 3
}
# 函数:执行测试
run_tests() {
echo "开始执行测试..."
# 清除日志
adb -s $TEST_DEVICE logcat -c
# 开始日志收集
adb -s $TEST_DEVICE logcat -v time > test_log.txt &
LOGCAT_PID=$!
# 模拟用户操作
adb -s $TEST_DEVICE shell input tap 500 1000
sleep 2
adb -s $TEST_DEVICE shell input text "test input"
sleep 2
adb -s $TEST_DEVICE shell input keyevent 4 # 返回键
# 停止日志收集
sleep 5
kill $LOGCAT_PID
echo "测试执行完成"
}
# 函数:清理环境
cleanup() {
echo "清理测试环境..."
adb -s $TEST_DEVICE shell am force-stop $APP_PACKAGE
adb -s $TEST_DEVICE uninstall $APP_PACKAGE
}
# 主执行流程
main() {
select_device
install_app
start_app
run_tests
cleanup
echo "自动化测试完成"
}
main
Python自动化框架
使用Python封装ADB操作
import subprocess
import time
import json
from typing import List, Dict, Optional
class ADBHelper:
def __init__(self, device_serial: Optional[str] = None):
self.device_serial = device_serial
self.adb_prefix = f"adb -s {device_serial}" if device_serial else "adb"
def execute_command(self, command: str) -> str:
"""执行ADB命令并返回结果"""
full_command = f"{self.adb_prefix} {command}"
try:
result = subprocess.run(
full_command,
shell=True,
capture_output=True,
text=True,
timeout=30
)
return result.stdout.strip()
except subprocess.TimeoutExpired:
raise Exception(f"命令执行超时: {full_command}")
def get_connected_devices(self) -> List[str]:
"""获取连接的设备列表"""
output = self.execute_command("devices")
devices = []
for line in output.split('\n')[1:]:
if 'device' in line:
device_id = line.split('\t')[0]
devices.append(device_id)
return devices
def install_app(self, apk_path: str, force: bool = True) -> bool:
"""安装应用"""
command = f"install {'-r' if force else ''} {apk_path}"
result = self.execute_command(command)
return "Success" in result
def start_app(self, package_name: str, activity: str) -> bool:
"""启动应用"""
command = f"shell am start -n {package_name}/{activity}"
result = self.execute_command(command)
return "Starting" in result
def get_app_memory_usage(self, package_name: str) -> Dict:
"""获取应用内存使用情况"""
command = f"shell dumpsys meminfo {package_name}"
output = self.execute_command(command)
# 解析内存信息(简化版)
memory_info = {}
for line in output.split('\n'):
if 'TOTAL' in line:
parts = line.split()
if len(parts) >= 2:
memory_info['total_pss'] = parts[1]
break
return memory_info
def capture_screenshot(self, save_path: str) -> bool:
"""截屏"""
command = f"shell screencap -p /sdcard/screenshot.png"
self.execute_command(command)
pull_command = f"pull /sdcard/screenshot.png {save_path}"
result = self.execute_command(pull_command)
return "file pulled" in result.lower()
# 使用示例
def run_automated_test():
adb = ADBHelper()
# 获取设备
devices = adb.get_connected_devices()
if not devices:
print("未发现连接的设备")
return
# 选择第一个设备
adb.device_serial = devices[0]
adb.adb_prefix = f"adb -s {devices[0]}"
# 安装并启动应用
if adb.install_app("./test-app.apk"):
print("应用安装成功")
if adb.start_app("com.example.app", ".MainActivity"):
print("应用启动成功")
# 等待应用完全启动
time.sleep(3)
# 获取内存使用情况
memory_info = adb.get_app_memory_usage("com.example.app")
print(f"内存使用情况: {memory_info}")
# 截屏
if adb.capture_screenshot("./test_screenshot.png"):
print("截屏保存成功")
持续集成工作流
9. 高级调试技巧
日志分析与过滤
logcat高级用法
# 按标签过滤日志
adb logcat -s "MyApp"
# 按日志级别过滤
adb logcat *:W # 只显示警告及以上级别
# 组合过滤条件
adb logcat -s "MyApp:D" "System:E"
# 使用正则表达式过滤
adb logcat | grep -E "(Error|Exception)"
# 输出到文件并实时显示
adb logcat | tee logcat_output.txt
# 清除日志缓冲区
adb logcat -c
# 显示日志缓冲区统计
adb logcat -g
日志格式化
# 时间格式化
adb logcat -v time
# 详细格式
adb logcat -v long
# 简短格式
adb logcat -v brief
# JSON格式输出
adb logcat -v json
调试工具集成
内存泄漏检测
# 生成heap dump
adb shell am dumpheap com.example.app /sdcard/heap_dump.hprof
# 下载heap dump文件
adb pull /sdcard/heap_dump.hprof ./
# 转换格式(需要SDK工具)
hprof-conv heap_dump.hprof heap_dump_converted.hprof
性能跟踪
# 开始方法跟踪
adb shell am profile start com.example.app /sdcard/trace.trace
# 停止方法跟踪
adb shell am profile stop com.example.app
# 下载跟踪文件
adb pull /sdcard/trace.trace ./
问题诊断流程
10. 最佳实践与注意事项
命令使用最佳实践
1. 设备管理规范
# ✅ 好的做法:使用设备序列号明确指定设备
adb -s RF8M802WK0J shell getprop ro.product.model
# ❌ 避免:在多设备环境下不指定设备
adb shell getprop ro.product.model # 可能操作错误的设备
2. 错误处理机制
# ✅ 好的做法:检查命令执行结果
adb install app.apk
if [ $? -eq 0 ]; then
echo "安装成功"
adb shell am start -n com.example.app/.MainActivity
else
echo "安装失败,请检查APK文件"
exit 1
fi
3. 资源清理
# ✅ 好的做法:测试完成后清理资源
cleanup_test_environment() {
adb shell am force-stop com.example.testapp
adb uninstall com.example.testapp
adb shell rm -rf /sdcard/test_data/
adb forward --remove-all
}
安全注意事项
权限管理
- 🔒 生产环境警告:生产设备不应开启USB调试
- 🔑 权限最小化:只授予必要的调试权限
- 🛡️ 网络安全:使用WiFi调试时注意网络安全
数据保护
# ✅ 敏感数据处理
# 避免在日志中输出敏感信息
adb logcat | grep -v "password\|token\|secret"
# 测试完成后清理敏感数据
adb shell rm /sdcard/test_credentials.txt
性能优化建议
1. 批量操作优化
# ✅ 好的做法:批量处理文件传输
adb push test_data/ /sdcard/batch_test/
# ❌ 避免:逐个文件传输
# for file in test_data/*; do
# adb push "$file" /sdcard/
# done
2. 连接复用
# ✅ 好的做法:复用shell连接
adb shell << 'EOF'
pm list packages | grep test
am start -n com.example.app/.MainActivity
logcat -d | tail -50
EOF
故障排除指南
常见问题解决方案
| 问题 | 原因 | 解决方案 |
|---|---|---|
device offline | 设备连接不稳定 | 重新连接USB,重启adb服务 |
device unauthorized | 未授权调试 | 检查设备上的授权弹窗 |
no devices found | 设备未正确连接 | 检查USB线缆,重新安装驱动 |
insufficient permissions | 权限不足 | 使用adb root或检查SELinux设置 |
install failed | APK安装失败 | 检查存储空间、权限、签名 |
调试命令速查表
# 服务管理
adb kill-server # 终止ADB服务
adb start-server # 启动ADB服务
adb reconnect # 重新连接设备
# 设备重启
adb reboot # 重启设备
adb reboot bootloader # 重启到bootloader
adb reboot recovery # 重启到recovery模式
# 权限提升
adb root # 以root身份重启adbd
adb unroot # 取消root权限
团队协作规范
1. 命令脚本标准化
#!/bin/bash
# 标准测试脚本模板
# 作者: [姓名]
# 创建时间: [日期]
# 用途: [脚本功能描述]
# 依赖: Android SDK Platform Tools
set -e # 遇到错误立即退出
# 配置变量
readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
readonly APP_PACKAGE="com.example.app"
readonly LOG_DIR="${SCRIPT_DIR}/logs"
# 创建日志目录
mkdir -p "${LOG_DIR}"
# 函数定义...
2. 文档记录规范
- 📝 操作记录:记录每次测试的ADB命令和结果
- 🔄 版本控制:将测试脚本纳入版本控制系统
- 📊 结果归档:建立测试结果和日志的归档机制
扩展工具集成
与其他工具的协作
Jenkins集成示例
pipeline {
agent any
stages {
stage('Setup') {
steps {
script {
// 检查ADB连接
sh 'adb devices'
}
}
}
stage('Install App') {
steps {
script {
sh '''
adb install -r app-debug.apk
if [ $? -ne 0 ]; then
echo "应用安装失败"
exit 1
fi
'''
}
}
}
stage('Run Tests') {
steps {
script {
sh '''
# 启动应用
adb shell am start -n com.example.app/.MainActivity
# 执行测试脚本
./run_adb_tests.sh
# 收集测试结果
adb pull /sdcard/test_results/ ./results/
'''
}
}
}
stage('Cleanup') {
steps {
script {
sh '''
adb shell am force-stop com.example.app
adb uninstall com.example.app
'''
}
}
}
}
post {
always {
archiveArtifacts artifacts: 'results/**/*', fingerprint: true
publishHTML([
allowMissing: false,
alwaysLinkToLastBuild: true,
keepAll: true,
reportDir: 'results',
reportFiles: 'test_report.html',
reportName: 'ADB Test Report'
])
}
}
}
总结
ADB作为Android开发和测试的核心工具,在移动端测试中发挥着不可替代的作用。通过本文的详细介绍,我们可以看到:
核心价值
- 🚀 效率提升:自动化重复性测试操作,显著提高测试效率
- 🔍 深度调试:提供深入的系统级调试能力和详细的运行时信息
- 🔧 灵活配置:支持多种设备管理和环境配置方式
- 📊 数据驱动:丰富的监控和数据收集功能支持数据驱动的测试决策
应用场景总览

发展趋势
随着移动应用复杂度的增加和测试自动化需求的提升,ADB的应用场景将会更加广泛:
- 🤖 AI辅助测试:结合机器学习技术,实现智能化的测试用例生成和执行
- ☁️ 云端测试:与云测试平台深度集成,支持大规模并行测试
- 🔄 DevOps集成:在DevOps流水线中发挥更重要的作用
- 📱 IoT设备支持:扩展到更多Android IoT设备的测试和管理
学习建议
- 理论与实践结合:在理解命令原理的基础上,多进行实际操作练习
- 脚本化思维:将常用操作封装成脚本,提高工作效率
- 问题导向学习:遇到具体问题时,深入研究相关的ADB命令和技巧
- 持续关注更新:跟踪Android SDK的更新,学习新的ADB功能特性
ADB命令的掌握是每个Android测试工程师必备的基础技能。通过系统学习和实践应用,可以大大提升移动端测试的专业水平和工作效率。希望本文能够为您的ADB学习和实践之路提供有价值的参考和指导。

1003

被折叠的 条评论
为什么被折叠?



