Android Input 介绍及使用

本文介绍如何使用Android平台的Input命令模拟按键输入,通过编写Shell脚本来实现游戏自动化操作,如在恶魔城月轮中自动刷怪升级。文章详细解释了Input命令的使用方法,包括模拟键盘、鼠标、触摸屏等输入设备的指令,以及如何实现长按、循环操作等高级功能。

前言

简单介绍了 Android 平台 Input 命令模拟按键,并写了个脚本应用在手机上,在模拟器上玩恶魔城月轮用大骨头自动刷怪升级。。。

介绍

Usage: input [<source>] <command> [<arg>...]

The sources are:
      keyboard
      mouse
      joystick
      touchnavigation
      touchpad
      trackball
      dpad
      stylus
      gamepad
      touchscreen

The commands and default sources are:
      text <string> (Default: touchscreen)
      keyevent [--longpress] <key code number or name> ... (Default: keyboard)
      tap <x> <y> (Default: touchscreen)
      swipe <x1> <y1> <x2> <y2> [duration(ms)] (Default: touchscreen)
      press (Default: trackball)
      roll <dx> <dy> (Default: trackball)

注:可以用来模拟长按,在 input swipe 未完成前退出,这样就只有按下事件,没有松开事件,就一直长按?

#adb shell "input swipe 110 520 110 520 1000"   # 滑动操作,未结束前退出,就是长按

adb shell input tap 100 100                     # 点击操作  

adb shell input keyevent 4                      # 按键操作

模拟长按:

#!/bin/sh  
while true
do
# 注,实现功能后就退出,这样就能实现长按了
adb shell "input swipe 1200 520 1200 520 10000"
sleep 1
done

使用

就是先通过开发者选项知道模拟键位置,然后通过 input 模拟, 左–>发招 --> 右 —> 左 的循环操作。。。

#!/bin/sh 

#################################################
#      x     y 
# 左: 121   539
# 右: 295   534 
#  B:  1166  559 
#adb shell "input swipe 110 520 110 520 10"
#                       点1       点2     时长 
#################################################
 
while true
do
# 注,实现功能后就退出,这样能实现长按

# 左 
#adb shell "input swipe 121 539 121 539 10"
adb shell input tap 121 539


# B
adb shell input tap 1166 559
adb shell input tap 1166 559
adb shell input tap 1166 559

# 睡眠以防止升级未完成转身
sleep 1


#adb shell "input swipe 1166 559 1166 559 1"
#adb shell "input swipe 1166 559 1166 559 1"
#adb shell "input swipe 1166 559 1166 559 1"
#adb shell "input swipe 1166 559 1166 559 1"
#adb shell "input swipe 1166 559 1166 559 1"
#adb shell "input swipe 1166 559 1166 559 1"
#adb shell "input swipe 1166 559 1166 559 1"
#adb shell "input swipe 1166 559 1166 559 1"

# 右 
#adb shell "input swipe 295 534 295 534 10"
adb shell input tap 295 534

#sleep 0.1
done
### Android Input 子系统的架构 Android 的输入子系统是一个复杂的模块化设计,负责处理来自硬件设备的各种输入事件并将其传递给应用程序。该子系统的核心目标是抽象底层硬件细节,并提供统一的接口供应用层调用。 #### 架构概述 Input 子系统主要由以下几个部分组成: 1. **Kernel Driver Layer**: 这一层位于操作系统内核中,通过字符设备文件 `/dev/input/eventX` 提供给用户空间访问。它捕获原始硬件事件并将这些数据流式传输到用户空间[^4]。 2. **Event Hub**: Event Hub 是一个运行在 `SurfaceFlinger` 或者 `InputReaderThread` 中的服务组件,用于监控和管理所有的输入设备节点 (`/dev/input/eventX`) 并读取它们的状态变化。当检测到新设备连接或者断开时,会通知更高层次的逻辑进行更新[^5]。 3. **Input Reader**: 输入阅读器从 Event Hub 获取原始事件数据包,并解析成标准化的形式以便进一步处理。此阶段还包括一些预处理操作比如去抖动、坐标转换等[^6]。 4. **Input Dispatcher**: 负责分发已经过初步处理后的输入消息至相应的窗口或视图对象上。这一步骤涉及到查找当前焦点所在位置以及判断哪个 app 应接收特定类型的触摸屏点击或其他交互动作[^7]。 5. **Policy Manager & Listener Interface**: 定义了一组策略规则来决定如何响应某些特殊情况下发生的事件;同时还提供了回调机制让其他服务可以监听感兴趣的变化情况[^8]。 6. **Application Frameworks/API Layers**: 最终到达这一层面之后,则完全交给了各个独立的应用程序自行定义其行为模式——即开发者能够利用公开暴露出来的方法实现自定义功能扩展[^9]。 ```java // Example of handling touch events within an Activity. @Override public boolean onTouchEvent(MotionEvent event) { int action = MotionEventCompat.getActionMasked(event); switch(action){ case MotionEvent.ACTION_DOWN: Log.d(TAG,"Touch started..."); break; case MotionEvent.ACTION_MOVE: // Handle movement here... break; case MotionEvent.ACTION_UP: Log.d(TAG,"Touch ended."); break; } return true;// Indicate we've consumed this event. } ``` ### 工作流程分析 整个过程大致如下所示: - 当物理按键被按下或是屏幕触碰发生时,驱动程序会产生对应的中断信号唤醒 CPU 执行后续任务; - 驱动将采集的数据写入指定缓冲区等待查询; - 用户态下的 EventHub 不停轮询检查是否有新的可用数据到来; 一旦发现则立即提取出来交给 InputReader 做下一步解释加工; 经过一系列过滤筛选后形成标准格式化的 Message 对象再提交给 Dispather 组件安排投递给目的端口; 最后由 PolicyManager 结合上下文环境做出具体决策从而完成整个闭环控制链路运作。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值