Android 查看按键信息的常用命令详解
Android 查看按键信息的常用命令详解
文章目录
- Android 查看按键信息的常用命令详解
- 一、主要命令:
- 二、命令详解
- 1、getevent
- 2、getevent -l
- 3、dumsys input
- 4、cat XXX.kl
- 4、cat /dev/input/eventX
- 5、getevent 其他命令
- 6、input keyevent XX
- 三、简单示例修改
- 四、总结
- 1、查看按键的基本命令
- 2、按键功能适配和修改
如果需要适配系统按键或者查看按键信息,那么按键基本命令和查看基本命令里面的信息是关键基础。
本文一起学习看出一下按键基本命令和里面的关键信息。
一、主要命令:
getevent //查看所有键值事件的键值数值getevent -l //查看所有键值事件的键值字符串dumsys input //查看输入事件的相关信息,event对于的名称等信息cat /dev/input/eventX //只查看某个键值事件,Android9或者更新版本会乱码ls -l /system/usr/keylayout //查看系统有哪些kl文件
除了"dumpsys input"这个命令不需要su/root权限,其他命令都是需要获取权限才能获得信息。
简单示例:
C:\Users\As11040>adb shell
atom:/ $ getevent
could not open /dev/input/event2, Permission denied
could not open /dev/input/event0, Permission denied
add device 1: /dev/input/event3name: "fts_ts"
could not open /dev/input/event1, Permission denied
这里可以看到提示无法读取里面的 dev/input/eventX 节点数据,权限禁止。
所以su权限或者root权限是需要的。
但是也可能跟平台,之前测试其他平台有的是可以 “getevent”,但是cat 里面的节点不行。
二、命令详解
这里用已root 的小米手机讲解。
1、getevent
按下音量减,再按音量加按键的打印:
C:\Users\As11040>adb shell
atom:/ $ su
atom:/ #
130|atom:/ # getevent
//(1)这里可以查看到按键的eventX节点,和节点在内核上的命名名称
add device 1: /dev/input/event2name: "aw8624_haptic"
add device 2: /dev/input/event0name: "ACCDET"
add device 3: /dev/input/event3name: "fts_ts"
add device 4: /dev/input/event1name: "mtk-kpd"//(2)按下音量减按键,这里第二列的0001 对应的数据才是有用的数据,可以看到音量减键对应的按键键值是0x72
/dev/input/event1: 0001 0072 00000001 //(3)1是按下
/dev/input/event1: 0000 0000 00000000
/dev/input/event1: 0001 0072 00000000 //(4)0是抬起
/dev/input/event1: 0000 0000 00000000//(5)按下音量加按键,可以看到音量加键对应的按键键值是0x73
/dev/input/event1: 0001 0073 00000001
/dev/input/event1: 0000 0000 00000000
/dev/input/event1: 0001 0073 00000000
/dev/input/event1: 0000 0000 00000000
getevent 作为查看键值最常用的命令,可以查看到kl文件对于的按键的键值。
getevent后获取到有用的信息:
(1)系统触摸,按键,键盘等输入设备所有的数据节点eventX以及节点对应的名称命名name
这个节点的名称有些情况还是非常重要的,具体选择kl文件的时候可能会判断到是否存在对应的kl文件。
(2)按键键值对应的16进制数值
记住这里显示是16进制的键值,但是按键配置文件kl中,显示的是10进制的数值
比如音量减 0x72 对应10进制值是16*7+2=114,音量加 0X73-->115
(3)按键的节点数据在 "/dev/input/event1" 里面
(4)底层对该节点的命名名称是 "mtk-kpd"
这个键值数值有啥用呢,其实是对应kl文件找到事件名称,给底层发送事件。
后面会有关联介绍。
2、getevent -l
//(1)这里可以查看到按键的eventX节点,和节点在内核上的命名名称
130|atom:/ # getevent -l
add device 1: /dev/input/event2name: "aw8624_haptic"
add device 2: /dev/input/event0name: "ACCDET"
add device 3: /dev/input/event3name: "fts_ts"
add device 4: /dev/input/event1name: "mtk-kpd"//(2)按下音量减按键,这里第三列的DOWN/UP对应的数据才是有用的数据,可以看到音量减键对应的按键字符串是 KEY_VOLUMEDOWN
/dev/input/event1: EV_KEY KEY_VOLUMEDOWN DOWN // (3)kl文件中定义的是 VOLUMEDOWN
/dev/input/event1: EV_SYN SYN_REPORT 00000000
/dev/input/event1: EV_KEY KEY_VOLUMEDOWN UP
/dev/input/event1: EV_SYN SYN_REPORT 00000000/dev/input/event1: EV_KEY KEY_VOLUMEUP DOWN // (4)kl文件中定义的是 KEY_VOLUMEUP
/dev/input/event1: EV_SYN SYN_REPORT 00000000
/dev/input/event1: EV_KEY KEY_VOLUMEUP UP
/dev/input/event1: EV_SYN SYN_REPORT 00000000
“getevent -l” 这个命名一般人不怎么使用,但是用来查看按键事件的意义还是有价值的。
KEY_XXX 的 XXX 字符串是发送给底层的命令。
VOLUMEDOWN 就是音量减,VOLUMEUP就是音量加。
3、dumsys input
这个命令里面信息最多最具体,属于input系统的默认配置信息。
主要相关信息如下:
atom:/ # dumpsys input
INPUT MANAGER (dumpsys input)Input Manager State:Interactive: falseSystem UI Visibility: 0x8008Pointer Speed: 0Pointer Gestures Enabled: trueShow Touches: falsePointer Capture Enabled: falseEvent Hub State: //(1)事件状态信息是主要关注的BuiltInKeyboardId: -2Devices: //(2)Devices里面的每个信息都是对应不同的节点信息-1: VirtualClasses: 0x40000023Path: <virtual> (3)关注Path字符串,就是节点的位置,这里是虚拟,不清楚具体意义Enabled: trueDescriptor: a718a782d34bc767f4689c232d64d527998ea7fdLocation:ControllerNumber: 0UniqueId: <virtual>Identifier: bus=0x0000, vendor=0x0000, product=0x0000, version=0x0000KeyLayoutFile: /system/usr/keylayout/Generic.klKeyCharacterMapFile: /system/usr/keychars/Virtual.kcmConfigurationFile:HaveKeyboardLayoutOverlay: falseVideoDevice: <none>1: aw8624_hapticClasses: 0x00000200Path: /dev/input/event2Enabled: trueDescriptor: 65195a4ab35c59e79bbba55177be90fc42ed3ae6Location:ControllerNumber: 0UniqueId:Identifier: bus=0x0000, vendor=0x0000, product=0x0000, version=0x0000KeyLayoutFile:KeyCharacterMapFile:ConfigurationFile:HaveKeyboardLayoutOverlay: falseVideoDevice: <none>2: ACCDETClasses: 0x00000081Path: /dev/input/event0Enabled: trueDescriptor: 1c78f7e0d16d4dbc8d3ab93943523f379203f90bLocation:ControllerNumber: 0UniqueId:Identifier: bus=0x0019, vendor=0x0000, product=0x0000, version=0x0000KeyLayoutFile: /system/usr/keylayout/Generic.klKeyCharacterMapFile: /system/usr/keychars/Generic.kcmConfigurationFile:HaveKeyboardLayoutOverlay: falseVideoDevice: <none>3: fts_tsClasses: 0x00000015Path: /dev/input/event3Enabled: trueDescriptor: a1cc21cba608c55d28d6dd2b1939004df0e0c756Location:ControllerNumber: 0UniqueId:Identifier: bus=0x0018, vendor=0x0000, product=0x0000, version=0x0000KeyLayoutFile: /system/usr/keylayout/Generic.klKeyCharacterMapFile: /system/usr/keychars/Generic.kcmConfigurationFile:HaveKeyboardLayoutOverlay: falseVideoDevice: <none>4: mtk-kpd //(4)按键事件的节点命名名称Classes: 0x00000001Path: /dev/input/event1 //(5)按键事件的节点位置,这个才是主要的,名称可以不可,但是节点必须找对Enabled: trueDescriptor: f0d2e427e7a05eb6d316f5e14800c5ac7b6aee79Location:ControllerNumber: 0UniqueId:Identifier: bus=0x0019, vendor=0x2454, product=0x6500, version=0x0010 //(6)各版本号,寻找kl使用到KeyLayoutFile: /system/usr/keylayout/mtk-kpd.kl //(7)实际起作用的kl文件KeyCharacterMapFile: /system/usr/keychars/Generic.kcmConfigurationFile:HaveKeyboardLayoutOverlay: falseVideoDevice: <none>Unattached video devices:<none>
"dumpsys input"命令的信息是很多的,这里只显示和分析主要的。
查看和分析“dumpsys input”日志思路:
1、根据getevent 获取到事件的节点,比如这里按键节点是 event1
2、“dumpsys input”查看需要查找的节点的信息,比如这里的 event1 和 名称 mtk-kpd
3、查看里面的真正起作用的kl文件,比如这里是 /system/usr/keylayout/mtk-kpd.kl
其实到这里主要信息已经看完了,但是要怎么理解和运用是要一定基础的。
后面会有个别修改示例分析。
4、cat XXX.kl
查询都实际使用的kl文件后,可以cat 查看里面的文件
比如cat上面的 /system/usr/keylayout/mtk-kpd.kl 文件查看到部分信息如下:
key 56 ALT_LEFT
key 100 ALT_RIGHT
key 42 SHIFT_LEFT
key 54 SHIFT_RIGHT
key 57 SPACE
key 58 SOFT_RIGHT
key 465 LAST_CHANNEL
key 402 CHANNEL_UP
key 403 CHANNEL_DOWN
key 115 VOLUME_UP //音量加
key 114 VOLUME_DOWN //音量减
key 113 VOLUME_MUTE
key 28 DPAD_CENTER
key 103 DPAD_UP
key 108 DPAD_DOWN
key 105 DPAD_LEFT
key 106 DPAD_RIGHT
key 158 BACK //返回
key 139 MENU //菜单
key 102 HOME //主页
key 398 PROG_RED
key 399 PROG_GREEN
key 400 PROG_YELLOW
key 401 PROG_BLUE
key 165 MEDIA_PREVIOUS
key 163 MEDIA_NEXT
key 168 MEDIA_REWIND
key 208 MEDIA_FAST_FORWARD
key 164 MEDIA_PLAY_PAUSE
key 166 MEDIA_STOP
key 167 MEDIA_RECORDkey 155 ENVELOPE
key 12 MINUS
key 13 EQUALS
key 215 AT
key 130 ZOOM_IN
key 131 ZOOM_OUT
#key 15 BACK
key 466 TV_INPUT
key 111 PAGE_UP
key 112 PAGE_DOWN
key 358 INFO
key 213 CAPTIONS
key 214 MEDIA_AUDIO_TRACK
key 216 NUM_LOCK
key 217 GUIDE
4、cat /dev/input/eventX
这个是在手机的Android19-13的设备上查看会乱码,不清楚是Android 版本问题还是具体系统代码问题?
很久以前这样看过,打印的和getevent 的日志是一样的,但是只打印某个类型的数据。
其实要打印某个event的事件,是可以通过grep 过滤显示的。
比如需要只显示 按键事件的日志:
getevent | grep event1
5、getevent 其他命令
1|console:/ # getevent -help
Usage: getevent [-t] [-n] [-s switchmask] [-S] [-v [mask]] [-d] [-p] [-i] [-l] [-q] [-c count] [-r] [device] //这里提示可以多个一起打印-t: show time stamps //显示时间戳-n: don't print newlines //不要打印换行符-s: print switch states for given bits //打印给定位的开关状态-S: print all switch states //打印所有开关状态-v: verbosity mask (errs=1, dev=2, name=4, info=8, vers=16, pos. events=32, props=64) //详细掩码(错误=1,dev=2,名称=4,信息=8,错误=16,位置事件=32,道具=64)-d: show HID descriptor, if available //显示HID描述符(如果可用)-p: show possible events (errs, dev, name, pos. events) //显示可能的事件(错误、开发、名称、位置事件)-i: show all device info and possible events //显示所有设备信息和可能的事件 , 包含dumpsys input 的主要信息-l: label event types and names in plain text //用纯文本标记事件类型和名称-q: quiet (clear verbosity mask) //安静(清晰冗长的掩码)-c: print given number of events then exit //打印给定数量的事件,然后退出-r: print rate events are received 接收到打印速率事件
1|console:/ #
上面命令可以一次打印多个,大部分都没有过!
6、input keyevent XX
input命令估计也很多人用过,用得较多的是input text XX,input keyevent XX估计用得比较少。
input keyevent XX //这里的XX数值就是底层的数值,而不是上层kl里面定义的数值
比如:
input keyevent 24 //音量加,上层是 115
input keyevent 25 //音量减,上层是 114
input keyevent 3 //Home.上层是 102
用串口输入的事件,getevent 打印是不会再收到的。
上层和底层数值 上是没有任何关联的,都是在两个不同的文件定义各自的数值(从1开始一直完后加),是使用字符串关联起来的。
三、简单示例修改
在实际场景中,有可能需要替换掉某个按键的具体功能,
比如把键盘“回车”按键的功能换成“确定”功能;去除Home按键,或者Home按键换成其他功能。
这里简单修改一下,音量减按键修改成音量加按键的功能:
修改:/system/usr/keylayout/mtk-kpd.kl key 115 VOLUME_UP //音量加
key 114 VOLUME_UP //音量减,修改成音量加功能字符串
实现修改的方式可以pull文件后再push进去或者使用busybox vi XXX 功能,都是需要root权限的!
这里只是测试验证功能,实际没啥这样改的场景哈。
重启设备后,按下音量加或者音量减按键,音量都是加的。证明修改是ok的。
这个也说明kl 文件中,字符串指令 才是底层接收的指令。
上层这里定义的 key 115 只是上层对应的数值,
底层其实也是有自己的数值的比如音量加按键底层数值是 24。
如果要添加自定义键值可以参考:https://www.likecs.com/show-258237.html
四、总结
1、查看按键的基本命令
getevent //查看所有键值事件的键值数值getevent -l //查看所有键值事件的键值字符串dumsys input //查看输入事件的相关信息,event对于的名称等信息
2、按键功能适配和修改
1、通过"getevent"查看事件节点和节点名称;
2、通过"dumpsys input"查看节点的具体使能的kl文件;
3、修改kl文件适配功能;
相关文章:
Android 查看按键信息的常用命令详解
Android 查看按键信息的常用命令详解 文章目录 Android 查看按键信息的常用命令详解一、主要命令:二、命令详解1、getevent2、getevent -l3、dumsys input4、cat XXX.kl4、cat /dev/input/eventX5、getevent 其他命令6、input keyevent XX 三、简单示例修改四、总结…...

【Java 基础篇】Properties 结合集合类的使用详解
Java 中的 Properties 类是一个常见的用于管理配置信息的工具,它可以被看作是一种键值对的集合。虽然 Properties 通常用于处理配置文件,但它实际上也可以作为通用的 Map 集合来使用。在本文中,我们将详细探讨如何使用 Properties 作为 Map 集…...
数字孪生体标准编程
数字孪生体标准 括ISO TC184/SC4正在制定数字孪生制造标准ISO 23247、ISO/IEC JTC1/AG11正在推动数字孪生体标准、IEEE P2806正在做有关“数字表达”的标准。赢家通吃的标准战 卡尔夏皮罗和哈尔范里安撰写了《信息规则:网络经济战略指南》(Information R…...

力扣 -- 394. 字符串解码
解题方法: 参考代码: class Solution{ public:string decodeString(string s){stack<string> sst;stack<int> dst;//防止字符串栈为空的时候再追加字符串到栈顶元素sst.push("");int n s.size();int i 0;while(i<n)//最好不…...

面试官:什么是虚拟DOM?如何实现一个虚拟DOM?说说你的思路
🎬 岸边的风:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 一、什么是虚拟DOM 二、为什么需要虚拟DOM 三、如何实现虚拟DOM 小结 一、什么是虚拟DOM 虚拟 DOM (…...

Ubuntu安装中文拼音输入法
ubuntu安装中文拼音输入法 ubuntu版本为23.04 1、安装中文语言包 首先安装中文输入法必须要让系统支持中文语言,可以在 Language Support 中安装中文语言包。 添加或删除语音选项,添加中文简体,然后会有Applying changes的对话框&#x…...

高端知识竞赛中用到的软件和硬件有哪些
现在单位搞知识竞赛,已不满足于用PPT放题,找几个简单的抢答器、计分牌弄一下了,而是对现场效果和科技感要求更高了。大屏要分主屏侧屏,显示内容要求丰富炫酷;选手和评委也要用到平板等设备;计分要大气些&am…...
Vue 3.3 发布
本文为翻译 原文地址:宣布推出 Vue 3.3 |The Vue Point (vuejs.org) 今天我们很高兴地宣布 Vue 3.3 “Rurouni Kenshin” 的发布! 此版本侧重于开发人员体验改进 - 特别是 TypeScript 的 SFC <script setup> 使用。结合 Vue Language Tools&…...
算法|图论 3
LeetCode 130- 被围绕的区域 题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 题目描述:给你一个 m x n 的矩阵 board ,由若干字符 X 和 O ,找到所有被 X 围绕的区域,并将这些区域…...

【数据结构】二叉树的层序遍历(四)
目录 一,层序遍历概念 二,层序遍历的实现 1,层序遍历的实现思路 2,创建队列 Queue.h Queue.c 3,创建二叉树 BTree.h BTree.c 4,层序遍历的实现 一,层序遍历概念 层序遍历:除了先序…...

macOS文件差异比较最佳工具:Beyond Compare 4
Beyond Compare for mac是一款Scooter Software研发的文件同步对比工具。你可以选择针对多字节的文本、文件夹、源代码,甚至是支持比对adobe文件、pdf文件或是整个驱动器,检查其文件大小、名称、日期等信息。你也可以选择使用Beyond Compare合并两个不同…...

Windows+Pycharm 如何创建虚拟环境
当我们开发一个别人的项目的时候,因为项目里有很多特有的包,比如 Pyqt5.我们不想破坏电脑上原来的包版本,这个时候,新建一个虚拟环境,专门针对这个项目就很有必要了. 简略步骤: 1.新建虚拟环境 1.打开 pycharm 终端(Terminal)安装虚拟环境工具: pip install virtualenv2.创…...

vant 按需导入 vue2
vant 按需导入 vue2 1、通过npm安装 # Vue 3 项目,安装最新版 Vant: npm i vant -S# Vue 2 项目,安装 Vant 2: npm i vantlatest-v2 -S2、自动按需引入组件 babel-plugin-import 是一款 babel 插件,它会在编译过程中…...
Java手写分治算法和分治算法应用拓展案例
Java手写分治算法和分治算法应用拓展案例 1. 算法思维导图 以下是用Mermanid代码表示的分治算法的实现原理: #mermaid-svg-nvJwIm97kPHEXQOR {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-nvJwIm97kP…...
学习 CodeWhisperer 的一些总结
目前一些常见的的 AI 工具 GitHub Copilot:GitHub 与 OpenAI 合作开发的一个人工智能助手。 Codeium:是一个免费的人工智能驱动的代码生成工具 Tabnine:一个自动代码生成工具,免费版本非常有限,只提供简短的代码完成…...

JavaScript 中的 `this` 指向问题与其在加密中的应用
JS中的 this 关键字是一个非常重要的概念,它在不同情况下会指向不同的对象或值。在本文中,我们将深入探讨 JavaScript 中 this 的各种情况,并思考如何将其应用于 JS加密中的一些有趣用途。 1. 全局上下文中的 this 在全局上下文中ÿ…...

深入理解算法的时间复杂度
文章目录 时间复杂度的定义时间复杂度的分类时间复杂度分析常见数据结构和算法的时间复杂度常见数据结构常见算法 常见排序算法说明冒泡排序(Bubble Sort)快速排序(Quick Sort)归并排序(Merge Sort)堆排序(Heap Sort) 时间复杂度的定义 时间复杂度就是一种用来描述算法在输入规…...

2023年度教育部人文社会科学研究一般项目评审结果,已公布!
【SciencePub学术】 9月15日,教育部社科司公示了2023年度教育部人文社会科学研究一般项目评审结果,共3482项。 其中,规划基金、青年基金、自筹经费项目共3029项通过专家评审;西部和边疆地区项目200项,新疆项目20项&a…...

十一、MySql的事务(上)
文章目录 一、引入(一)CURD不加控制,会有什么问题?(二)CURD满足什么属性,能解决上述问题? 二、什么是事务?三、事务的特性(一)原子性:…...
时间序列分析1--生成和导出时间序列数据
时间序列数据的生成 直接录入 1.行录入 ts.(price,startc(2015,1),frequency 12) # price为时间序列变量,start为起始读入时间 frequncy指定每年读入的数据的频率,frequncy4为季度数据、frequncy52为星期数据 2.列录入 scan() 1:101 ....6:7 7:…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...

逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...