分享好友 最新动态首页 最新动态分类 切换频道
Android input键值从底层到应用层映射流程与修改方法
2024-12-27 03:21

Android输入事件的源头是位于/dev/input/下的设备节点,而输入系统的终点是由WMS管理的某个窗口。最初的输入事件为内核生成的原始事件,而最终交付给窗口的则是KeyEvent或MotionEvent对象。因此Android输入系统的主要工作是读取设备节点中的原始事件,将其加工封装,然后派发给一个特定的窗口以及窗口中的控件。这个过程由InputManagerService(以下简称IMS)系统服务为核心的多个参与者共同完成。

(1)键扫描码

ScanCode是由linux的Input驱动框架定义的整数类型,可参考input.h头文件,即getevent得到的键值。

 

(2) 键盘布局文件(*.kl)

将input event报的键值转换成具体键盘对应的按键供android上层使用,时通过键盘布局文件(*.kl)完成转换的。放在/system/usr/keylayout/下面

而qwert.kl中定义如下

 

其中ScanCode 是驱动报的值(即驱动input.h中定义的键值

(3) 添加kl文件

abcxxxx.kl(文件名须与input 的device设备的name一致

[199为 驱动定义的scanCode ,CAMERA 为Android中 KEYCODES[]定义按键对应的keylabel字符]

1)kl文件须与键盘输入的input的devic的名称一致,否则EventHub在加载设备时因找不到对应的kl而加载默认的qwert.kl,导致键值转换错误

2)kl中的scanCode和android中定义的keylabel字符必须对应,否则会转换错误。keyMapper在转换时是根据scanCode,来确定对应的按键字符,再根据此字符在KEYCODES中的位置来确定对应android中的键值

(4) kl文件添加到system

将kl文件(通常)放在/device/mtk/XXX/(XXX为项目名称)

添加AndroidBoard.mk

 

在/device/mtk/common/base.mk添加

 
 

①IR硬件扫描码在驱动里面被映射为 include/uapi/linux/input.h 里面定义的某个键值,但这个键值只在linux系统(内核)中使用。
 ②Android通过源码目录下的 device/xxx/xxx.kl(keylayout) 文件完成linux键值到Android系统要使用的键值映射。

​ 以HID设备为例,首先内核中的键值转换在drivers/hid/hid-input.c 中进行映射,键值通道也有多种类型,例如:keyboard、consumer 等等

//keyboard通道键值则是在如下数组添加修改

 

//consumer通道键值则是在如下添加修改

 

​ 通过 map_key_clear 宏将原始键值(usage->hid & HID_USAGE)转换成内核的定义,映射函数的具体实现可看内核源码

​ 以上键值的定义在 include/uapi/linux/input-event-codes.h (内核代码,较新版本定义整合进了input.h,对应到Android系统层的头文件则是 bionic/libc/kernel/uapi/linux/input-event-codes.h

 

可通过 getevent 指令查看上报的键值,键值为十六进制显示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U7UstaUe-1597307827051)(assets/821933-20180816205242760-1243866432.png)]

 
 

​ 如上我的设备名是:“Smart Remote” , VID PID信息是:Vendor=0030 Product=001D ,则对应 /system/usr/keylayout/Vendor_0030_Product_001D.kl,如果该目录下没有对应VID PID的.kl则默认使用 Generic.kl,根据系统差异可能另外有 /data/system/devices/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl ,此外还有键值对应字符的转换表:/system/usr/keychars/Generic.kcm 。

​ 所以上面通过getevent获得的原始键值是0x44(十进制:68),然后由 hid-input.c 可知 hid_keyboard[68]=87 而 input.h 中定义是 #define KEY_F11 87,所以Android系统层获取到内核转换后的键值为<87>,然后通过加载Generic.kl解析<87>的含义是"F11"(一般都是和内核头文件定义相匹配,也可以自己修改使其映射成其他含义):

 

键值从底层上报到上层的流程简图如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kUMPvATC-1597307827054)(assets/821933-20180816202424670-516556732.png)]

图2:键值上报流程

从上图可以看到,framework层通过.kl文件将获取的键值转换成实际按键含义后,又会通过KeycodeLabel转换成相应的keycode,具体文件在:frameworks ativeincludeinputKeycodeLabels.h(android 4.4.4源码)

 

​ 然后app可以通过如下方法获得对应键按下时的keyCode值,即“F11”对应获得的keyCode即为上面自定义的<546>

 
 

1、Kernel层

include/uapi/linux/input.h 中添加: #define KEY_LXL 123
     drivers/hid/hid-input.c 中添加: case 0x188: map_key_clear(KEY_LXL); break; //其中0x188是HID设备上报的原始键值

2、Android系统层

(1)定义按键对应的key label**

在KEYCODES[]数组的最后添加按键的key label,即:

 

位置:

Android 4.4 以前版本 frameworks/base/include/ui/KeycodeLabels.h 的KEYCODES[]数组中添加{ “LXL”, 666 },

Android 4.4 在framework/native/include/input/KeyCodelabels.h

Android5.0 以后在framework/native/include/input/InputEventLabels.h

(2)定义keyCode

A: native 定义(keycodes.h

 

1)位置:frameworks/base/include/android/keycodes.h

2)此处keycode的定义的值即是 上面key label定义在KEYCODES数组中的位置(index,否则会映射错误

B JAVA定义(KeyEvent.java定义键值

 

修改LAST_KEYCODE

 

  1. 位置:frameworks/base/core/java/android/view/KeyEvent.java

  2. 此处的key code必须与native定义的一致

C :资源文件(attrs.xml)添加keycode

  1. 位置:frameworksbasecore es esvaluesattrs.xml

影响到API则需要调用 make update-api 然后就可以使用了

​ 经过如上的步骤就将Linux驱动向上层抛出的"123"键值和Android系统中的KEYCODE_LXL <666>对应起来了,然后可以在Android的framework层的键值处理函数中,捕获按键事件,并进行相应自定义处理,具体在frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java 的**interceptKeyBeforeQueueing()**函数中实现。

dumpsys input

这个命令可以查看到输入设备映射到了哪一个kl文件 kl文件映射

getevent getevent -ltr

这个命令可以查看到输入的具体键值时多少,输出的是16进制。

input keyevent

模拟键值输入,input keyevent android键值 例如

 

注意这里的android 键值就是前面KeyEvent.java 里面对应的键值

cat /proc/bus/input/devices

查看设备信息,详见上文
},**

Android 4.4 在framework/native/include/input/KeyCodelabels.h

Android5.0 以后在framework/native/include/input/InputEventLabels.h

(2)定义keyCode

A: native 定义(keycodes.h

 

1)位置:frameworks/base/include/android/keycodes.h

2)此处keycode的定义的值即是 上面key label定义在KEYCODES数组中的位置(index,否则会映射错误

B JAVA定义(KeyEvent.java定义键值

 

修改LAST_KEYCODE

 

  1. 位置:frameworks/base/core/java/android/view/KeyEvent.java

  2. 此处的key code必须与native定义的一致

C :资源文件(attrs.xml)添加keycode

  1. 位置:frameworksbasecore es esvaluesattrs.xml

影响到API则需要调用 make update-api 然后就可以使用了

​ 经过如上的步骤就将Linux驱动向上层抛出的"123"键值和Android系统中的KEYCODE_LXL <666>对应起来了,然后可以在Android的framework层的键值处理函数中,捕获按键事件,并进行相应自定义处理,具体在frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java 的**interceptKeyBeforeQueueing()**函数中实现。

dumpsys input

这个命令可以查看到输入设备映射到了哪一个kl文件 kl文件映射

getevent getevent -ltr

这个命令可以查看到输入的具体键值时多少,输出的是16进制。

input keyevent

模拟键值输入,input keyevent android键值 例如

 

注意这里的android 键值就是前面KeyEvent.java 里面对应的键值

cat /proc/bus/input/devices

最新文章
建站资源策划:强化数据安全与隐私保护策略
  在建站资源策划中,数据安全与隐私保护无疑是至关重要的考虑因素。随着互联网的飞速发展,网络安全问题日益凸显,数据泄露、黑客攻击等事件时有发生,给企业和用户带来了巨大的损失。因此,在建站资源策划阶段,就必须充分考虑到数据安
类似捉宠物的手机游戏推荐 类似捉宠物的手机游戏推荐女生
本文目录有什么带宠物的手机游戏。有没有类似于QQ宠物那样的小游戏求能让宠物合体的好玩的手机游戏,多来几个,谢谢大家了1、1,类似于手机宠物的游戏有很多的。例如:宠物妖怪、宠物城堡、宠物联盟等等2、2,可以到电脑管家官网下载一个电脑
酒店预订小程序开发:打造高效便捷的在线预订平台
一、引言随着移动互联网的迅猛发展,小程序作为一种轻量级的应用形式,已经广泛应用于各行各业。酒店行业也不例外,越来越多的酒店开始开发自己的预订小程序,以提供更加便捷、高效的在线预订服务。本文将详细介绍酒店预订小程序的开发过程
vivo不讲武德,512GB+6000mAh+5000万双摄,如今低至1931元起
大家有没有发现今年下半年上市的主流国产高端机基本都涨价了?哪怕就是主打性价比的骁龙8至尊版手机起售价都已经来到了3699元,1999元买高通顶尖芯片的时代早已一去不复返了。如果你想要行业顶尖的性能,并且对拍照和质感等方面都有较高的
预测退休养老金最好的软件
内容摘要:关于退休养老金预测软件及查社保养老金下载哪个软件等热门问题,本文认为3进行计算和预测:软件会根据用户提供的信息结合相关政策和计算方法进行退休养老金的预测计算;其次,4查看结果和分析:软件会给出用户退休后的养老金收入
黔南通风气楼网上销售保障/按人气排行榜单
黔南通风气楼网上销售保障/按人气排行榜单在数字化时代,黔南通风气楼的网络销售已成为一种趋势。为确保消费者在线购买通风气楼时的权益,销售保障措施显得尤为重要。在产品选择上,销售平台应提供详尽的通风气楼信息,包括材质、性能、安
揭秘站长SEO工具,助力网站优化,高效提升搜索引擎排名
深度解析站长SEO工具,全方位助力网站优化,提高搜索引擎排名。本文详细介绍了站长SEO工具的功能、使用方法和技巧,帮助站长优化网站,实现流量增长和品牌提升。随着互联网的飞速发展,网站数量呈式增长,如何在众多网站中脱颖而出,成为广
最新抄歌流,音乐风尚与SEO优化策略,最新抄歌流,音乐风尚与SEO优化策略融合之道
摘要:最新抄歌流引领音乐风尚,结合SEO优化策略,提升音乐在线平台的曝光与流行度。通过关键词优化、热门话题跟踪及用户行为分析,提高歌曲搜索排名。借助社交媒体推广,增加用户互动与参与度,让音乐在竞争激烈的市场中脱颖而出。此举不
高清美女写真生成器:用AI画出你的梦想女神!
Midjourney:这个工具以其友好的用户界面和社区社交功能而出名,用户可以轻松分享并获取灵感。它生成的图片相对具有艺术感,适合那些追求独特风格的用户。其弱点在于允许的分辨率较低,不适合打印。Stable Diffusion:开放源代码,实现了超
靠谱!沈阳艺术生文化课冲刺班十大排名一览
辅导方式授课形式班型设置独特优势面授辅导全日制封闭式1对1老师1对1面对面辅导,私人定制个性化辅导方案及开课时间;*封闭半军事化管理,住宿安全舒适、作息健康规律、饮食营养丰富;专职班主任24小时和学生同吃同住,全心全意陪伴学生,
相关文章
推荐文章
发表评论
0评