android之getevent/sendevent/input

adb-getevent使用 getevent使用 阅读详情

关于在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.   
  15. 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: 0003 0039 000002a5  
  2. /dev/input/event0: 0003 0030 00000004  
  3. /dev/input/event0: 0003 0035 0000017b  
  4. /dev/input/event0: 0003 0036 000001cf  
  5. /dev/input/event0: 0003 003a 0000001c  
  6. /dev/input/event0: 0000 0000 00000000  
  7. /dev/input/event0: 0003 0039 ffffffff  
  8. /dev/input/event0: 0000 0000 00000000  

很难辨认,加-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.   
  8. /dev/input/event0: EV_ABS       ABS_MT_TOUCH_MAJOR   00000004  
  9. /dev/input/event0: EV_ABS       ABS_MT_POSITION_X      0000017b  
  10. /dev/input/event0: EV_ABS       ABS_MT_POSITION_Y      000001cf  
  11. /dev/input/event0: EV_ABS       ABS_MT_PRESSURE         0000001c  
  12. /dev/input/event0: EV_SYN       SYN_REPORT                  00000000  
  13.   
  14. /dev/input/event0: EV_ABS       ABS_MT_TOUCH_MAJOR   00000004  
  15. /dev/input/event0: EV_ABS       ABS_MT_POSITION_X      0000017b  
  16. /dev/input/event0: EV_ABS       ABS_MT_POSITION_Y      000001cf  
  17. /dev/input/event0: EV_ABS       ABS_MT_PRESSURE         0000001c  
  18. /dev/input/event0: EV_SYN       SYN_REPORT                  00000000  
  19.   
  20. ......  
  21.   
  22. /dev/input/event0: EV_ABS       ABS_MT_TRACKING_ID     ffffffff  
  23. /dev/input/event0: EV_SYN       SYN_REPORT                  00000000  


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



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


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

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

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

转换。 

如点击坐标: 120,254 
  1. sendevent /dev/input/event1 0003 0057 00000000      <---事件开始   
  2. sendevent /dev/input/event1 0003 0048 00000010      <---点击开始  
  3. sendevent /dev/input/event1 0003 0058 00000070      <---  触摸范围  
  4. sendevent /dev/input/event1 0003 0053 00000120      <---  x坐标  
  5. sendevent /dev/input/event1 0003 0054 00000254      <---  y坐标  
  6. sendevent /dev/input/event1 0000 0000 00000000      <---点击结束(同步)  
  7. sendevent /dev/input/event1 0003 0057 4294967295        <---事件结束  
  8. 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 
  1. sendevent /dev/input/event0 0001 0102 0000000001  
  2. sendevent /dev/input/event0 0000 0000 0000000000  
  3. sendevent /dev/input/event0 0001 0102 0000000000  
  4. sendevent /dev/input/event0 0000 0000 0000000000  
  5.   
  6. EV_KEY       KEY_MENU             DOWN  
  7. EV_SYN       SYN_REPORT         00000000  
  8. EV_KEY       KEY_MENU             UP  
  9. 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字符呢,比如中文? 
这是个难题


【Android】sendevent和getevent 在之前我们讨论了通过input命令,外接输入设备(鼠标)等方式来实现对屏幕的事件注入,达到实现一些自动化的操作,相对于input命令需要获取inputManager来进行操作,sendevent的方式直接写文件来注入粗糙的事件,调用起来清楚一些,就是指令复杂一些,sendevent的代码就是写数据到输入设备。复杂的就在于写入的数据,我们可以通过getevent -l的显示来观察一个点击手指再滑动一下,看看打印什么, 阅读详情

相关推荐

易语言 adb shell getevent 和 sendevent 详细讲解使用实现点击效果

简介: 1、这里是通过雷电模拟器获得点击动作。 2、如果是真机获取点击 获多一些参数比如说触屏力度 按下和弹起也会多一些参数 3、/dev/input/event3 这个是事件路径。调试发现真机和模拟器事件路径不一样。所以你们在调试看看自己电脑是什么路径 4、通过getEvent()事件 点击雷电模拟器后输出查看 5、这个sendevent 事件还可以实现滑动、和多指触屏如果有这样需求在研究。 6、sendevent 相对 input tap 响应的速度要快一些。

getevent/sendevent 使用说明

这两天准备写一下input子系统的分析,过程中发现了两个好工具,呵呵,就是本文介绍的主角:getevent用于获取当前系统input设备的一些参数和实时事件的数据;sendevent用于发送input事件,这样在调试的时候遇到有的样机按键坏了或者触摸屏坏了就方便了,工具的源码位于Android SDK的system/core/toolbox下面。 一、getevent 首先看一下命令的

AHC的专栏 1743

告别Keil!用VSCode+PlatformIO玩转STC单片机(附自动下载配置)

本文详细介绍了如何从Keil迁移到VSCode+PlatformIO进行STC单片机开发,包括环境搭建、自动下载配置等实用技巧。通过对比传统IDE与现代工具链的差异,展示了VSCode+PlatformIO在代码编辑体验、跨平台支持和开发效率上的优势,帮助开发者实现更流畅的STC单片机开发流程。

weixin_27252001的博客 458

使用adb shell sendevent模拟发送事件方法和注意事项

使用adb shell sendevent模拟发送事件时,需要注意发送后还需发送同步事件才能生效,具体如下: kernel中事件的type、code定义和一些附件信息按照格式定义在所加载的*.dtsi文件,其中compatible的值对应adb shell getevent打印出来的设备名称,即 event0~event9 节点对应的设备名称 以“音量减” 事件为例,在dtsi文件中查询到该事...

a462533587的博客 6642

B-Tree数据存储

SQLITE数据存储1. B-Tree的优势  在SQLite中数据库、表、索引都是通过B-Tree和B+Tree的形式进行存储的。如果采用传统的二叉树查找树、红黑树的查找深度一般为log2(N) \log{_2}(N)(其中N表示的是整个树的关键字的数目),在数据库中如果存储的资源过多,就会导致查找一个数据过程中出现较多的磁盘I/O操作,而过多的磁盘操作就会导致整个查找的效率较低,而基于二叉树的一

Promiscuous_youth的博客 1141

RK3588S开发板实战:手把手教你搞定IMX415摄像头驱动配置(附调试日志分析)

本文提供了一份详细的RK3588S开发板配置IMX415摄像头驱动的实战指南。内容涵盖从环境准备、内核驱动编译、设备树节点编写到调试日志分析的完整流程,并重点解析了摄像头调试过程中的常见问题与解决方案,帮助开发者快速完成驱动配置与功能验证。

weixin_28285943的博客 205

常用adb shell命令:getevent和sendevent

1.getevent 输出所有event设备的基本信息 输出格式: 设备名: 事件type 事件code 事件value 注意:这里的数字都是16进制。getevent -c 10 //输出10条信息后退出 getevent -l //将type、code、value以对应的常量名称显示使用 getevent -l 命令后输出结果格式为: 对应的数字代码转换为容易理解的字符串了,

小虾米的专栏 4万+

Git Worktree + Claude Code:多终端并发开发完全实战

深入讲解如何使用 Git Worktree 配合多终端 Claude Code 实现并发开发,通过实战案例展示如何在 Android 开发中提升 2-3 倍效率,彻底告别等待 AI 的问题。

Cheson的专栏 1205

Android getevent/sendevent/input 详解

简介 Android系统提供了getevent与sendevent两个工具供开发者从设备节点中直接读取输入事件或写入输入事件. getevent:监听输入设备节点的内容,当输入事件被写入到节点中时,getevent会将其读出并打印在屏幕上.由于getevent不会对事件数据做任何加工,因此其输出的内容是由内核提供的最原始的事件. sendevent:输入设备的节点不仅在用户空间可读,而且是可写的,因此可以将将原始事件写入到节点中,从而实现模拟用户输入的功能.sendevent的作用即为发送input事件模

weixin_39966398的博客 3762

深入解析 OpenClaw(小龙虾)源码:架构设计与核心实现

OpenClaw用清晰、工程化的代码结构,将复杂的Agent交互流程变成了可管理、可扩展的流水线。无论是想深入了解Agent系统设计,还是希望二次开发定制自己的AI助理,阅读OpenClaw源码都是一次绝佳的学习旅程。希望本文能帮助你快速掌握OpenClaw的核心脉络。如果你对某个模块(如技能开发、安全机制)感兴趣,欢迎继续探讨。本文基于OpenClaw社区版本源码分析,具体实现可能随版本迭代有所调整,请以最新源码为准。

Ven%的博客 449

基于嵌入式Linux设计的智能车库(GEC6818)

随着城市化进程的加快,传统停车管理方式存在效率低下、人工成本高、车主体验差等问题。为解决这些问题,本项目基于嵌入式Linux技术,设计并实现了一套智能车库管理系统。该系统采用GEC6818开发板作为核心控制器,运行Qt应用程序,并结合USB免驱摄像头进行车牌识别,RFID模块完成刷卡支付,SQLite数据库存储车主信息和停车记录。系统提供车主注册、用户管理、出入库管理、停车费结算、车辆查询等功能,并具备语音播报提示,提高用户体验。通过本系统,停车场管理更加高效、智能,有助于提升停车服务质量,减少人工干预,适

445

linux getevent命令,[android] 调试linux input子系统驱动的用户空间命令 getevent/sendevent...

在android中getevent/sendevent源码 位置这两个命令的源码在 system/core/toolbox/下,sendevent.c getevent.c 两个文件。getevent使用getevent获得/dev/input/eventX设备汇报的事件,这个命令还会输出所有event设备的基本信息,如下:# geteventadd device 1: /dev/input/ev...

weixin_34603379的博客 431

GEE:本地影像上传到GEE的Assets中,并输入机器学习算法中作为特征变量

当我们在 Google Earth Engine(GEE)中应用机器学习算法时,会输入一些影像作为特征变量数据,进一步根据这些特征影像去推理未知区域的数据。但是 GEE 平台上计算特征变量的 API 函数并不是非常全面,我们希望获得更多的特征用于分类。这个时候,我们可以将本地计算的特征影像上传到 GEE 中进行后续处理。本文记录了从本地上传特征数据到 GEE 的 Assets 中的教程,用于后续在 GEE 中分类或者回归使用。本文也可作为《》一文的补充。

养乐多的博客 1730

[android] 调试linux input子系统驱动的用户空间命令 getevent/sendevent

在android中getevent/sendevent源码 位置 这两个命令的源码在 system/core/toolbox/下,sendevent.c getevent.c 两个文件。 getevent 使用getevent获得/dev/input/eventX设备汇报的事件,这个命令还会输出所有event设备的基本信息,如下:    # getevent add device

duanlove(技术路途)专栏 2565

知道LPDDR和DDR什么关系吗?

话不多说,先上大白话,一个网友总结的很好:简单地说DRR4是标准电压版的PC和服务器内存,LPDDR4属于手机等嵌入式移动设备使用的低电压低功耗内存,LPDDR4X则是LPDDR4的升级版,下面详细看看老哥的博客。LPDDR4是与DDR4内存等效的移动设备。。LPDDR4具有两个16位通道,从而使每个DIMM的总线总长度为32位。相比之下,DDR4每个DIMM具有64位通道。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 2806

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Android 10.0 Input System 源码分析

##前言 这篇文章主要解决以下问题: 什么是Linux标准输入协议? Android Input System架构是怎样的? Android ANR产生的原理是什么?如何避免ANR? 如何调试Android Input System? 本文结构 1、功能介绍 2、总体设计 3、详细设计 4、开发调试 5、总结 6、资料 一、功能介绍 Linux 输入协议在 linux/input.h 内核头文...

jackingzheng的专栏 1549

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Input模块流程(基于AndroidT)

一旦对应的设备上有可读的input事件,epoll_wait就会返回并待会deviceid,找到具体的device。InputManager 的构造函数中创建了InputDispatcher 和InputReader对象,并把InputDispatcher作为参数传递给InputReader对象。InputManagerService:负责InputReader 和InputDispatcher的创建,并提供policy用于events的预处理。

weixin_43761183的博客 1653

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Android下event事件深度解析

Android手机下getevent/sendevent,源代码路径system/core/toolbox/下,sendevent.c getevent.c getevent.h getevent 使用getevent获得/dev/input/eventX设备汇报的事件,这个命令还会输出所有event设备的基本信息, add device 1: /dev/input/even

杨小扬的专栏 5972

Android输入事件EventHup总结

getEvent 与 sendevent adb shell getevent -t [1262.557130] /dev/input/event0: 0001 0074 00000000 1262.557130 /dev/input/event0: 0001 0074 00000000 时间戳 设备节点 事件类型 事件代码 事件值 输入系统整体流程 IMS的构成 在SystemServer中的ServerThread线程中被创建和启动。 创建 在InputManagerService

qq_33582129的博客 316

android跨程序截屏,Android 跨进程事件处理(一)——模拟点击、全局截屏

直都是在这上面找资料,无耻的我真的不好意思不再分享了。之前分配到的任务找资料一直也是找不到,运气好的遇到个提边角料的。但是都没有实质可以用的。发文档的也都是东贴贴别人的,西找找别人的。基本都是漫天胡扯。好了,废话不多说。直接进入今天的主题吧。模拟点击模拟点击和截屏其实在应用本身中实现其实很简单。但是跨进程就相对比较麻烦了。比如,你写一个程序,自动启动微信,点微信界面里的某几个按钮。如果你也是在找技...

weixin_35682426的博客 705

Android 跨进程模拟点击,Android 跨进程事件处理(一)——模拟点击、全局截屏...

一直都是在这上面找资料,无耻的我真的不好意思不再分享了。之前分配到的任务找资料一直也是找不到,运气好的遇到个提边角料的。但是都没有实质可以用的。发文档的也都是东贴贴别人的,西找找别人的。基本都是漫天胡扯。好了,废话不多说。直接进入今天的主题吧。模拟点击模拟点击和截屏其实在应用本身中实现其实很简单。但是跨进程就相对比较麻烦了。比如,你写一个程序,自动启动微信,点微信界面里的某几个按钮。如果你也是在找...

weixin_39603799的博客 424

arm linux添加input事件映射,Input系统之键值映射

一. 概述android系统的输入事件来源在linux内核提供的/dev/input的设备节点下, 当该设备下及诶点有数据刻度时,将数据独处并进行一系列的翻译和加工,然后在所有的窗口中寻找合适的接受者,并派发给它;输入系统总体流程如下(引之深入理解android卷3 ):1.1 开发环境系统: ubuntu 16.04运行环境: firefly-rk3288android版本: arm-5.1.0...

weixin_30386973的博客 492

android getevent sendevent input 接收发送事件

自动化测试或爬虫脚本场景经常需要模拟用户向手机设备发送各种交互事件,最常见的就是点击事件,这里面就有一个大前提就是你需要获取点击位置的 x、y 屏幕坐标。如何获取以及如何发送事件,这里涉...

滴水穿石,点石为金 3375

Android 下收发input事件的工具 getevent 和 sendevent

Android 自带了 getevent 和 sendevent, 分别用于获取设备报送的事件和模拟产生事件,前者用于辅助设备驱动的验证,后者用于模拟事件进行上层应用的验证。 关于event设备的获取,在 /proc/bus/input/devices 下面: $ adb shell cat /proc/bus/input/devices 0 getevent和send

alifrank的博客 1296
上一篇: 给 Android 开发者的 RxJava 详解
下一篇: Android 插件化 动态升级
WaveDHW
博客等级 码龄20年 455粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值