如何让ADB快速模拟安卓手机的连续点击操作?
我之前也碰到过ADB单循环执行点击操作时速度慢到离谱的情况,那种看着操作龟速推进的感觉太煎熬了!你说的开多个终端并行跑循环确实能提速,但其实有更优雅高效的办法,不用手动开一堆窗口折腾。
为什么单循环速度这么慢?
核心原因是每次单独执行adb shell input tap都会建立一次ADB连接,从本地终端到设备的通信开销占了大部分时间,循环次数越多,累计的开销就越大,自然慢得不行。
高效解决方案
1. 把循环放到设备端执行(最推荐)
不要在本地终端做循环,而是把整个循环逻辑放到设备的shell里执行,这样只需要建立一次ADB连接,所有点击操作都在设备内部完成,能大幅提升速度:
adb shell 'for i in $(seq 1 100); do input tap 500 500; done'
这里的seq 1 100是循环次数,500 500是点击的坐标,你可以根据自己的需求修改。如果是Android 7.0以上,还可以用更高效的while循环:
adb shell 'count=0; while [ $count -lt 100 ]; do input tap 500 500; count=$((count+1)); done'
2. 用底层sendevent命令(极致速度)
如果input tap还是满足不了你的速度要求,可以试试更底层的sendevent命令,它直接向输入设备节点发送事件,跳过了input命令的封装开销。不过需要先获取你的设备的触控输入节点:
首先通过ADB执行:
adb shell getevent -l
找到类似/dev/input/eventX的触控节点(通常带有ABS_MT_POSITION_X/ABS_MT_POSITION_Y这类事件标识)。然后模拟一次点击需要发送按下、松开的事件,比如:
adb shell 'sendevent /dev/input/event2 3 53 500; sendevent /dev/input/event2 3 54 500; sendevent /dev/input/event2 1 330 1; sendevent /dev/input/event2 0 0 0; sendevent /dev/input/event2 1 330 0; sendevent /dev/input/event2 0 0 0'
把这段命令放到设备端的循环里,速度会比input tap快很多。
3. 后台并行执行(替代多终端)
如果还是想并行执行,不用手动开多个终端,直接在命令后面加&让任务在后台运行,同时启动多个:
adb shell 'for i in $(seq 1 50); do input tap 500 500; done' & adb shell 'for i in $(seq 1 50); do input tap 600 600; done' &
这样两个任务会并行执行,效果和开两个终端一样,但操作更方便。
总结
开多个终端本质是利用了多连接并行,减少单连接的阻塞,但把循环放到设备端执行才是从根源上减少通信开销、提升速度的最优解。如果追求极致速度,sendevent是更好的选择。
内容的提问来源于stack exchange,提问作者cflies1121

