awesome-adb脚本编写指南:自动化你的调试流程

awesome-adb脚本编写指南:自动化你的调试流程

【免费下载链接】awesome-adb ADB Usage Complete / ADB 用法大全 【免费下载链接】awesome-adb 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-adb

你是否还在为重复执行ADB命令而烦恼?是否希望一键完成应用安装、日志抓取和设备控制等操作?本文将带你通过编写ADB脚本来自动化这些流程,让调试效率提升10倍。读完本文后,你将掌握基础脚本结构设计、常用场景自动化实现和高级错误处理技巧,轻松应对日常调试工作。

为什么需要ADB脚本?

ADB(Android Debug Bridge,安卓调试桥)是连接电脑与安卓设备的重要工具,但手动输入命令不仅效率低下,还容易出错。通过脚本整合常用命令序列,你可以实现:

  • 一键安装并启动应用
  • 自动抓取特定场景日志
  • 批量执行设备操作
  • 定时任务监控应用状态

项目核心文档README.md中详细列出了200+ADB命令,但零散的命令难以发挥最大效能。下面我们将通过实际案例展示如何将这些命令组织成实用脚本。

ADB工作流程

基础脚本结构设计

环境准备与检查

任何自动化脚本的第一步都是环境检查,确保ADB可用且设备已连接。以下是一个基础的环境检查脚本框架:

#!/bin/bash
# 检查ADB是否安装
if ! command -v adb &> /dev/null; then
    echo "错误:未找到ADB命令,请先安装Android SDK平台工具"
    exit 1
fi

# 检查设备连接状态
adb devices | grep -q "device$"
if [ $? -ne 0 ]; then
    echo "错误:未检测到已连接的设备,请确保设备已开启USB调试并连接电脑"
    exit 1
fi

echo "ADB环境检查通过,设备已连接"

将上述代码保存为adb_env_check.sh,添加执行权限后即可运行:

chmod +x adb_env_check.sh
./adb_env_check.sh

参数处理与帮助信息

为脚本添加参数支持可以使其更灵活。以下是一个带参数解析的示例,支持指定设备序列号和操作类型:

#!/bin/bash
DEVICE=""
ACTION="install"

# 解析命令行参数
while [[ $# -gt 0 ]]; do
    case "$1" in
        -d|--device)
            DEVICE="-s $2"
            shift 2
            ;;
        -a|--action)
            ACTION="$2"
            shift 2
            ;;
        -h|--help)
            echo "用法: $0 [选项]"
            echo "  -d, --device <serial>   指定设备序列号"
            echo "  -a, --action <action>   指定操作类型(install/start/log)"
            echo "  -h, --help              显示帮助信息"
            exit 0
            ;;
        *)
            echo "未知参数: $1"
            exit 1
            ;;
    esac
done

echo "设备参数: $DEVICE"
echo "操作类型: $ACTION"

常用自动化场景实现

应用安装与启动自动化

这是最常见的ADB自动化场景,整合了安装、清除数据和启动应用的完整流程:

#!/bin/bash
# 应用自动化部署脚本
# 参数1: APK文件路径
# 参数2: 应用包名
# 参数3: 启动Activity

APK_PATH="$1"
PACKAGE_NAME="$2"
LAUNCH_ACTIVITY="$3"

# 检查参数
if [ $# -ne 3 ]; then
    echo "用法: $0 <apk_path> <package_name> <launch_activity>"
    exit 1
fi

# 安装应用
echo "正在安装应用: $APK_PATH"
adb install -r "$APK_PATH"
if [ $? -ne 0 ]; then
    echo "安装失败,退出执行"
    exit 1
fi

# 清除应用数据
echo "清除应用数据"
adb shell pm clear "$PACKAGE_NAME"

# 启动应用
echo "启动应用: $LAUNCH_ACTIVITY"
adb shell am start -n "$PACKAGE_NAME/$LAUNCH_ACTIVITY"

# 等待应用启动并抓取初始日志
sleep 5
adb logcat -d | grep "$PACKAGE_NAME" > app_start_log.txt
echo "应用启动日志已保存至app_start_log.txt"

使用示例:

./deploy_app.sh ./app-debug.apk com.example.myapp .MainActivity

日志自动化抓取与分析

以下脚本可按包名过滤日志,并自动保存到按时间命名的文件中:

#!/bin/bash
# 日志自动抓取脚本
# 参数1: 应用包名
# 参数2: 日志保存目录

PACKAGE_NAME="$1"
LOG_DIR="${2:-./logs}"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
LOG_FILE="$LOG_DIR/adb_log_$TIMESTAMP.log"

# 创建日志目录
mkdir -p "$LOG_DIR"

echo "开始抓取 $PACKAGE_NAME 的日志,按Ctrl+C停止"
echo "日志将保存至: $LOG_FILE"

# 抓取特定包名的日志,包含时间戳和进程ID
adb logcat -v threadtime "$PACKAGE_NAME":V *:S > "$LOG_FILE"

# 日志抓取停止后,自动分析错误信息
echo "日志抓取结束,正在分析错误..."
grep -iE "error|exception|crash" "$LOG_FILE" > "$LOG_DIR/error_summary_$TIMESTAMP.txt"
echo "错误摘要已保存至: $LOG_DIR/error_summary_$TIMESTAMP.txt"

设备状态监控脚本

结合README.md中"查看设备信息"章节的命令,我们可以编写一个设备状态监控脚本:

#!/bin/bash
# 设备状态监控脚本
# 参数1: 监控间隔(秒)
# 参数2: 监控次数

INTERVAL="${1:-5}"
COUNT="${2:-10}"

echo "设备状态监控开始,间隔$INTERVAL秒,共$COUNT次"
echo "监控结果将保存至device_monitor.csv"

# 写入CSV表头
echo "时间,电池电量,CPU使用率,内存占用,前台应用" > device_monitor.csv

for ((i=0; i<COUNT; i++)); do
    TIMESTAMP=$(date +%H:%M:%S)
    
    # 获取电池状态 [README.md](https://gitcode.com/gh_mirrors/aw/awesome-adb/blob/736b081a630ab14279f2362f7a9024ed44a17a45/README.md?utm_source=gitcode_repo_files#电池状况)
    BATTERY=$(adb shell dumpsys battery | grep level | awk '{print $2}%')
    
    # 获取CPU使用率
    CPU=$(adb shell top -n 1 | grep -m 1 "User" | awk '{print $2}')
    
    # 获取内存占用
    MEM=$(adb shell free -m | grep Mem | awk '{printf "%.2f%%", $3*100/$2}')
    
    # 获取前台应用 [README.md](https://gitcode.com/gh_mirrors/aw/awesome-adb/blob/736b081a630ab14279f2362f7a9024ed44a17a45/README.md?utm_source=gitcode_repo_files#查看前台-activity)
    FOREGROUND=$(adb shell dumpsys activity activities | grep mResumedActivity | awk -F '/' '{print $1}' | awk '{print $NF}')
    
    echo "$TIMESTAMP,$BATTERY,$CPU,$MEM,$FOREGROUND" >> device_monitor.csv
    echo "[$TIMESTAMP] 电池:$BATTERY CPU:$CPU 内存:$MEM 前台:$FOREGROUND"
    
    if [ $i -lt $((COUNT-1)) ]; then
        sleep $INTERVAL
    fi
done

echo "设备状态监控完成,结果已保存至device_monitor.csv"

高级脚本技巧

多设备并行操作

通过README.md章节介绍的-s参数,我们可以实现多设备并行操作:

#!/bin/bash
# 多设备并行操作脚本
# 参数1: 要执行的ADB命令(不带adb前缀)

COMMAND="$@"
DEVICES=$(adb devices | grep "device$" | awk '{print $1}')
DEVICE_COUNT=$(echo "$DEVICES" | wc -l)

if [ $DEVICE_COUNT -eq 0 ]; then
    echo "未检测到已连接的设备"
    exit 1
fi

echo "将在以下$DEVICE_COUNT台设备上执行命令: $COMMAND"
echo "----------------------------------------"

# 对每台设备并行执行命令
for DEVICE in $DEVICES; do
    echo "设备 $DEVICE 执行结果:"
    adb -s "$DEVICE" $COMMAND &
done

# 等待所有后台进程完成
wait
echo "----------------------------------------"
echo "所有设备命令执行完成"

使用示例:

./multi_device.sh shell getprop ro.product.model

错误处理与重试机制

为提高脚本健壮性,可添加错误重试机制,以下是一个带重试逻辑的应用安装脚本:

#!/bin/bash
# 带重试机制的应用安装脚本
# 参数1: APK文件路径
# 参数2: 最大重试次数(默认3次)

APK_PATH="$1"
MAX_RETRIES="${2:-3}"
RETRY_DELAY=5
DEVICE=""

# 检查是否指定设备
if [ $# -ge 3 ] && [ "$2" = "-d" ]; then
    DEVICE="-s $3"
    MAX_RETRIES="${4:-3}"
fi

# 检查APK文件
if [ ! -f "$APK_PATH" ]; then
    echo "错误: APK文件不存在 - $APK_PATH"
    exit 1
fi

echo "开始安装 $APK_PATH (最大重试$MAX_RETRIES次)"

for ((retry=1; retry<=MAX_RETRIES; retry++)); do
    echo "第$retry次尝试安装..."
    
    # 执行安装命令
    if adb $DEVICE install -r "$APK_PATH"; then
        echo "安装成功!"
        exit 0
    fi
    
    # 如果不是最后一次重试,则等待后继续
    if [ $retry -lt $MAX_RETRIES ]; then
        echo "安装失败,$RETRY_DELAY秒后重试..."
        sleep $RETRY_DELAY
    fi
done

echo "所有$MAX_RETRIES次安装尝试均失败"
exit 1

实用脚本集合

以下是几个可直接使用的实用脚本,你可以根据项目related目录中的命令扩展更多功能:

1. 应用批量卸载脚本

#!/bin/bash
# 批量卸载应用脚本
# 参数: 包含包名的文本文件,每行一个包名

if [ $# -ne 1 ]; then
    echo "用法: $0 <package_list_file>"
    exit 1
fi

PACKAGE_FILE="$1"

if [ ! -f "$PACKAGE_FILE" ]; then
    echo "错误: 文件不存在 - $PACKAGE_FILE"
    exit 1
fi

echo "将卸载以下应用:"
cat "$PACKAGE_FILE"
echo "----------------------------------------"
read -p "确认卸载? (y/N) " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
    echo "取消卸载"
    exit 0
fi

while IFS= read -r PACKAGE; do
    if [ -n "$PACKAGE" ]; then
        echo "卸载 $PACKAGE..."
        adb uninstall "$PACKAGE"
        if [ $? -eq 0 ]; then
            echo "成功卸载 $PACKAGE"
        else
            echo "卸载 $PACKAGE 失败"
        fi
    fi
done < "$PACKAGE_FILE"

2. 设备信息导出脚本

#!/bin/bash
# 设备信息导出脚本
# 参数: 输出文件路径

OUTPUT_FILE="${1:-device_info.txt}"

echo "正在收集设备信息..."

{
    echo "===== 设备基本信息 ====="
    adb shell getprop ro.product.model
    adb shell getprop ro.build.version.release
    adb shell getprop ro.build.version.sdk
    
    echo -e "\n===== 电池状态 ====="
    adb shell dumpsys battery
    
    echo -e "\n===== 显示屏信息 ====="
    adb shell wm size
    adb shell wm density
    
    echo -e "\n===== CPU信息 ====="
    adb shell cat /proc/cpuinfo | head -10
    
    echo -e "\n===== 内存信息 ====="
    adb shell free -m
    
    echo -e "\n===== 已安装应用 ====="
    adb shell pm list packages -3
} > "$OUTPUT_FILE"

echo "设备信息已导出至: $OUTPUT_FILE"

脚本调试与优化

编写ADB脚本时,可使用以下技巧进行调试和优化:

  1. 开启调试模式:在脚本开头添加set -x可显示执行的每个命令
  2. 输出重定向:将命令输出重定向到文件,便于分析
  3. 命令耗时统计:使用time命令分析耗时操作
  4. 精简命令链:合并多个adb shell调用,减少设备连接开销
# 优化前:多次设备连接
adb shell cd /data
adb shell ls -l

# 优化后:单次连接执行多个命令
adb shell "cd /data && ls -l"

总结与扩展

通过本文介绍的方法,你可以将README.md中分散的ADB命令组织成强大的自动化脚本。这些脚本不仅能提高日常调试效率,还可以集成到CI/CD流程中实现持续测试。

项目related目录下提供了更多高级命令参考:

  • am.md:活动管理器命令,用于启动Activity、发送广播等
  • pm.md:包管理器命令,用于安装、卸载应用和管理权限
  • dumpsys.md:系统服务信息查询工具

建议根据实际需求扩展脚本功能,例如:

  • 结合Python编写更复杂的逻辑处理
  • 添加邮件通知功能,在测试失败时自动发送报告
  • 集成Git操作,实现代码拉取、构建和部署的全流程自动化

希望本文能帮助你构建高效的ADB自动化工作流,让调试工作事半功倍!

【免费下载链接】awesome-adb ADB Usage Complete / ADB 用法大全 【免费下载链接】awesome-adb 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-adb

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

抵扣说明:

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

余额充值