从入门到精通:掌握ADB命令,轻松进行安卓端全面测试

在这里插入图片描述

1. ADB概述与环境搭建

什么是ADB?

ADB(Android Debug Bridge)是Android SDK中的一个多功能命令行工具,它允许开发者和测试人员与Android设备进行通信。作为连接开发环境和Android设备之间的桥梁,ADB在移动端测试中发挥着至关重要的作用。

ADB架构组成

ADB Client
ADB Server
ADB Daemon - adbd
Android Device
开发机器
目标设备
TCP/IP
USB

环境搭建步骤

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设备上启用开发者选项:

  1. 设置 → 关于手机
  2. 连续点击"版本号"7次
  3. 返回设置 → 开发者选项
  4. 开启"USB调试"

2. ADB核心命令详解

基础命令结构

ADB命令的基本语法结构如下:

adb [-d|-e|-s <serialNumber>] <command>

命令分类体系

ADB命令
设备管理
应用操作
文件操作
系统调试
网络功能
devices
connect
disconnect
install
uninstall
shell am
push
pull
shell ls
logcat
shell dumpsys
bugreport
forward
reverse

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

连接状态管理

adb connect
连接成功
连接失败
adb disconnect
设备离线
设备恢复
权限问题
授权确认
Disconnected
Connecting
Connected
Offline
Unauthorized

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

应用测试流程

开始测试
安装测试APK
安装成功?
启动应用
检查错误日志
执行测试用例
收集日志数据
性能监控
测试完成?
生成测试报告
清理测试环境
卸载测试应用
结束
修复问题

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)
性能监控流程图
开始监控
获取基线数据
启动目标应用
开始性能采集
CPU监控
内存监控
网络监控
电池监控
数据聚合
达到监控时长?
生成性能报告
结束监控

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

文件操作工作流

开发机器ADB ServerAndroid设备adb push test_data.json /sdcard/传输文件确认传输完成传输成功adb shell启动shell会话shell就绪ls -l /sdcard/test_data.json执行ls命令文件信息显示文件详情adb pull /sdcard/result.log ./请求文件发送文件内容文件下载完成开发机器ADB ServerAndroid设备

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

网络测试架构

测试机器
ADB Forward
Android设备
测试应用
Web服务器
ADB Reverse
代理服务器
端口映射
网络请求
响应分析
网络监控
流量统计
连接状态
延迟测试

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("截屏保存成功")

持续集成工作流

代码提交
触发CI/CD
构建APK
启动测试环境
连接测试设备
执行ADB自动化测试
UI自动化测试
性能测试
兼容性测试
收集测试结果
测试通过?
部署到测试环境
发送失败通知
生成测试报告
回滚代码
通知相关人员

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 ./

问题诊断流程

发现问题
收集基础信息
设备信息/应用版本/复现步骤
启动日志收集
复现问题
分析日志
日志中有错误信息?
定位错误原因
收集更多信息
内存使用情况
CPU使用情况
网络连接状态
存储空间
综合分析
制定解决方案
验证修复效果
问题解决?
记录解决方案
调整方案
结束

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 failedAPK安装失败检查存储空间、权限、签名
调试命令速查表
# 服务管理
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命令和结果
  • 🔄 版本控制:将测试脚本纳入版本控制系统
  • 📊 结果归档:建立测试结果和日志的归档机制

扩展工具集成

与其他工具的协作
ADB Core
Appium
UI Automator
Espresso
Firebase Test Lab
Custom Scripts
跨平台自动化
原生UI测试
单元集成测试
云端测试
定制化测试
CI/CD Pipeline
Test Reporting
Performance Monitoring
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设备的测试和管理

学习建议

  1. 理论与实践结合:在理解命令原理的基础上,多进行实际操作练习
  2. 脚本化思维:将常用操作封装成脚本,提高工作效率
  3. 问题导向学习:遇到具体问题时,深入研究相关的ADB命令和技巧
  4. 持续关注更新:跟踪Android SDK的更新,学习新的ADB功能特性

ADB命令的掌握是每个Android测试工程师必备的基础技能。通过系统学习和实践应用,可以大大提升移动端测试的专业水平和工作效率。希望本文能够为您的ADB学习和实践之路提供有价值的参考和指导。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

测试者家园

你的认同,是我深夜码字的光!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值