首页 > 代码库 > 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进制,得到具体数值.

最小事件集序列尝试

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

下面是两点触摸支持的最小事件集序列:ABS_MT_TOUCH_MAJOR 0x30ABS_MT_POSITION_X 0x35ABS_MT_POSITION_Y 0x36SYN_MT_REPORT 0x02     //上报第一个点ABS_MT_TOUCH_MAJORABS_MT_POSITION_XABS_MT_POSITION_YSYN_MT_REPORT      //上报第二个点SYN_REPORT 0x00        //开始动作

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