用ADB操纵手机实现连点器(折衷案)

您所在的位置:网站首页 手机屏幕自动连点器没反应 用ADB操纵手机实现连点器(折衷案)

用ADB操纵手机实现连点器(折衷案)

2024-06-04 01:02| 来源: 网络整理| 查看: 265

需要你:         有一台 windows 系统的电脑,通过 USB 连接安卓手机

用来实现:     安卓手机无需 root 的连点器

后续:            也可以把命令行操作嵌入其他代码(比如我们喜闻乐见的 python ),做个电脑操控手机用的脚本平台

注:                一如既往地,是给完全没有编程基础的人看的,所以会啰嗦很多奇怪的常识

序:下载与安装

  下载一个叫 ADB 的东西( http://adbdownload.com/ ),

 

 

然后会解压出一个文件夹

 

把这个文件夹的路径添加到 PATH

这段是在示意怎么添加PATH 这段是在示意怎么添加PATH

  

不知道添哪个是关键,总之都添了肯定没错  我这的 PATH 已经有了不少乱七八糟的内容 要添加的就是这个放着 adb.exe 的目录 

 这样就配置好 ADB 了。

  然后按快捷键 win+r ,输入 cmd ,回车,进入 windows 电脑的命令行

或者直接通过“开始”菜单内的快捷方式进入 cmd 也行

 输入

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