如何使用Python+ADB实现快速点击 解决点击间隔1秒延迟问题
核心延迟原因
你当前代码的性能瓶颈来自每次循环调用device.shell()都会重新创建一次adb shell会话,单次会话的建立开销在数百毫秒到1秒区间,这就是两次点击间隔过长的根本原因。
可用优化方案
方案1:批量合并命令单次发送(改动最小,优先推荐)
如果你的点击序列是提前可预知的,直接把所有点击命令拼接为一条指令,仅调用一次device.shell()即可,点击之间的延迟会降到input命令本身的执行开销(<10ms):
from ppadb.client import Client import time def Get_device_adb(): adb = Client(host="127.0.0.1", port=5037) devices = adb.devices() if len(devices) == 0: print("No device attached") quit() return devices[0] device = Get_device_adb() taps = [(225, 750), (350, 800), ...] # 拼接所有点击命令,分号分隔 tap_command = " ; ".join([f"input tap {x} {y}" for x, y in taps]) # 单次执行所有点击 device.shell(tap_command)
方案2:复用交互式Shell会话(适合动态生成点击的场景)
如果你的点击坐标需要运行时动态计算,无法提前批量拼接,可以创建长期存活的交互式shell会话,避免每次发送命令都重建连接:
# 建立持续存活的shell流 shell_stream = device.shell_stream() # 动态发送点击命令 for tap in dynamic_generated_taps: # 这里替换为你动态生成的点击坐标列表 shell_stream.write(f"input tap {tap[0]} {tap[1]}\n".encode()) shell_stream.flush() # 如需自定义点击间隔可在此加 time.sleep(xx),单位为秒 # 用完关闭会话 shell_stream.close()
方案3:使用sendevent直接模拟硬件输入(极致性能需求可选)
如果需要毫秒级的连续点击响应,可以直接调用sendevent命令向触摸输入设备写入原始事件,相比input tap省去了框架层的封装开销,速度会再提升数倍。你需要先通过adb shell getevent -p查询你设备的触摸设备编号、X/Y轴取值范围,再拼接对应的事件序列发送即可。
注意:多数游戏会设置点击频率检测阈值,过于密集的点击可能触发脚本检测机制,可根据需求自行在两次点击之间添加短时间sleep调整间隔。
内容的提问来源于stack exchange,提问作者Ran42
相关产品推荐
相关产品推荐

