Android模拟屏幕点击input tap替代解决方案

知识为进步之母,而进步又为富强之源泉。这篇文章主要讲述Android模拟屏幕点击input tap替代解决方案相关的知识,希望能为你提供帮助。
动机解释本来直接使用 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 touchscreenThe 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)
参考源码
  • radhoo/android-event-injector: A JNI approach to injecting events (keys and touch) on rooted Android
参考资料
  • Event 原语 Android 多点触摸接口详解 - arm-linux - 博客园
  • Programmatically Injecting Events on Android - Part 1 - PocketMagic
  • Programmatically Injecting Events on Android - Part 2 - PocketMagic
  • Android 模拟系统事件(三) - banketree - 博客频道 - CSDN.NET
  • Android 模拟系统事件(二) - banketree - 博客频道 - CSDN.NET
  • Android 模拟系统事件(一) - banketree - 博客频道 - CSDN.NET
  • Android sendevent/getevent 用法 - kickxxx的专栏 - 博客频道 - CSDN.NET
  • android高分段进阶攻略(4)android模拟点击 - aimn的开源库 - 博客频道 - CSDN.NET
  • 记录小米设备事件获取 - banketree - 博客频道 - CSDN.NET
事件回放方式
  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进制,得到具体数值.
最小事件集序列尝试【Android模拟屏幕点击input tap替代解决方案】经过实际真机测试,这个最小序列无法正确触发.看来还是没掌握底层原理.
下面是两点触摸支持的最小事件集序列: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//开始动作


    推荐阅读