赞
踩
需要你: 有一台 windows 系统的电脑,通过 USB 连接安卓手机
用来实现: 安卓手机无需 root 的连点器
后续: 也可以把命令行操作嵌入其他代码(比如我们喜闻乐见的 python ),做个电脑操控手机用的脚本平台
注: 一如既往地,是给完全没有编程基础的人看的,所以会啰嗦很多奇怪的常识
下载一个叫 ADB 的东西( http://adbdownload.com/ ),
然后会解压出一个文件夹
把这个文件夹的路径添加到 PATH
这样就配置好 ADB 了。
然后按快捷键 win+r ,输入 cmd ,回车,进入 windows 电脑的命令行
输入
adb version
回车,
能看到具体的版本号,而不是“找不着”“无定义”之类的,就说明可以用了。
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
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
分析输出信息,安卓接收 “屏幕上某点被点击”消息的逻辑可简单解读为:
在屏幕(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
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
与上面的消息对比,就能清楚地明白,前、后两部分表示的是 “按下/抬起” 的动作,中间形如
- /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
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
可以以此为例,用编程语言对模拟鼠标点击的功能进行封装,实现更复杂的游戏脚本功能。
……什么?现在都用模拟器了?(受到1000点打击)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。