android测试之getevent/sendevent

2023-05-16

android测试之getevent/sendevent

https://blog.csdn.net/u013478557/article/details/26063409

Android系统getevent用法
https://www.cnblogs.com/liangliangge/p/12626248.html

关于在android平台上捕获事件的资料互联网上已经铺天盖地,但个人觉得可用性都不太大,大部仅 

针对特定设备,而对于其他设备引导性不强,故整理处本文,望对初学者有个有力的帮助: 

getevent 旨在获取android设备的事件信息,具体参考详细用法(本人亦初学者一枚,无法深入解释) 
sendevent 则可以向设备发送模拟事件,其中包括touch和keypress 

详细用法如下: 
Usage: getevent [-t] [-n] [-s switchmask] [-S] [-v [mask]] [-d] [-p] [-i] [-l] [-q] [-c count] [-r] [device]  
  1.     -t: show time stamps  
  2.     -n: don't print newlines  
  3.     -s: print switch states for given bits  
  4.     -S: print all switch states  
  5.     -v: verbosity mask (errs=1, dev=2, name=4, info=8, vers=16, pos. events=32, props=64)  
  6.     -d: show HID descriptor, if available  
  7.     -p: show possible events (errs, dev, name, pos. events)  
  8.     -i: show all device info and possible events  
  9.     -l: label event types and names in plain text  
  10.     -q: quiet (clear verbosity mask)  
  11.     -c: print given number of events then exit  
  12.     -r: print rate events are received  
  13.   
  14. Usage: sendevent <device> <type> <code> <value>  


首先,adb shell进入android设备,运行getevent命令得到如下信息,为各类事件的驱动设备,每部 

硬件可能都不一样,可以说无规律可循,个人觉得掠过吧 
add device  1 : /dev/input/event1  
  1.   name:     "pmic8xxx_pwrkey"  
  2. add device 2: /dev/input/event3  
  3.   name:     "apq8064-tabla-snd-card Headset Jack"  
  4. add device 3: /dev/input/event2  
  5.   name:     "apq8064-tabla-snd-card Button Jack"  
  6. add device 4: /dev/input/event5  
  7.   name:     "gpio-keys"  
  8. could not get driver version for /dev/input/mice, Not a typewriter  
  9. add device 5: /dev/input/event0  
  10.   name:     "atmel_mxt_ts"  
  11. add device 6: /dev/input/event4  
  12.   name:     "mhl_rcp"  


在点击设备屏幕之后得到: 
/dev/input/event0:  0003   0039  000002a5  
  1. /dev/input/event0: 0003 0030 00000004  
  2. /dev/input/event0: 0003 0035 0000017b  
  3. /dev/input/event0: 0003 0036 000001cf  
  4. /dev/input/event0: 0003 003a 0000001c  
  5. /dev/input/event0: 0000 0000 00000000  
  6. /dev/input/event0: 0003 0039 ffffffff  
  7. /dev/input/event0: 0000 0000 00000000  

很难辨认,加-l参数后得到 ( getevent -l ) 
/dev/input/event0: EV_ABS       ABS_MT_TRACKING_ID     000002a6  
  1. /dev/input/event0: EV_ABS       ABS_MT_TOUCH_MAJOR   00000004  
  2. /dev/input/event0: EV_ABS       ABS_MT_POSITION_X      0000017b  
  3. /dev/input/event0: EV_ABS       ABS_MT_POSITION_Y      000001cf  
  4. /dev/input/event0: EV_ABS       ABS_MT_PRESSURE         0000001c  
  5. /dev/input/event0: EV_SYN       SYN_REPORT                  00000000  
  6. /dev/input/event0: EV_ABS       ABS_MT_TRACKING_ID     ffffffff  
  7. /dev/input/event0: EV_SYN       SYN_REPORT                  00000000  

格式为 device: type code value,即 设备、输入设备类型、按键扫描码、附加码,具体定义可从kernel/include/linux/input.h中获得,至于这个头文件,途径之一是从google官网源码中获取: 

type: 输入设备类型,在手机系统中经常使用的键盘(keyboard)和小键盘(kaypad)属于按键设 
备EV_KEY,轨迹球属于相对设备EV_REL,触摸屏属于绝对设备EV_ABS 
code: 按键扫描码,区别于ASCII码和SDK中KeyEvent的键码 
value: 附加码,1/0 down/up 

第一行:可理解为一次touch的开始 
第2行:可理解为点击开始 
第3行:触摸点x坐标 
第4行:触摸点y坐标 
第5行:可理解为触摸点大小 
第6行:事件同步(点击结束) 
第7行:一次touch结束 
第8行:事件同步(事件结束) 

一次touch此8行是必须的,如果是longTouch呢,在touch的基础上,重复若干次第2~6行,即看起 
来可能是这样子: 
/dev/input/event0: EV_ABS       ABS_MT_TRACKING_ID     000002a6  
  1. /dev/input/event0: EV_ABS       ABS_MT_TOUCH_MAJOR   00000004  
  2. /dev/input/event0: EV_ABS       ABS_MT_POSITION_X      0000017b  
  3. /dev/input/event0: EV_ABS       ABS_MT_POSITION_Y      000001cf  
  4. /dev/input/event0: EV_ABS       ABS_MT_PRESSURE         0000001c  
  5. /dev/input/event0: EV_SYN       SYN_REPORT                  00000000  
  6.   
  7. /dev/input/event0: EV_ABS       ABS_MT_TOUCH_MAJOR   00000004  
  8. /dev/input/event0: EV_ABS       ABS_MT_POSITION_X      0000017b  
  9. /dev/input/event0: EV_ABS       ABS_MT_POSITION_Y      000001cf  
  10. /dev/input/event0: EV_ABS       ABS_MT_PRESSURE         0000001c  
  11. /dev/input/event0: EV_SYN       SYN_REPORT                  00000000  
  12.   
  13. /dev/input/event0: EV_ABS       ABS_MT_TOUCH_MAJOR   00000004  
  14. /dev/input/event0: EV_ABS       ABS_MT_POSITION_X      0000017b  
  15. /dev/input/event0: EV_ABS       ABS_MT_POSITION_Y      000001cf  
  16. /dev/input/event0: EV_ABS       ABS_MT_PRESSURE         0000001c  
  17. /dev/input/event0: EV_SYN       SYN_REPORT                  00000000  
  18.   
  19. ......  
  20.   
  21. /dev/input/event0: EV_ABS       ABS_MT_TRACKING_ID     ffffffff  
  22. /dev/input/event0: EV_SYN       SYN_REPORT                  00000000  


如果是drag呢,在longTouch的基础上,xy坐标从起点到终点是渐变的,其他可认为一样。 



对于按键,HOME为例,一目了然: 
/dev/input/event0:  0001   0066   00000001   
  1. /dev/input/event0: 0000 0000 00000000  
  2. /dev/input/event0: 0001 0066 00000000  
  3. /dev/input/event0: 0000 0000 00000000  
  4.   
  5. /dev/input/event0: EV_KEY       KEY_HOME             DOWN  
  6. /dev/input/event0: EV_SYN       SYN_REPORT          00000000  
  7. /dev/input/event0: EV_KEY       KEY_HOME             UP  
  8. /dev/input/event0: EV_SYN       SYN_REPORT          00000000  


所以清楚了之后,使用sendevent进行事件模拟就很轻松了,关键是从input.h中获取按键对应的扫 

描码,也许每个版本的系统中input.h的内容都稍有不同,这个很头疼。 

值得注意的是使用getevent获取的数值都是16进制的,而sendevent使用的是10进制的,需要进行 

转换。 

如点击坐标: 120,254 
sendevent /dev/input/event1  0003   0057   00000000       <---事件开始   
  1. sendevent /dev/input/event1 0003 0048 00000010      <---点击开始  
  2. sendevent /dev/input/event1 0003 0058 00000070      <---  触摸范围  
  3. sendevent /dev/input/event1 0003 0053 00000120      <---  x坐标  
  4. sendevent /dev/input/event1 0003 0054 00000254      <---  y坐标  
  5. sendevent /dev/input/event1 0000 0000 00000000      <---点击结束(同步)  
  6. sendevent /dev/input/event1 0003 0057 4294967295        <---事件结束  
  7. sendevent /dev/input/event1 0000 0000 00000000      <---事件同步  

翻译为: 
type code value 
EV_ABS ABS_MT_TRACKING_ID 00000000 <---事件开始 
EV_ABS ABS_MT_TOUCH_MAJOR 00000010 <---点击开始 
EV_ABS ABS_MT_PRESSURE 00000070 <--- 触摸范围 
EV_ABS ABS_MT_POSITION_X 00000120 <--- x坐标 
EV_ABS ABS_MT_POSITION_Y 00000254 <--- y坐标 
EV_SYN SYN_REPORT 00000000 <---点击结束(同步) 
EV_ABS ABS_MT_TRACKING_ID 4294967295 <---事件结束 
EV_SYN SYN_REPORT 00000000 <---事件同步 



对于longTouch,重复几次上面提到的步骤,而drag再弄个坐标渐变。 

按键方面(MENU) DOWN:1 UP:0 
sendevent /dev/input/event0  0001   0102   0000000001   
  1. sendevent /dev/input/event0 0000 0000 0000000000  
  2. sendevent /dev/input/event0 0001 0102 0000000000  
  3. sendevent /dev/input/event0 0000 0000 0000000000  
  4.   
  5. EV_KEY       KEY_MENU             DOWN  
  6. EV_SYN       SYN_REPORT         00000000  
  7. EV_KEY       KEY_MENU             UP  
  8. EV_SYN       SYN_REPORT         00000000  

此外还可以模拟可见字符按键。 




到这里是否觉得getevent好用好理解,但sendevent却超级麻烦。没关系,如果真不想用sendevent 

模拟事件的话,可以转向input命令。 

个人觉得这个input命令是个重量级的东东,调用时间非常长,貌似低系统版本和高系统版本的input提 

供的功能还不一样,但它毕竟好用啊,如下: 
usage: input ...  
  1.        input text <string>  
  2.        input keyevent <key code number or name>  
  3.        input tap <x> <y>  
  4.        input swipe <x1> <y1> <x2> <y2>  

可见除了longTouch无法模拟之外,其他的都很简便了 

输入文本: input text abcdefg 
按键 : input keyevent KEYCODE_MENU 
点击 : input tap 100 300 
拖拽 : input swipe 100 600 500 600 

①对于文本输入,以下字符需要加 \ 进行转义: 
` ' " ~ # & ( ) | \ ; < > 

②对于longTouch,使用input如何模拟? 

③最后,在android中不管使用sendevent或者input,如何能模拟输入非ASCII字符呢,比如中文? 
这是个难题
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android测试之getevent/sendevent 的相关文章

  • 已发布的 Flutter 应用程序在启动时崩溃

    编辑 此问题的解决方案是将您的 flutter 版本升级到较新的 dev 版本 then 1 7 0 您还可以上传单独的 APK 版本 但我个人不喜欢这个选项 请确保您没有从 flutter github 开发存储库下载 错误的构建 因为那
  • 关闭 Android 中的飞行模式

    如果 num gt 50 我想关闭飞行模式 我实现了这段代码 来自在 Android 中切换飞行模式 https stackoverflow com questions 5533881 toggle airplane mode in and
  • 是否可以使用最新的 APP_PLATFORM,同时仍保持向后兼容性?

    这是我的 Application mk APP ABI armeabi v7a APP PLATFORM android 16 APP OPTIM release APP STL gnustl static APP CPPFLAGS std
  • 如何检测和管理来电(Android)?

    我想创建一个应用程序 可以检测来电并在一定数量的蜂鸣声 响铃 后启动我的自定义活动 我的意思是在 2 或 3 或 5 声蜂鸣声 响铃 后我的activity被触发 我该怎么做 Thanks 我认为您无法计算自来电开始以来电话响了多少次 无法
  • Android中如何使用洪水填充算法?

    我是Android编程新手 最近尝试编写一个简单的应用程序 仅供练习 在这个中 我想在用户点击时为图像着色 但我不知道如何开始 我读过不同的主题 其中提到使用 洪水填充 算法 我在网上找到了它 但我不知道如何将它放入我的简单应用程序中 我找
  • 按回键隐藏软键盘

    我有一个EditText in an Activity我希望当我打开它时它处于活动状态并且软键盘处于打开状态Activity 这是我的xml for EditText
  • Android 上的 Firebase:如何检查 Firebase 身份验证失败原因?

    我在 Android 上使用 Firebase 和 Firebase Auth 功能 I try FirebaseAuth signInWithEmailAndPassword如果失败 我想知道为什么登录过程失败 The signInWit
  • 显示警报或收到通知时的视图

    我正在关注this http tokudu com 2010 how to implement push notifications for android 显示的教程通知 on an 安卓设备 当我在设备上运行该应用程序时 状态栏上会出现
  • 应用程序实例是否始终在任何活动之前创建?

    在 Android 中 您可以通过扩展 Application 类并在 Manifest 中声明名称来提供您自己的 Application 类实现 我的问题是 这个实现是否总是在初始活动之前创建 或者活动可以在应用程序实例有时间创建之前启动
  • 如何使用闹钟音量和 setAudioAttributes 来播放铃声?

    所以我正在尝试了解音频属性 这是我到目前为止所拥有的 alarm getSound will return a proper URI to pick a ringtone Ringtone tone RingtoneManager getR
  • 访问角落里的存储

    我能找到的与文件存储有关的最接近文档的是这个帖子 http nookdeveloper zendesk com entries 20257971 updated what are the size constraints on my app
  • Android - 当不在栏顶部时推送通知空白

    我在使用 Android 推送通知时遇到一个小问题 如果有 3 个通知 并且只有其中一个显示标题和消息 位于酒吧顶部的那个 如果有人知道可能是什么问题 请告诉我 请参阅此链接上的图像 这就是我接收通知的方式http postimg org
  • 监听什么来检测 Android 中的请勿打扰模式更改?

    我希望我的应用程序在手机设置为请勿打扰模式 仅限闹钟 仅限优先级或完全静音 时显示通知 通过聆听 这效果非常好android media RINGER MODE CHANGED在快速设置中检查此模式并在已选择的选项卡中选择模式时 但是 当选
  • Android ListView setSelection() 似乎不起作用

    我有一个ListActivity实现onListItemClick 并调用doSomething 类的功能 后者包含l setSelection position where l is the ListView object 现在有一个on
  • Android Web Intent 问题

    G day 免责声明 我不是 Android 开发人员 我正在对我所描述的问题进行质量检查 我用来描述这个问题的技术术语可能是错误的 我正在测试一个 Android 应用程序 该应用程序在其清单中描述它可以使用 type 的地址处理 Web
  • 如何在android中的操作栏中创建Edittext?

    我们可以在操作栏中使用编辑文本吗 在阅读了 Google 中的大量资源后 我找不到如何在操作栏中创建编辑文本 谁能告诉我该怎么做 您可以设置自定义View为了ActionBar像这样 getActionBar setCustomView R
  • 如何在Android Compose中使用otf类型字体文件?

    我正在学习使用 Android Jetpack Compose 现在我有一个正则 otf字体文件在资产 字体 我想在文本中使用它 java lang RuntimeException Font asset not found commonu
  • ACCESS_BACKGROUND_LOCATION 不适用于低于 Q (29) 的 Android 版本

    我的应用程序面向 Android API 28 根据文档 https developer android com preview privacy location target android 10 我应该要求ACCESS BACKGROU
  • Android:无法发送http post

    我一直在绞尽脑汁试图弄清楚如何在 Android 中发送 post 方法 这就是我的代码的样子 public class HomeActivity extends Activity implements OnClickListener pr
  • 具有矢量可绘制的 ImageView 的 Resources$NotFoundException

    我遇到了崩溃 Resources NotFoundException用于在活动创建时绘制的矢量 21 日前崩溃 安卓工作室2 1 支持库24 0 0 Gradle插件2 1 0 目标SDK 23 最小SDK 15 buildTools版本

随机推荐

  • 使用 Intel RealSense 采集图片并制作机器视觉数据集

    本文章主要涉及以下工作 xff1a xff08 1 xff09 讲述如何使用 Intel RealSense 相机采集RGB图像 深度图像 伪彩色化的深度图像以及 npy 格式保存的深度数据 xff08 2 xff09 采集到的图像可适用于
  • Postman 使用教程 - 手把手教你 API 接口测试

    Postman 教程目录 API 是什么 xff1f Postman 是什么 xff1f 一 如何安装 Postman二 API 模拟工具 GoRest三 用 Postman 发出第一个 GET 请求 1 GET 请求基本操作2 带参数的
  • Socket编程(C语言实现)——TCP协议(网络间通信AF_INET)的流式(SOCK_STREAM)+报式(SOCK_DGRAM)传输

    Socket编程 目前较为流行的网络编程模型是客户机 服务器通信模式 客户进程向服务器进程发出要求某种服务的请求 xff0c 服务器进程响应该请求 如图所示 xff0c 通常 xff0c 一个服务器进程会同时为多个客户端进程服务 xff0c
  • jQuery05插件

    一 自定义插件 1 extend 类方法 1 1对象继承 xff1a extend 对象1 xff0c 对象2 1 2 扩展jQuery类方法 extend 方法名 function xff08 xff09 方法体 getMax funct
  • JavaWeb01(web环境的搭建)

    一 JDK开发工具包 1 下载和安装jdk xff1a https www oracle com index html 2 配置环境变量 JAVA HOME JDK的安装目录 path JAVA HOME bin CLASSPATH xff
  • MySql安装与使用

    今天给大家分享的是关于mysql的安装以及使用 目录 一 mysql安装步骤 二 mysql使用 一 mysql安装步骤 1 首先我们需要下载一个mysql的压缩包 xff0c 进行解压 2 接下来改变my ini文件 修改mysql安装路
  • Shiro认证及加盐加密

    目录 今天的知识是与上次所分享的知识相关联的 xff0c 在Shiro入门的基础进行编写 xff0c 上次之前的数据是死数据 放在Shiro ini 而这次是活数据 xff0c 可以连接到数据库 xff0c 运用域Relam知识 同时出于维
  • 快速掌握Nginx部署前端项目(从Nginx安装配置及部署都非常详细哦!)

    前言 xff1a 之前在Linux系统中部署了后端项目 xff0c 今天继续来给大家分享如何部署前端项目 涉及到了Nginx的简单介绍以及Nginx如何安装及配置并且能够部署前端项目 Nginx是一个轻量级的反向代理web服务器 xff0c
  • I2C协议要点总结

    I2C协议要点总结 https baijiahao baidu com s id 61 1747946282739071669 amp wfr 61 spider amp for 61 pc 一文看懂I2C协议 https zhuanlan
  • Docker数据卷&&自定义Docker镜像

    目录 宿主机与容器之间的文件拷贝 引言 xff1a 利用MySQL镜像安装MySQL服务 从容器中拷贝文件到宿主机 从宿主机拷贝文件到容器 数据卷 数据卷容器 Dockerfile自定义镜像 自定义tomcat8 xff08 熟悉几乎所有的
  • Docker自定义jdk镜像与上传阿里云

    目录 自定义jdk镜像 制作jdk8 v1 0镜像 alpine制作jdk镜像 alpine简介 基于Alpine制作jdk镜像 Alpine制作jre镜像 Docker镜像上传至阿里云 由于官方没有提供jdk xff0c 所以需要自定义j
  • OAuth2(三)

    首先把项目在本地运行起来 注意redis的配置 在地址栏输入 自动跳断点 界面截图
  • 微服务项目框架及多模块开发

    目录 项目简介 项目模式 技术栈 项目架构图 模块 案例演示 主模块 zmall common子模块 zmall user子模块 项目简介 项目模式 电商模式 xff1a 市面上有5种常见的电商模式 xff0c B2B B2C C2B C2
  • Mybatis与微服务注册

    目录 一 SpringBoot整合MybatisPlus 创建自动生成代码子模块 创建商品服务子模块 二 SpringBoot整合Freeamarker 三 SpringBoot整合微服务 amp gateway amp nginx 整合微
  • 呜呼小习题集

    在C语言中exit函数和return有相同的执行效果 xff0c 都是退出当前的函数 xff08 错 xff09 解析 xff1a 1 xff09 return是语言级别的 xff0c 它表示了调用堆栈的返回 xff1b return 是当
  • Ubuntu系统d435i相机驱动与realsense-ros安装

    安装Realsense SDK xff08 如仅仅在ROS中使用相机 xff0c 该步骤可有可无 xff0c 直接进行第二步ROS包的安装即可 xff09 下载安装包 打开终端 xff0c 运行命令 xff1a git clone http
  • 485通讯接受多个传感器信号发生冲突

    一共12个传感器通过485直接接到威纶通屏幕上 xff0c 通讯时有一个温度传感器和两个压力传感器信号会发生冲突 xff0c 温度传感器接通后 xff0c 两个压力传感器在屏幕上数值就不显示 xff0c 不接通的话 xff0c 就会显示 x
  • 在 Kali Linux 中如何安装 Google Chrome

    目的 我们的目标是在 Kali Linux 上安装Google Chrome Web 浏览器 同时 xff0c 请参阅附录为可能出现的问题进行排查 要求 需要获得已安装 Kali Linux 或者 Live 系统的特权 惯例 给定命令需要以
  • c++中.和::的区别

    xff1a xff1a 为作用域运算符 xff0c A xff1a xff1a B表示作用域A中的名称B xff0c A可以是类 空间 结构 xff1b 主要用于在类外定义类内函数 xff0c 例如 xff1a void A xff1a x
  • android测试之getevent/sendevent

    android测试之getevent sendevent https blog csdn net u013478557 article details 26063409 Android系统getevent用法 https www cnblo