动机解释

本来直接使用 adb shell -> input 即可模拟 键盘事件,触屏事件keyevent ,text,tap 
但是手上的这台目标Android机4.0.3系统的input只支持text和keyevent,不支持tap,无法模拟触屏点击事件.

usage: input [text|keyevent]
input text <string>
input keyevent <event_code>

于是开始寻找模拟触屏的替代解决方案.

最新的Android API.24模拟器的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 (Default: trackball)

参考源码

参考资料

事件回放方式

  1. 新建一个.sh脚本(换行符必须为UNIX.LF)
  2. 将捕获到的指定操作的所有event放入脚本
  3. 将event里的数值全部转换为10进制
  4. 在全部event前都加上sendevent 命令

    sendevent /dev/input/event1 1 330 1

  5. 把脚本导入设备

    adb push x.sh /data/local/tmp/x.sh

  6. 执行脚本

    adb shell -> su -> sh /data/local/tmp/x.sh

  7. 观察操作是否正确回放.

系统键盘,触摸事件捕获方式

  1. Root后的设备
  2. adb shell -> su -> getevent
  3. 在手机屏幕点击某个指定的X,Y坐标位置
  4. 在命令行窗口可见监听到很多event,类似以下内容

    add device 1: /dev/input/event3 
    name: “bma222e” 
    add device 2: /dev/input/event2 
    name: “headset-keyboard” 
    add device 3: /dev/input/event1 
    name: “ft5x0x_ts” 
    add device 4: /dev/input/event0 
    name: “sprd-keypad” 
    /dev/input/event1: 0001 014a 00000001 
    /dev/input/event1: 0003 0030 000000c8 
    /dev/input/event1: 0003 0035 00000015 
    /dev/input/event1: 0003 0036 000002ff 
    /dev/input/event1: 0003 0032 00000001 
    /dev/input/event1: 0000 0002 00000000 
    /dev/input/event1: 0000 0000 00000000 
    /dev/input/event1: 0003 0030 000000c8 
    /dev/input/event1: 0003 0035 00000015 
    /dev/input/event1: 0003 0036 000002ff 
    /dev/input/event1: 0003 0032 00000001 
    /dev/input/event1: 0000 0002 00000000 
    /dev/input/event1: 0000 0000 00000000 
    /dev/input/event1: 0001 014a 00000000 
    /dev/input/event1: 0000 0000 00000000

    event [type] [code] [value] 
    (不同系统版本的手机监听到的内容可能不太一样.单点触控,和多点触控设备事件不一样.) 
    event0:name包含keypad字符串,键盘设备 
    event1:name包含ts字符串,触摸屏设备 
    event2:name包含headset,耳机相关控制设备(猜的)

  5. 通过单变量操作原则,多监听几个类似操作的event
  6. 通过多次回放捕获到的event然后凭经验剔除非关键event
  7. 提取”通用event”,”关键event“,类似以下内容

    /dev/input/event1: 0001 014a 00000001 
    /dev/input/event1: 0003 0030 000000c8 
    /dev/input/event1: 0003 0035 000000f0 
    /dev/input/event1: 0003 0036 00000384 
    /dev/input/event1: 0003 0032 00000001 
    /dev/input/event1: 0000 0002 00000000 
    /dev/input/event1: 0000 0000 00000000 
    /dev/input/event1: 0001 014a 00000000 
    /dev/input/event1: 0000 0000 00000000

    关键event红色部分,分别试验出来对应的是X,Y坐标地址.可把16进制换算成10进制,得到具体数值.

最小事件集序列尝试

经过实际真机测试,这个最小序列无法正确触发.看来还是没掌握底层原理.

下面是两点触摸支持的最小事件集序列:

ABS_MT_TOUCH_MAJOR 0x30
ABS_MT_POSITION_X 0x35
ABS_MT_POSITION_Y 0x36
SYN_MT_REPORT 0x02 //上报第一个点
ABS_MT_TOUCH_MAJOR
ABS_MT_POSITION_X
ABS_MT_POSITION_Y
SYN_MT_REPORT //上报第二个点
SYN_REPORT 0x00 //开始动作

Android模拟屏幕点击input tap替代解决方案的更多相关文章

  1. [Android]通过adb shell input上报命令模拟屏幕点击事件【转】

    本文转载自:http://blog.csdn.net/yuanzihui/article/details/52871652 常用的 input上报命令: input text 1234 实际向界面注入 ...

  2. Appium连接夜神模拟器,模拟手势点击(tap)

    # -*- coding:utf-8 -*- from appium import webdriver from time import sleep desired_caps ={ 'platform ...

  3. Android+appium +python 点击坐标tap方法的封装

    当常使用的查找点击元素的方法name.id.classname等无法使用时,我们将会采取坐标的点击来实现操作,同样存在一个问题,当手机的分辨率.屏幕大小不一致时,坐标的定位也会不同,因此将采用相对坐标 ...

  4. Android 中屏幕点击事件的实现

    在Android中如何用代码触发按钮点击事件?我想要触发代码执行按钮点击.实现对于单击按钮事件的模拟,触发单击按钮进入另一个界面. 就是声明一下什么moonlightcheese被声明了:在andro ...

  5. Android代码模拟物理、屏幕点击事件

    一.应用中模拟物理和屏幕点击事件 例如,模拟对某个view的点击事件 private void simulateClick(View view, float x, float y) { long do ...

  6. appium+python自动化37-adb shell模拟点击事件(input tap)

    前言 appium有时候定位一个元素很难定位到,或者说明明定位到这个元素了,却无法点击,这个时候该怎么办呢? 求助大神是没用的,点击不了就是点击不了,appium不是万能的,这个时候应该转换思路,换其 ...

  7. 我的Android进阶之旅------>Android中通过adb shell input来模拟滑动、按键、点击事件

    今天在维护公司的一个小项目的时候,发现按公司手机的某个物理按键,激活相应的Service后,会在屏幕上模拟的点击了屏幕的某个坐标点.好家伙,原来是之前该项目的版本是按这个物理按键后,会弹出一个对话框, ...

  8. appium+python自动化-adb shell模拟点击事件(input tap)

    前言 appium有时候定位一个元素很难定位到,或者说明明定位到这个元素了,却无法点击,这个时候该怎么办呢? 求助大神是没用的,点击不了就是点击不了,appium不是万能的,这个时候应该转换思路,换其 ...

  9. adb shell模拟点击事件(input tap)

    前言:appium定位也不是万能的,有些元素还是定位不到,这个时候只能换一个方式定位了,可以使用这个adb shell模拟点击. 1.input可以实现的功能 输入文本信息:input text gu ...

随机推荐

  1. 在windows 10 64bit系统上安装python 3.6 64bit的numpy模块

    1.查找自己的python版本对照的whl文件(cp36代表的是版本) 地址:https://pypi.python.org/pypi/numpy 2.下载完毕执行一下命令即可 pip install ...

  2. Python的网络编程[2] -> TFTP 协议[1] -> TFTP 的 Python 实现

    TFTP实现 / TFTP Implement 目录 TFTP 的服务器建立过程 TFTP 的客户端建立过程 1 TFTP 的服务器建立过程 服务器建立步骤主要有: (1)      设定服务器IP和 ...

  3. [JSOI2009] 有趣的游戏

    1444: [Jsoi2009]有趣的游戏 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1800  Solved: 645[Submit][Statu ...

  4. [COCI2015]ZGODAN

    题目大意: 给你一个数$n(n\leq10^1000)$,定义一个数是“美丽数”当且仅当这个数各个数位上的数奇偶性不同. 求最接近$n$的“美丽数”,若有多个,则依次输出. 思路: 贪心+高精度. 首 ...

  5. SQL语句原理与高效SQL语句(转)

    做软件开发的programers,大部分都离不开跟数据库打交道,特别是erp开发的,跟数据库打交道更是频繁,存储过程动不动就是上千行,如果数据量大,人员流动大,那么还能保证下一段时间系统还能流畅的运行 ...

  6. MessageFormat.format 字符串的模板替换

    项目目前在消息的模版,模版中需要替换很多参数,比方说“用户名”,“日期”等等.不过目前没有想到更好的替换参数的方法,所以目前只能使用一个比较简单的方式来实现.这个方式太死板,参数对应必须要在代码中写死 ...

  7. 安装Webmin1.860(RPM方式)

    Webmin是基于web的功能强大的管理工具,管理员可以通过Webmin以图文方式方便的管理CentOS 7系统.本文介绍如何在CentOS 7中安装Webmin. 1.去官网获取最新的RPM链接 2 ...

  8. appium 几点总结(转)

    1. 建立session时常用命令: DesiredCapabilities cap = new DesiredCapabilities(); cap.SetCapability("brow ...

  9. Shell--变量内容的删除、替代与替换

    1. 变量内容的删除与替换 #代表由前面开始删除,所以这里便由开始的/删起,*来代替0到无穷多个任意字符 %由后面向前删除变量内容 例如:echo ${path%:*bin}删除最有一个目录,即从:到 ...

  10. leetcode题解:Valid Parentheses(栈的应用-括号匹配)

    题目: Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the ...