Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 484|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-5-22 01:21:34 | 显示全部楼层 |阅读模式

    动机解释

    本来直接使用 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        //开始动作
    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-19 14:59 , Processed in 0.069055 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表