如何将Android Monkey随机运行保存为可编辑脚本用于后续重放?
如何将Android Monkey随机运行过程保存为可编辑的重放脚本
当然有办法实现你的需求!既然你明确不需要依赖-s seed参数(毕竟seed只能复现随机序列,没法提前编辑事件),我们可以通过捕获Monkey事件日志并转换为标准Monkey脚本格式的方式来实现,具体步骤如下:
1. 捕获Monkey的详细事件日志
首先运行Monkey时,开启最高级别的日志输出(-vv),并将日志重定向到本地文件,这样就能记录下所有Monkey执行的操作细节。
执行命令:
adb shell monkey -p <你的包名> -vv <事件总数> > monkey_raw_events.log
比如你想让Monkey执行1000个随机事件,就把<事件总数>换成1000。这个日志文件里会包含每一个事件的类型(点击、滑动、按键等)、坐标、时间戳等关键信息。
2. 将日志转换为Monkey可识别的脚本格式
Monkey脚本采用逐行指令的格式,支持的核心指令包括:
Tap <x> <y>:模拟屏幕点击Drag <x1> <y1> <x2> <y2> <时长(毫秒)>:模拟拖拽操作Press <按键码>:模拟物理按键(比如返回键是4,主页键是3)Wait <毫秒>:暂停指定时长
你可以写一个简单的解析脚本(比如Python或Shell脚本)来处理monkey_raw_events.log,提取关键信息并转换为上述格式。举个简单的Python示例逻辑:
import re with open("monkey_raw_events.log", "r") as f: lines = f.readlines() script_lines = ["# Monkey Replay Script"] current_down = None for line in lines: # 匹配Touch DOWN事件 down_match = re.search(r'Touch \(ACTION_DOWN\): 0:\((\d+\.\d+), (\d+\.\d+)\)', line) if down_match: x = int(float(down_match.group(1))) y = int(float(down_match.group(2))) current_down = (x, y) continue # 匹配Touch UP事件,生成Tap指令 up_match = re.search(r'Touch \(ACTION_UP\): 0:\((\d+\.\d+), (\d+\.\d+)\)', line) if up_match and current_down: x_up = int(float(up_match.group(1))) y_up = int(float(up_match.group(2))) if x_up == current_down[0] and y_up == current_down[1]: script_lines.append(f"Tap {x_up} {y_up}") else: # 如果Down和Up坐标不同,视为Drag script_lines.append(f"Drag {current_down[0]} {current_down[1]} {x_up} {y_up} 500") script_lines.append("Wait 300") # 每次操作后加短暂等待 current_down = None # 匹配按键事件 key_match = re.search(r'KeyDown\((\d+)\)', line) if key_match: keycode = key_match.group(1) script_lines.append(f"Press {keycode}") script_lines.append("Wait 300") # 保存为脚本文件 with open("monkey_replay_script.txt", "w") as f: f.write("\n".join(script_lines))
运行这个脚本后,你会得到一个monkey_replay_script.txt,里面就是格式化好的可编辑脚本。
3. 编辑脚本(按需调整)
现在你可以直接打开monkey_replay_script.txt进行编辑:
- 删除不需要的操作步骤
- 修改点击/拖拽的坐标
- 调整
Wait的时长 - 新增自定义的指令(比如添加特定的按键操作)
4. 推送到设备并重放脚本
首先把编辑好的脚本推送到Android设备:
adb push monkey_replay_script.txt /sdcard/
然后执行Monkey重放命令:
adb shell monkey -p <你的包名> -f /sdcard/monkey_replay_script.txt 1
这里最后的1表示重放一次脚本,你可以根据需要修改次数。
这种方式完全满足你“编辑脚本后再重放”的需求,相比seed参数灵活性高得多。
内容的提问来源于stack exchange,提问作者FlyingPumba
相关产品推荐
相关产品推荐

