awesome-adb脚本编写指南:自动化你的调试流程
你是否还在为重复执行ADB命令而烦恼?是否希望一键完成应用安装、日志抓取和设备控制等操作?本文将带你通过编写ADB脚本来自动化这些流程,让调试效率提升10倍。读完本文后,你将掌握基础脚本结构设计、常用场景自动化实现和高级错误处理技巧,轻松应对日常调试工作。
为什么需要ADB脚本?
ADB(Android Debug Bridge,安卓调试桥)是连接电脑与安卓设备的重要工具,但手动输入命令不仅效率低下,还容易出错。通过脚本整合常用命令序列,你可以实现:
- 一键安装并启动应用
- 自动抓取特定场景日志
- 批量执行设备操作
- 定时任务监控应用状态
项目核心文档README.md中详细列出了200+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脚本时,可使用以下技巧进行调试和优化:
- 开启调试模式:在脚本开头添加
set -x可显示执行的每个命令 - 输出重定向:将命令输出重定向到文件,便于分析
- 命令耗时统计:使用
time命令分析耗时操作 - 精简命令链:合并多个
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自动化工作流,让调试工作事半功倍!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




