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:…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...

Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...