【按键精灵安卓版小精灵进程守护-崩溃自启中(原理篇·下)】安卓版按键小精灵崩溃自启插件兼容不同系统在游戏场景和非游戏场景下的自启,源码分享。

news2025/1/11 21:03:59

按键精灵安卓版小精灵进程守护-崩溃自启中(原理篇·下)

  • 前言
  • 一、了解几个重要的Android命令
    • 1.getevent——事件查看捕获
    • 2.sendevent——底层事件模拟
  • 二、逻辑解析
    • 1.获取设备名称
    • 2.获取tap事件序列
    • 3.获取映射关系
    • 4.自定义底层点击
  • 三、代码实现
    • 1.设备获取
    • 2.分辨率获取
    • 3.封装模拟点击函数
  • 源码+视频


前言

接着【按键精灵安卓版小精灵进程守护-崩溃自启中(原理篇·上)】博客的内容继续往下,要看懂本篇博客需要先阅读上篇内容。
在上篇内容中,通过使用shell脚本来创建后台进程。持续同按键小精灵进行通信,模拟服务器-客户端心跳验证。当验证失败时由shell脚本程序通过重启特定包名的按键小精灵程序,然后再通过shell命令input tap发送点击命令。
但是在上篇博客结尾抛出了一个问题,那就是shell命令input tap在游戏GUI界面时出现点击偏差的问题,导致在点击启动按钮时不受控制。为此需要增强按键小精灵守护插件,那么本篇博客便是解决方案!!!


一、了解几个重要的Android命令

下述解析由文心一言生成整理

1.getevent——事件查看捕获

  • 指令:getevent

  • 功能:getevent 是一个在Linux系统(尤其是Android设备的Linux内核)中用于接收和打印从输入设备(如触摸屏、键盘、鼠标等)发送的事件的工具。这对于开发者在调试输入设备时非常有用,因为它可以实时显示设备的输入事件。

  • 用法:getevent [选项] [设备文件]

  • 设备文件:这通常是输入设备在 /dev/input 目录下的设备文件,例如 /dev/input/eventX,其中 X 是一个数字,代表特定的输入设备。

  • 示例:
    getevent:不指定设备文件时,将不会显示任何事件,因为它不知道要监听哪个设备。
    getevent /dev/input/event0:实时显示/dev/input/event0设备上发生的所有输入事件。这将显示每个事件的详细信息,包括时间戳、事件类型、代码和值。
    getevent -l /dev/input/event0:除了显示事件的详细信息外,-l 选项还会列出与事件相关联的详细名称(如果可用),这有助于识别特定的事件。

  • 注意:
    你需要具有适当的权限(通常是root权限)来访问 /dev/input 目录下的设备文件。
    不是所有的设备都会产生易于理解的事件。某些设备的输出可能需要专门的知识来解读。
    对于Android设备,由于它们通常具有安全机制来限制对 /dev/input 目录的访问,因此可能需要通过root shell或使用具有相应权限的ADB shell来运行 getevent。

  • 选项:
    -l:显示长列表,包括事件的详细名称(如果可用)。
    -p:显示设备的信息,而不是实际的事件流。
    -s:打印同步事件。
    -n:在事件前面添加行号。
    -t:打印时间戳。
    -i:仅打印事件的类型代码和值。
    -r:读取文件描述符(而非标准输入)来捕获事件。
    -c:显示所有事件的详细信息,类似于 -l 但可能包含更多细节。

2.sendevent——底层事件模拟

  • 功能: sendevent 在 Android 系统中是一个用于向设备发送输入事件的工具,比如模拟按键按下、释放,或者模拟触摸屏上的触摸和移动等。

  • 用法(在 Android 设备上,通常需要 root 权限): sendevent [设备] [类型] [代码] [值]
    设备:通常是 /dev/input/eventX,其中 X 是一个数字,代表具体的输入设备。
    类型:事件的类型,如 EV_KEY(按键事件)、EV_ABS(绝对位置事件,如触摸屏)。
    代码:具体的事件代码,比如 KEY_POWER 表示电源键。
    :事件的值,对于按键事件,通常是 1(按下)和 0(释放)。

  • 示例(假设):
    模拟电源键按下和释放(注意:这只是一个示例,实际命令可能因设备和 Android 版本而异):

sendevent /dev/input/eventX 1 116 1
#这里,116 是 KEY_POWER 的代码,1 表示按键被按下。
sendevent /dev/input/eventX 1 116 0
#eventX 需要替换为实际负责该输入事件的设备
  • 注意:
    在 Android 设备上使用 sendevent 需要 root 权限。
    具体的设备文件(如 /dev/input/eventX)和事件代码(如 116)可能因设备和 Android 版本的不同而有所变化。
    由于 sendevent 不是 Linux 通用命令,因此它在标准的 Linux 发行版(如 Ubuntu、Fedora 等)中不可用。
    如果你是在询问 Linux 系统中与发送事件相关的其他命令或工具,请提供更具体的上下文或需求。例如,在 Linux 桌面环境中,可以使用 xdotool 或 xte 等工具来模拟键盘和鼠标操作。

二、逻辑解析

整体逻辑分为四步:
获取负责tap事件的输入设备 —— 获取点击事件的输入事件序列 —— 获取物理分辨率和设备输入分辨率的映射关系 —— 组合形成自定义底层点击函数

1.获取设备名称

第一步需要通过命令getevent查看具体是哪个输入设备负责tap事件的输入:

  1. 使用mt管理器打开**/dev/input**目录查看你的event设备的数目
    在这里插入图片描述
  2. 依次使用命令getevent -lp /dev/input/eventX | grep "ABS_MT_POSITION_X"来查看是否有输出,如果有输出则次eventX就是负责tap事件输入的设备。需要注意针对于上图X代表0-3。
    指令解析:这个命令组合用于从指定的输入设备(如触摸屏)中捕获事件,并通过管道(|)将这些事件传递给grep命令以过滤出与触摸屏上多点触控(Multi-Touch)中X轴位置(ABS_MT_POSITION_X)相关的事件。getevent是一个用于监视和打印从输入设备(如键盘、鼠标、触摸屏等)接收到的事件的工具,而grep则用于搜索包含指定模式的行。
  3. 依次监测event设备,出现下图说明找到。图中模拟器负责tap事件的设备为event2
    在这里插入图片描述

2.获取tap事件序列

指令:getevent -t -c 30 /dev/input/event2
指令解析:getevent命令在Linux系统中用于从指定的输入设备(如触摸屏、按键、鼠标等)捕获和打印事件。这对于调试和测试输入设备的行为非常有用。-t选项让getevent以时间戳形式显示事件,-c 30选项设置一次从设备读取的事件数量限制。/dev/input/event2指定了要读取事件的具体输入设备文件。

首先在命令输入getevent -t -c 30 /dev/input/event2后回车,随便点击屏幕某个地方便会有一系列的输入序列生成,我们需要提取到完整的一次点击的输入序列。
在这里插入图片描述
我这里仅仅展示了一次点击,多次点击可以更好判断一次完整的点击事件序列。

[    1285.819243] 0003 0039 00000016
[    1285.819243] 0001 014a 00000001
[    1285.819243] 0003 0035 000004f7
[    1285.819243] 0003 0036 000000e4
[    1285.819243] 0000 0000 00000000
[    1285.920969] 0003 0039 ffffffff
[    1285.920969] 0001 014a 00000000
[    1285.920969] 0000 0000 00000000

其中对我们有用的为0003 0035 000004f70003 0036 000000e4
其中0003表示触摸事件
0035H表示ABS_MT_POSITION_X
0036H表示ABS_MT_POSITION_Y
我们需要做的就是构建输入序列,修改x,y坐标的值即可完成。

3.获取映射关系

先明确两个概念:物理分辨率输入设备分辨率
这两个是我个人这样说的,对于专业的是否是这样说我不是很清楚。当然我们也不需要做到那么专业,只需要明确缘由用法即可。
物理分辨率:顾名思义,这是我们的手机设备固有的硬件分辨率。常说的手机分辨率便是指这个,坐标原点位于左上角(0,0)。
输入设备分辨率:这个是负责输入设备中的一个属性,可以通过命令查看。一般这个分辨率应该是和物理分辨率一致,但也有例外。同样的坐标原点位于左上角(0,0)。
如何获取这两个分辨率呢?
命令:wm size [获取设备物理分辨率]
命令:getevent -lp | awk -F 'max' '/ABS_MT_POSITION_X/{print $2} [获取ABS_MT_POSITION_X属性最大值]
命令:getevent -lp | awk -F 'max' '/ABS_MT_POSITION_Y/{print $2} [获取ABS_MT_POSITION_Y属性最大值]
在这里插入图片描述
从图中可以知道
物理分辨率:720X1280
输入设备分辨率:1279X719
需要注意,程序使用的统一是物理分辨率
因此我们要点击屏幕上(200,200)的坐标时,需要将它映射到输入设备的坐标轴上。这个坐标转换我这里就不说,如果这个搞不来就别编程了,趁早转行!

4.自定义底层点击

这一步主要是测试用的,通过序列形成点击函数
需要注意捕获的输入序列均是十六进制,而我们编写的时候用的是10进制

Function SendTap(deviceName, intx , inty)
	zm.Execute "sendevent " & deviceName & " 3 57 1"
	zm.Execute "sendevent " & deviceName & " 1 330 1"
	zm.Execute "sendevent " & deviceName & " 3 53 " & intx
	zm.Execute "sendevent " & deviceName & " 3 54 " & inty
	zm.Execute "sendevent " & deviceName & " 0 0 0"
	zm.Execute "sendevent " & deviceName & " 3 57 4294967295"
	zm.Execute "sendevent " & deviceName & " 1 330 0"
	zm.Execute "sendevent " & deviceName & " 0 0 0"
End Function

dim deviceName = "/dev/input/event2"
Dim intx = 890
Dim inty = 716
call SendTap(deviceName, intx , inty)

三、代码实现

1.设备获取

deviceName=
# 循环遍历 /dev/input/eventX 设备
for deviceName in /dev/input/event*; do
    # 使用 getevent -lp 命令获取设备信息,并筛选包含 ABS_MT_POSITION_X 的行
    info=$(getevent -lp "$deviceName" | grep "ABS_MT_POSITION_X")

    # 判断是否有输出,如果有则表示设备具有 ABS_MT_POSITION_X 输入属性
    if [ -n "$info" ]; then
        echo "设备 $deviceName 具有 ABS_MT_POSITION_X 输入属性"
        break  # 找到第一个设备后跳出循环
    fi
done

2.分辨率获取

# 定义全局变量
absWidth=$(getevent -lp | awk -F 'max' '/ABS_MT_POSITION_X/{print $2}' | awk '{print $1}' | sed 's/,//')
absHeight=$(getevent -lp | awk -F 'max' '/ABS_MT_POSITION_Y/{print $2}' | awk '{print $1}' | sed 's/,//')

size=$(wm size | awk '{print $3}')
width=$(echo $size | cut -d "x" -f1)
height=$(echo $size | cut -d "x" -f2)

3.封装模拟点击函数

send_tap() {
    # 检查参数是否提供
    if [ $# -lt 2 ]; then
        echo "Usage: send_tap <input_x> <input_y>"
        return 1
    fi
    input_x="$1"
    input_y="$2"

    # 计算点击位置
    x_value=$((input_x * absWidth / width))
    y_value=$((input_y * absHeight / height))

    # 调用第一层封装的函数 send_event
    sendevent "$deviceName" 3 57 1
    sendevent "$deviceName" 1 330 1 
    sendevent "$deviceName" 3 53 "$x_value"
    sendevent "$deviceName" 3 54 "$y_value"
    sendevent "$deviceName" 0 0 0
    sendevent "$deviceName" 3 57 4294967295
    sendevent "$deviceName" 1 330 0
    sendevent "$deviceName" 0 0 0
}

到这里整个增强版原理就讲解完成,主要就是处理底层模拟输入适配游戏GUI。究其原因是因为游戏层级GUI会重合,是分层的,而input tap只能输入当前层级。


源码+视频

非常感谢各位的阅读,如果对你有帮助还请给个赞吧!
源码+视频获取:戳我

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1994479.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

windows和office微软官方免费激活教程

微软提供了windows系统和office的官方免费激活&#xff0c;其实不用去买什么激活码&#xff0c;官方提供了激活方式&#xff0c;完全免费。目前测试没发现什么问题&#xff0c;windows还支持永久激活&#xff0c;比一些乱七八糟的kms激活工具还省心。 github地址&#xff1a;Gi…

《Ubuntu22.04环境下的ROS2学习笔记0》

一、下载并配置vscode 前面的安装过程就不再多赘述了&#xff0c;和ROS1中一样&#xff0c;参考链接在这里 《Ubuntu20.04环境下的ROS进阶学习1》_ubuntu20.04安装vscode及插件-CSDN博客 二、vscode扩展功能下载 a、简体中文语言包 中文语言包下载完后软件会提醒你restart软件…

博物馆藏品管理,从手动到智能:RFID手持扫描器的高效之旅

在博物馆藏品管理的漫长历史中&#xff0c;我们见证了从手工记录到数字化管理的巨大转变。今天&#xff0c;我们要讲述的&#xff0c;是这一转变中的一个重要里程碑——RFID手持扫描器的引入&#xff0c;它标志着博物馆藏品管理从手动走向智能的高效之旅。 首先&#xff0c;让我…

Java常见面试题-13-FastDFS

文章目录 FastDFS 是什么&#xff1f;FastDFS 组成FastDFS 的流程FastDFS 如何现在组内的多个 storage server 的数据同步&#xff1f; FastDFS 是什么&#xff1f; FastDFS 是一个开源的轻量级分布式文件系统&#xff0c;它可以对文件进行管理&#xff0c;功能包括&#xff1…

Linux驱动开发—中断,中断号,中断控制器GIC,中断子系统架构详解

文章目录 1.中断的基本概念2.中断上下文中断上下文的主要特点中断上下文的限制顶半部和底半部 3.中断子系统架构中断控制器GICGIC 的层级结构 中断控制器级联基本概念级联中断控制器的工作原理 中断号概念基本概念中断号的作用中断号的分配ARM 架构和 GIC 总体架构图 4.申请一个…

荒原之梦:考研期间可以玩游戏吗?

有不少同学&#xff0c;特别是男同学&#xff0c;在考研之前&#xff0c;会有玩游戏的习惯&#xff0c;那么&#xff0c;对于考研的同学来说&#xff0c;就会产生这样一个疑问。在考研备考期间&#xff0c;我还可以玩游戏吗&#xff1f; 其实关于这个问题的答案是因人而异的&am…

C语言—报数游戏

#include<stdio.h> #include<stdlib.h> #include<time.h> int main() {char op;int n 0, m, flag 0;srand(time(NULL));int x rand() % 2;if (x 0) printf("玩家先报&#xff01;\n");else printf("电脑先报&#xff01;\n");do{if …

【原创】java+swing+mysql学生管理系统设计与实现

个人主页&#xff1a;程序员杨工 个人简介&#xff1a;从事软件开发多年&#xff0c;前后端均有涉猎&#xff0c;具有丰富的开发经验 博客内容&#xff1a;全栈开发&#xff0c;分享Java、Python、Php、小程序、前后端、数据库经验和实战 开发背景&#xff1a; 这两天简单开发…

【数据结构】Map与Set

前言 前两篇文章我们研究了二叉搜索树与哈希表的结构与特点&#xff0c;他们二者是Map与Set这两个接口实现的底层结构&#xff0c;他们利用了搜索树与哈希表查找效率高这一特点&#xff0c;是一种专门用来进行搜索操作的容器或数据结构。本篇文章就让我们一起来梳理这两个接口的…

CTFHUB | web进阶 | PHP | Bypass disable_function | Backtrace UAF

开启题目 查看源码&#xff0c;发现可以蚁剑连接 进入之后无发现&#xff0c;使用插件 PHP7 Backtrace UAF 之后直接进入终端了 查看根目录之后发现了有两个 flag 文件&#xff0c;之后发现了本题的 flag

[SWPU2019]Web11

打开题目&#xff0c;看到登录口&#xff0c;注册账号看看 admin2&#xff0c;112 申请发布一下广告&#xff0c;sql注入试试 查看详情 看到sql&#xff0c;猜测sql注入&#xff0c;进行测试时发现空格、or、#、--、and等进行了过滤&#xff0c;目前基本可以确定注入点在这个地…

缺人!需求暴涨超300%!年薪超50万元!这一风口,带来大机遇

目前&#xff0c;秋季招聘快来了&#xff0c;随着人工智能应用的爆发&#xff0c;生成式人工智能的招聘市场也十分火爆。 在一家大型人工智能软件公司&#xff0c;团队负责人告诉记者&#xff0c;团队主要做基于大模型的办公协作类软件的开发&#xff0c;近期正在升级一款面向…

macOS Ventura 13.6.9 (22G830) Boot ISO 原版可引导镜像下载

macOS Ventura 13.6.9 (22G830) Boot ISO 原版可引导镜像下载 2024 年 8 月 8 日凌晨&#xff0c;macOS Sonoma 14.6.1 发布&#xff0c;本更新包含了重要的错误修复&#xff0c;并解决了导致高级数据保护无法启用或停用的问题。同时带来了 macOS Ventura 13.6.9 安全更新。 …

LVS(Linux virual server)详解

目录 一、LVS&#xff08;Linux virual server&#xff09;是什么&#xff1f; 二、集群和分布式简介 2.1、集群Cluster 2.2、分布式 2.3、集群和分布式 三、LVS运行原理 3.1、LVS基本概念 3.2、LVS集群的类型 3.2.1 nat模式 3.2.2 DR模式 3.2.3、LVS工作模式总结 …

IntelliJ IDEA 2024.2 发布:Spring Data JPA即时查询、自动补全cron表达式

今早看到&#xff0c;IntelliJ IDEA 2024.2 发布的邮件提示&#xff0c;看了一眼这个版本更新的新特性真的太适合我了&#xff01;也许这些能力对关注DD的小伙伴也有帮助&#xff0c;所以搞篇博客介绍和推荐一下。下面就来一起看看这个版本中推出的几个强大新特性。 Spring Da…

解密 Coretime:Polkadot 区块链资源分配的新革命

作者&#xff1a;PaperMoon Kaichao 高峰期打车&#xff0c;小编往往需要承受溢价车费&#xff0c;甚至还要不停加上小费&#xff0c;才可能在“前方排队 300人”的恐怖等待中获得优先打车的机会。但实际上&#xff0c;只要走出了拥挤路段&#xff0c;即使是高峰期&#xff0c…

Python装饰器之@property使用详解

概要 在Python中&#xff0c;property装饰器是一种强大且优雅的工具&#xff0c;用于定义属性方法&#xff0c;使得类的属性访问更加直观和安全。property装饰器可以让方法像属性一样被访问&#xff0c;从而在不改变接口的情况下对类的属性访问进行控制。本文将详细介绍proper…

VMware虚拟机和Docker的备份与恢复

目录 1. VMware虚拟机的快照备份 1.1 VMware本机的快照备份 1.2 VMware快照备份到另一电脑 2. Docker知识点 2.1 Docker镜像和容器的关系 2.2 Docker的存储卷 2.3 Docker命令简介 2.4 删除Anylink镜像 3. Docker备份和恢复 3.1 确定要回滚的容器和版本 3.2 备份当前…

UE开发中的设计模式(二) —— 中介者模式

上一篇文章介绍了观察者模式如何降低观察者和目标之间的耦合&#xff0c;并通过一个实例具体实现了观察者模式&#xff0c;本篇文章从上篇文章的实例继续&#xff0c;介绍中介者模式是如何带来对象间进一步的松耦合。 文章目录 问题提出概述问题解决总结优点缺点模式应用 参考资…