告别手动点点点用ADB命令实现Android游戏自动化测试附常用脚本手游测试工程师每天面对大量重复操作刷初始号、跑图验证、关卡压力测试...这些工作不仅耗时耗力还容易因人为失误导致数据偏差。其实只需掌握ADB命令的组合技巧就能将Android调试桥变成自动化测试利器。本文将手把手教你用命令行解放双手特别适合中小团队快速搭建轻量级自动化测试方案。1. ADB自动化测试核心原理ADBAndroid Debug Bridge本质上是通过USB或网络在PC与Android设备间建立通信管道。游戏自动化测试主要依赖其中的input事件模拟和shell环境控制能力。当我们在命令行输入adb shell input tap 500 500时实际发生了以下链路PC端ADB客户端将命令编码为特定协议通过USB传输到设备的ADB守护进程设备端将命令解析为Linux内核的input子系统事件系统将事件注入到当前活动窗口游戏进程这种机制相比基于图像识别的自动化方案有三大优势零延迟直接调用系统API响应速度在毫秒级低开销不占用GPU资源不影响游戏性能测试精准控制坐标和时序可精确到像素和毫秒注意部分游戏会检测输入源可能需要额外处理。可通过adb shell settings put global restricted_input_devices 0关闭输入限制。2. 游戏测试四大高频场景实战2.1 自动刷初始账号角色扮演类游戏常需要批量创建账号测试不同开局。传统方式需要人工完成启动游戏跳过开场动画输入随机用户名完成新手引导截图存档用ADB脚本可简化为#!/bin/bash for i in {1..10} # 循环10次 do adb shell am start com.game.package/.MainActivity sleep 5 # 等待加载 adb shell input tap 300 500 # 跳过动画 adb shell input text Player$i adb shell input tap 200 600 # 确认 # 模拟新手引导操作 adb shell input swipe 500 1000 500 500 200 adb shell input tap 400 400 # 截图存档 adb shell screencap -p /sdcard/screenshot_$i.png adb pull /sdcard/screenshot_$i.png ./results/ adb shell pm clear com.game.package # 清数据 done2.2 关卡遍历测试动作游戏需要验证每个关卡的通过性。关键命令组合# 模拟方向键移动角色 adb shell input keyevent 21 # KEYCODE_DPAD_LEFT adb shell input keyevent 22 # KEYCODE_DPAD_RIGHT # 连招组合键间隔100ms adb shell input keyevent 23 sleep 0.1 adb shell input keyevent 23 sleep 0.1 adb shell input keyevent 23建议配合getevent监听触摸事件adb shell getevent -lt /dev/input/event2 # 输出示例 # [ 12345.678] EV_ABS ABS_MT_POSITION_X 0000012c # [ 12345.678] EV_ABS ABS_MT_POSITION_Y 000003e82.3 性能监控与日志收集测试过程中需要同步记录性能数据# CPU监控每秒采样 adb shell top -n 10 -d 1 -b cpu.log # 内存监控 adb shell dumpsys meminfo com.game.package mem.log # 温度监控 adb shell cat /sys/class/thermal/thermal_zone*/temp temp.log # 开始测试后... adb shell logcat -v time -b main game.log2.4 多设备并行测试用-s参数指定设备序列号实现并行命令作用adb -s DEV1 install在DEV1设备安装adb -s DEV2 install在DEV2设备安装adb devices -l查看所有设备详细信息3. 高阶技巧提升脚本健壮性3.1 动态坐标适配不同分辨率设备需要自动换算坐标# 获取屏幕分辨率 output subprocess.check_output(adb shell wm size, shellTrue) width, height map(int, output.decode().split()[-1].split(x)) # 百分比坐标转换 def get_pos(x_percent, y_percent): return (width*x_percent//100, height*y_percent//100) tap_pos get_pos(50, 70) # 屏幕中心偏下3.2 异常处理机制增加错误检测和重试逻辑max_retry3 for i in $(seq 1 $max_retry); do adb shell input tap 500 500 if [ $? -eq 0 ]; then break else echo Attempt $i failed, restarting ADB... adb kill-server adb start-server fi done3.3 视频录制分析用screenrecord录制测试过程adb shell screenrecord --bit-rate 4000000 /sdcard/test.mp4 # 开始测试... adb shell pkill -l SIGINT screenrecord # 结束录制 adb pull /sdcard/test.mp44. 常用脚本库分享4.1 自动战斗循环#!/bin/bash # 自动刷副本脚本 duration$((60*5)) # 5分钟 start_time$(date %s) while [ $(($(date %s) - start_time)) -lt $duration ]; do # 释放技能 adb shell input tap 800 1800 sleep 1 # 移动 adb shell input swipe 300 1600 700 1600 500 sleep 2 done4.2 压力测试工具import random import subprocess import time def random_swipe(): x1, y1 random.randint(100,900), random.randint(500,1500) x2, y2 x1random.randint(-200,200), y1random.randint(-200,200) subprocess.run(fadb shell input swipe {x1} {y1} {x2} {y2} 50, shellTrue) for _ in range(1000): random_swipe() time.sleep(0.1)4.3 界面遍历测试// 使用Node.js自动遍历所有UI元素 const { execSync } require(child_process); const grid []; for(let x100; x900; x50){ for(let y200; y1600; y50){ grid.push([x,y]); } } grid.forEach(([x,y]) { try { execSync(adb shell input tap ${x} ${y}); console.log(Clicked ${x},${y}); } catch(e) { console.error(Failed at ${x},${y}); } });实际项目中建议将常用操作封装成函数库。比如创建一个gamebot.sh包含#!/bin/bash source ./adb_functions.sh login_player() { adb_tap 300 500 # 跳过动画 adb_text TestBot adb_tap 200 600 # 确认 } start_battle() { adb_swipe 500 1000 500 500 # 进入副本 sleep 2 adb_tap 400 700 # 开始战斗 }