用ADB操纵手机实现连点器(折衷案) |
您所在的位置:网站首页 › 手机屏幕自动连点器没反应 › 用ADB操纵手机实现连点器(折衷案) |
需要你: 有一台 windows 系统的电脑,通过 USB 连接安卓手机 用来实现: 安卓手机无需 root 的连点器 后续: 也可以把命令行操作嵌入其他代码(比如我们喜闻乐见的 python ),做个电脑操控手机用的脚本平台 注: 一如既往地,是给完全没有编程基础的人看的,所以会啰嗦很多奇怪的常识 序:下载与安装下载一个叫 ADB 的东西( http://adbdownload.com/ ),
然后会解压出一个文件夹 把这个文件夹的路径添加到 PATH ![]() ![]() ![]() ![]() 这样就配置好 ADB 了。 然后按快捷键 win+r ,输入 cmd ,回车,进入 windows 电脑的命令行 ![]() 输入 adb version回车, 能看到具体的版本号,而不是“找不着”“无定义”之类的,就说明可以用了。 一、ADB简介与点击功能的实现ADB 简单理解就是一个用来调试安卓应用的工具,可以读取通过 usb / wifi 连接的安卓设备上,正在运行的进程,也可以做出操作之类的。好处是可以不 root 就实现游戏脚本的功能。 现在我们在 windows 的命令行中,但是如果要执行与安卓操作相关的指令,进一步进入 ADB 的命令行会更方便些: adb shell现在命令行的开头部分就不再是 "地址>" 的样子,而是变成了类似 130|lotus:/ $的形式。以下进行的操作,均在该模式下进行。 该模式下输入代码需要注意的杂项: 在未选中任何代码的情况下 Ctrl+C ,会停止当前的命令,开启新的一行 该模式下 Ctrl+V 不再是黏贴的快捷键,需要从外部黏贴代码时请点击鼠标右键 同样,Ctrl+Z 也无效了,输入错误请手动删除重写 仅当行首自动加上了 lotus:/ $ 的时候,可以正常运行代码,其他情况下均需要等待或强行结束 若要退出该模式,可以输入 exit ,回车 回到正题。最简单的实现点击方式是 input tap 300 500其中 "300"、"500"所在位置分别为点击命令的横纵坐标,原点定为手机屏幕的左上角。 那么自然就想到,连点器可以这样实现: while true; do input tap 300 500; done即,开始一个死循环,无间隔地对 (300, 500) 坐标进行点击,按说这样就可以点得超快了。 但事实并非如此,因为该指令在执行时要先翻译成手机能认识的指令,所以实际上每两次点击之间会有约1秒的间隔(悲)。 二、加快响应速度(废案)1秒的速度根本不够! 因此,有人设计了一种非常快的方式,让手机不再需要从电脑接收操作指令,而是把操作码存在本地SD卡中,需要用时直接自己给自己读取就行了。简述一下思路: 试着在命令行下输入 getevent 来监听事件, 在监听中,随便在屏幕上点击(或划动),会发现命令行中输出一大堆log,大家都是在对 /dev/input/event2 写入内容。(说完,我默默用 Ctrl+C 退出了监听模式) /dev/input/event2 文件,是令手机对屏幕点击产生反应的缓存区,即: 每当手指碰触手机屏幕时, event2 文件中写入与手指操作相关的消息 手机发现 event2 文件不为空,对其中消息做出响应 event2 文件完成任务,把自己清空 也就是,event2 文件是模拟点击的最后一站,所有的点击操作最终都是在对这个文件写入内容。 如果我们能够得知手指点击时向 event2 写入了什么,然后用程序把这段内容反复地写入 event2,不就可以实现最快的模拟点击了吗? 这种方法正是试图在点击的时候把写入 event2 的内容实时读取出来,放到手机内的另一个文件里(在这里,姑且设这个新建文件为“/sdcard/recordtap”),然后再不断把存起来的内容往缓存中写,让手机以为接收到了点击的响应。 仍然是在ADB命令行下,输入 dd if=/dev/input/event2 of=/sdcard/recordtap即,监听 "/dev/input/event2" 文件,将写入其中的内容原样复制进空文件 “/sdcard/recordtap” 中。 在该模式下,试着点击一下屏幕,然后Ctrl+C结束监听,会看到确实是写入了什么。 这里插一句题外话,如果用 cat /dev/input/event2捕捉文件中的内容,并直接输出在命令行窗口内,会发现是一行完全看不懂的乱码。在这种方法里,将乱码复制出来存为 “/sdcard/recordtap” 也是可取的,即 cat /dev/input/event2 > /sdcard/recordtap最后,代替 “input tap 300 500” 的操作就变成了 dd if=/sdcard/recordtap of=/dev/input/event2即,将 “/sdcard/recordtap” 中存好的内容复制进 "/dev/input/event2" 缓存空间里。 据说用了这个方法,因为没有通信、翻译这些延时,两次点击之间的延时可以达到0.1秒以下。 可惜,该方法只对 Android 10 之前的系统(以及那个时候的老版本ADB)有效,对现在的手机进行该操作,会在最后一步写入 "/dev/input/event2" 时报错,卡住无法执行。(笑) 三、一个能用的折衷案但也不是说完全不行。回到上文讲监听事件的地方,在命令行输入 getevent -l点击屏幕,可以看到类似如下的输出: /dev/input/event2: EV_KEY BTN_TOUCH DOWN /dev/input/event2: EV_ABS ABS_MT_TOUCH_MAJOR 0000000d /dev/input/event2: EV_ABS ABS_MT_TRACKING_ID 00000000 /dev/input/event2: EV_ABS ABS_MT_POSITION_X 000000dc /dev/input/event2: EV_ABS ABS_MT_POSITION_Y 000004fc /dev/input/event2: EV_SYN SYN_MT_REPORT 00000000 /dev/input/event2: EV_SYN SYN_REPORT 00000000 (同样的一段多次重复) /dev/input/event2: EV_ABS ABS_MT_TOUCH_MAJOR 0000000d /dev/input/event2: EV_ABS ABS_MT_TRACKING_ID 00000000 /dev/input/event2: EV_ABS ABS_MT_POSITION_X 000000dc /dev/input/event2: EV_ABS ABS_MT_POSITION_Y 000004fc /dev/input/event2: EV_SYN SYN_MT_REPORT 00000000 /dev/input/event2: EV_SYN SYN_REPORT 00000000 /dev/input/event2: EV_KEY BTN_TOUCH UP /dev/input/event2: EV_SYN SYN_MT_REPORT 00000000 /dev/input/event2: EV_SYN SYN_REPORT 00000000分析输出信息,安卓接收 “屏幕上某点被点击”消息的逻辑可简单解读为: 在屏幕(event2)上, 某点被按下 (BTN_TOUCH DOWN) 追踪被按下的那点,告知它的坐标 (ABS_MT_POSITION_X/Y X/Y 的值) 该点被抬起 (BTN_TOUCH UP) 其中,手机在得知按下的点的坐标,以及“抬起”动作时,应当得到 EV_SYN 类消息,以便做出预设好的反应。 对位置的追踪,会每帧执行一次 接着,再来看看它的十六位操作码表达:重新输入 getevent这回点击一次后得到的消息是: /dev/input/event2: 0001 014a 00000001 /dev/input/event2: 0003 0030 00000015 /dev/input/event2: 0003 0039 00000000 /dev/input/event2: 0003 0035 000001fb /dev/input/event2: 0003 0036 000001dc /dev/input/event2: 0000 0002 00000000 /dev/input/event2: 0000 0000 00000000 (同样,这段重复多次) /dev/input/event2: 0003 0030 00000015 /dev/input/event2: 0003 0039 00000000 /dev/input/event2: 0003 0035 000001fb /dev/input/event2: 0003 0036 000001dc /dev/input/event2: 0000 0002 00000000 /dev/input/event2: 0000 0000 00000000 /dev/input/event2: 0001 014a 00000000 /dev/input/event2: 0000 0002 00000000 /dev/input/event2: 0000 0000 00000000与上面的消息对比,就能清楚地明白,前、后两部分表示的是 “按下/抬起” 的动作,中间形如 /dev/input/event2: 3 0x30 0x15 /dev/input/event2: 3 0x39 0 /dev/input/event2: 3 0x35 [X] /dev/input/event2: 3 0x36 [Y] /dev/input/event2: 0 2 0 /dev/input/event2: 0 0 0(0x30 表示十六进制下的30,即十进制下的48) 的段用来表示模拟按在的位置 (X, Y) ,它重复的次数表示模拟手指在屏幕上停留的帧数(用该形式也可以模拟划动、拖动)。 而 ADB 里正好也有将这样的操作码写入缓存内的方法。 与 getevent 相对,这类方法叫做 sendevent。改写时需要注意的是,getevent 得到的输出中," : "需要在 sendevent 中删除,而所得到的十六进制操作数也要换算成十进制数。 最后,我的连点指令整理如下,可以直接在cmd命令窗口中运行,实测两次点击之间延时约为0.28秒: adb shell # record to 'getevent', rewrite to 'sendevent' while true; do # point down sendevent /dev/input/event2 1 $((0x14a)) 1 # refresh position per frame sendevent /dev/input/event2 3 $((0x30)) $((0x15)) sendevent /dev/input/event2 3 $((0x39)) 0 sendevent /dev/input/event2 3 $((0x35)) $((0x1fb)) sendevent /dev/input/event2 3 $((0x36)) $((0x1dc)) sendevent /dev/input/event2 0 2 0 sendevent /dev/input/event2 0 0 0 # point up sendevent /dev/input/event2 1 $((0x14a)) 0 sendevent /dev/input/event2 0 2 0 sendevent /dev/input/event2 0 0 0 ; done # PS: X=0x1fb, Y=0x1dc可以以此为例,用编程语言对模拟鼠标点击的功能进行封装,实现更复杂的游戏脚本功能。 ……什么?现在都用模拟器了?(受到1000点打击) |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |