Android系统按键上报流程及其转化
getevent按键上报键扫描码Scancode是由Linux的Input驱动框架定义的整数类型。键扫描码Scancode经过一次转化后,形成按键的标签KeycodeLabel,是一个字符串的表示形式。按键的标签KeycodeLabel经过转换后,再次形成整数型的按键码keycode。在Android应用程序层,主要使用按键码keycode来区分。1.当底层Kernel驱动完成后,可以使用adb
键扫描码ScanCode是由Linux的Input驱动框架定义的整数类型。键扫描码ScanCode经过一次转化后,形成按键的标签KeycodeLabel,是一个字符串的表示形式。按键的标签KeycodeLabel经过转换后,再次形成整数型的按键码keycode。在Android应用程序层,主要使用按键码keycode来区分。
按键上报流程及其转化
1.当底层Kernel驱动完成后,可以使用adb shell getevent查看上报事件
C:\Users\Admin>adb shell getevent
add device 1: /dev/input/event4
name: "trinket-idp-snd-card Button Jack"
add device 2: /dev/input/event3
name: "trinket-idp-snd-card Headset Jack"
add device 3: /dev/input/event1
name: "goodix-ts"
add device 4: /dev/input/event0
name: "qpnp_pon"
add device 5: /dev/input/event2
name: "gpio-keys"
/dev/input/event1: 0001 009e 00000001
/dev/input/event1: 0000 0000 00000000
/dev/input/event1: 0001 009e 00000000
/dev/input/event1: 0000 0000 00000000
2.查看上层映射表kl,如frameworks/base/data/keyboards/Generic.kl,对应于rom目录下/system/usr/keylayout/Generic.kl
kl文件是有设备专属的文件,系统提供了常规按键布局文件Generic.kl,当无匹配时使用Generic.kl
十六进制0x9e转化为十进制为158,如:key 158 BACK
3.驱动按键绑定Keycode
frameworks/native/include/input/InputEventLabels.h
DEFINE_KEYCODE(BACK)
4.二次转化参照
frameworks/base/include/ui/KeycodeLabels.h
external/replicaisland/res/values/arrays.xml
5.Keycode定义
frameworks/base/core/java/android/view/KeyEvent.java
/** Key code constant: Back key. */
public static final int KEYCODE_BACK = 4;
frameworks/native/include/android/keycodes.h
/** Back key. */
AKEYCODE_BACK = 4,
按键示例
根据kl文件,在第一次转化时将驱动扫描码(整型16进制)转化为按键标签(字符串类型),再通过KeycodeLabels.h的数组,转化为对应的按键码KeyCode,供上层使用。
如Generic.kl:key 158 BACK
当按下返回键时,扫描码为158 (0x9e),对应的标签为 BACK ,再经过第二次转换,根据KeycodeLabels.h的KEYCODES数组,其对应的按键码为4。
扫描码来自驱动程序,显然不同的扫描码可以对应一个按键标签,表示物理上的两个按键可以对应同一个功能按键。
新增按键实现电源键功能:
按键上报0xcc 找到对应的kl文件 在这个kl文件修改一下 key 204 POWER (0xcc 对应十进制204)即可实现电源键功能
// 如果对新键值进行处理,可以通过获取相应的keycode,对它进行处理,对于按键事件的处理一般在 interceptKeyBeforeQueueing
frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
interceptKeyBeforeQueueing()
// 添加新keylayout文件
# Copy .kl file for generic voice remotes
PRODUCT_COPY_FILES += \
device/google/atv/Generic.kl:system/usr/keylayout/Generic.kl
相关文件
1.KL(Keycode Layout):后缀名为kl的配置文件
2.KCM(KeyCharacterMap):后缀名为kcm的配置文件
设备文件系统的/system/usr/keylayout/或/system/usr/keychars/
Android默认提供的按键布局文件主要包括qwerty.kl和AVRCP.kl。
qwerty.kl为全键盘的布局文件,是系统中主要按键使用的布局文件;
AVRCP.kl用于多媒体的控制,ACRCP的含义为Audio/Video Remote Control Profile。
相关参考
https://blog.csdn.net/qq_37858386/article/details/112170827
https://blog.csdn.net/u013986340/article/details/101022488
更多推荐
所有评论(0)