http://source.android.com/devices/tech/input/index.html

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

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

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

详细用法如下:

源码复制打印?
  1. Usage: getevent [-t] [-n] [-s switchmask] [-S] [-v [mask]] [-d] [-p] [-i] [-l] [-q] [-c count] [-r] [device]

  2. -t: show time stamps

  3. -n: don't print newlines

  4. -s: print switch states for given bits

  5. -S: print all switch states

  6. -v: verbosity mask (errs=1, dev=2, name=4, info=8, vers=16, pos. events=32, props=64)

  7. -d: show HID descriptor, if available

  8. -p: show possible events (errs, dev, name, pos. events)

  9. -i: show all device info and possible events

  10. -l: label event types and names in plain text

  11. -q: quiet (clear verbosity mask)

  12. -c: print given number of events then exit

  13. -r: print rate events are received

  14. Usage: sendevent <device> <type> <code> <value>

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

硬件可能都不一样,可以说无规律可循,个人觉得掠过吧

源码复制打印?
  1. add device 1: /dev/input/event1

  2. name:     "pmic8xxx_pwrkey"

  3. add device 2: /dev/input/event3

  4. name:     "apq8064-tabla-snd-card Headset Jack"

  5. add device 3: /dev/input/event2

  6. name:     "apq8064-tabla-snd-card Button Jack"

  7. add device 4: /dev/input/event5

  8. name:     "gpio-keys"

  9. could not get driver version for /dev/input/mice, Not a typewriter

  10. add device 5: /dev/input/event0

  11. name:     "atmel_mxt_ts"

  12. add device 6: /dev/input/event4

  13. name:     "mhl_rcp"

在点击设备屏幕之后得到:

源码复制打印?
  1. /dev/input/event0: 00030039 000002a5

  2. /dev/input/event0: 0003003000000004

  3. /dev/input/event0: 00030035 0000017b

  4. /dev/input/event0: 00030036 000001cf

  5. /dev/input/event0: 0003 003a 0000001c

  6. /dev/input/event0: 0000000000000000

  7. /dev/input/event0: 00030039 ffffffff

  8. /dev/input/event0: 0000000000000000

很难辨认,加-l参数后得到 ( getevent -l )

源码复制打印?
  1. /dev/input/event0: EV_ABS       ABS_MT_TRACKING_ID     000002a6

  2. /dev/input/event0: EV_ABS       ABS_MT_TOUCH_MAJOR   00000004

  3. /dev/input/event0: EV_ABS       ABS_MT_POSITION_X      0000017b

  4. /dev/input/event0: EV_ABS       ABS_MT_POSITION_Y      000001cf

  5. /dev/input/event0: EV_ABS       ABS_MT_PRESSURE         0000001c

  6. /dev/input/event0: EV_SYN       SYN_REPORT                  00000000

  7. /dev/input/event0: EV_ABS       ABS_MT_TRACKING_ID     ffffffff

  8. /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行,即看起
来可能是这样子:

源码复制打印?
  1. /dev/input/event0: EV_ABS       ABS_MT_TRACKING_ID     000002a6

  2. /dev/input/event0: EV_ABS       ABS_MT_TOUCH_MAJOR   00000004

  3. /dev/input/event0: EV_ABS       ABS_MT_POSITION_X      0000017b

  4. /dev/input/event0: EV_ABS       ABS_MT_POSITION_Y      000001cf

  5. /dev/input/event0: EV_ABS       ABS_MT_PRESSURE         0000001c

  6. /dev/input/event0: EV_SYN       SYN_REPORT                  00000000

  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. /dev/input/event0: EV_ABS       ABS_MT_TOUCH_MAJOR   00000004

  13. /dev/input/event0: EV_ABS       ABS_MT_POSITION_X      0000017b

  14. /dev/input/event0: EV_ABS       ABS_MT_POSITION_Y      000001cf

  15. /dev/input/event0: EV_ABS       ABS_MT_PRESSURE         0000001c

  16. /dev/input/event0: EV_SYN       SYN_REPORT                  00000000

  17. ......

  18. /dev/input/event0: EV_ABS       ABS_MT_TRACKING_ID     ffffffff

  19. /dev/input/event0: EV_SYN       SYN_REPORT                  00000000

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

对于按键,HOME为例,一目了然:

源码复制打印?
  1. /dev/input/event0: 0001006600000001

  2. /dev/input/event0: 0000000000000000

  3. /dev/input/event0: 0001006600000000

  4. /dev/input/event0: 0000000000000000

  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

源码复制打印?
  1. sendevent /dev/input/event1 0003005700000000      <---事件开始

  2. sendevent /dev/input/event1 0003004800000010      <---点击开始

  3. sendevent /dev/input/event1 0003005800000070      <---  触摸范围

  4. sendevent /dev/input/event1 0003005300000120      <---  x坐标

  5. sendevent /dev/input/event1 0003005400000254      <---  y坐标

  6. sendevent /dev/input/event1 0000000000000000      <---点击结束(同步)

  7. sendevent /dev/input/event1 000300574294967295        <---事件结束

  8. sendevent /dev/input/event1 0000000000000000      <---事件同步

翻译为:
type code value
EV_ABS ABS_MT_TRACKING_ID 00000000 <---事件开始
EV_ABS ABS_MT_TOUCH_MAJOR00000010 <---点击开始
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

源码复制打印?
  1. sendevent /dev/input/event0 000101020000000001

  2. sendevent /dev/input/event0 000000000000000000

  3. sendevent /dev/input/event0 000101020000000000

  4. sendevent /dev/input/event0 000000000000000000

  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提

供的功能还不一样,但它毕竟好用啊,如下:

源码复制打印?
  1. usage: input ...

  2. input text <string>

  3. input keyevent <key code number or name>

  4. input tap <x> <y>

  5. 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字符呢,比如中文?
这是个难题

转载于:https://blog.51cto.com/sunzeduo/1294839

android测试之getevent/sendevent相关推荐

  1. android 系统(108)---Android getevent sendevent用法

    Android getevent用法 getevent命令用法如下: Usage: getevent [-t] [-n] [-s switchmask] [-S] [-v [mask]] [-d] [ ...

  2. Android测试之Monkey初体验

    什么是Monkey? Monkey是Android中自带的用来进行压力测试的一个命令行工具. 用Monkey进行App压力测试的结果有三种 正常 Crash :程序崩溃 ANR:程序无响应 Monke ...

  3. Android测试之Monkey

    自己用的测试 C:\Users\Star>adb shell monkey -p com.cmstop.android --monitor-native-crashes -- pct-touch ...

  4. Android测试之logcat日志

    什么是日志文件 日志是从各个软件和系统的一些缓冲区中记录下来的,提供记录.查看系统调试信息的功能,可以通过logcat来查看. 缓冲区 缓冲区是环形的.首尾相连,用于缓存固定数据大小的日志信息,开发者 ...

  5. Android 测试之Monkey

    一.什么是Monkey Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中.它向系统发送伪随机的用户事件流(如按键输入.触摸屏输入.手势输入等),实现对正在开发的应用程序进 ...

  6. android测试命令大全,Android 测试之 adb 常用命令

    1.查看设备信息 连接手机,终端执行命令adb devices,确保手机能连上电脑. (1)方法一:通过adb devices -l查看设备信息: (2)方法二:(推荐)通过adb shell get ...

  7. android测试之adb key问题

    android系统有DS版本和RS版本,其中RS版本又称为user版本.一般没有root权限,当然也可以通过刷机获取. 其中DS版本是debug版本,一般有root权限,且不需要key,直接进入调试模 ...

  8. Android测试之设备化测试(Instrumented Tests)

    当我们需要使用到安卓框架的时候,也就是android.jar里面的api的时候,使用本地单元测试的方式就难以做到了.这时就要使用设备化的测试. 设备化测试分为 --设备化单元测试(Instrument ...

  9. android测试之monkey测试

    1.首先安装SDK包 2.配置环境变量 3.打开CMD命令窗口,查看是否安装成功 命令:adb version 4.要做monkey测试的安卓包名,获取方式如下(必须启动要获取报名的app) 1.ad ...

最新文章

  1. 2017年2月7日 今年第一天上班了
  2. 博弈知识汇总----Tanky Woo(转)
  3. 键盘的扫描码虚拟码概念 常见Windows键盘按键虚拟码
  4. bash命令怎么在linux系统中使用
  5. 034_ JDK的Enumeration接口
  6. ITK:从每个像素减去常数
  7. 深度学习框架Neon
  8. POJ 2955 区间DP必看的括号匹配问题,经典例题
  9. .NET Core 取消令牌:CancellationToken
  10. Java 堆内存是线程共享的!面试官:你确定吗?
  11. n个数中的最大值和最小值
  12. 好的串行代码与好的并行代码的区别(Zz)
  13. 微信公众号添加html,微信公众号如何在文章里添加超链接的方法教程
  14. 全球及中国石墨烯行业发展前景规模及需求容量预测报告2021年版
  15. python提取部分字符串_python如何提取字符串
  16. 背包问题leetcode
  17. 总结 | Prompt在NER场景的应用
  18. Font Awesome、ionic icon图标库的超详细使用方法
  19. Windows XP系统中实用的命令及操作技巧
  20. 2020 年 6 月程序员工资统计,平均 14XXX 元,网友:又跌了!

热门文章

  1. 【水】Dev-c++黑暗模式教程
  2. gmail邮箱中显示的名字如何修改?
  3. 操作系统——入门介绍
  4. 【信号处理】基于小波变换的语音增强matlab源码
  5. Python实现图片添加水印(支持中文、英文和图片)
  6. java 烟花_Java 美丽的烟花
  7. 比尔-盖茨2010年年信:世界首富的幸福观
  8. SQL学习-2.8 子查询和临时表格
  9. 最全的在线生成网址二维码的API接口(已更新12个接口)
  10. 使用Synergy控制实现一套键盘鼠标控制多台电脑(windows+linux)