键扫描码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

Logo

更多推荐