键值对接
涉及到的文件:
- frameworks/native/include/input/KeycodeLabels.h
- external/kernel-headers/original/linux/input.h
ScanCode &KeyCode的对应关系
主要log如下:
D/InputReader( 3795): deviceId 1
D/InputReader( 3795): Input event: device=1 type=0x0001 code=0x00ac value=0x00000001 when=563708568000
D/KeyCharacterMap( 3795): mapKey: scanCode=172, usageCode=0x00000000 ~ Failed.
D/KeyLayoutMap( 3795): mapKey: scanCode=172, usageCode=0x00000000 ~ Result keyCode=3, outFlags=0x00000000.
D/InputReader( 3795): scanCode 172, usageCode 0 keyCode 3
D/InputReader( 3795): call keyboard process
D/InputReader( 3795): notifykey in KeyboardInputMapper
D/InputReader( 3795): Input event: device=1 type=0x0000 code=0x0000 value=0x00000000 when=563708568000
D/InputDispatcher( 3795): notifyKey - eventTime=563708568000, deviceId=1, source=0x301, policyFlags=0x0, action=0x0, flags=0x8, keyCode=0x3, scanCode=0xac, metaState=0x0, downTime=563708568000
设备接收到的是ScanCode &Device id。之后将会根据device ID寻找对应的设备。在此次分析的设备中对应的layout为:Vendor_0001_Product_0001.kl
下面截取的文件内容如下:
关键字 ScanCode label
key 172 HOME
文件内容格式为:关键字 ScanCode Label
。注意之间用空格隔开。
根据上面的log看出,收到的scancode为172,之后根据scancode就能查询到对应的label,在这面就是“HOME”。
之后再根据label查找frameworks/native/include/input/KeycodeLabels.h文件中的数组。
KeycodeLabels.h文件中相关内容如下:
static const KeycodeLabel KEYCODES[] = {
···
{ "HOME", 3 },
···
从这个地方就能够查询到对应的keycode为3.
之后再把keycode返回给framework层。
其他
以下是从网络抓取的内容,还没进行验证。
Android 4.4 以前版本 frameworks/base/include/ui/KeycodeLabels.h
Android 4.4 在framework/native/include/input/KeyCodelabels.h
Android5.0 以后在framework/native/include/input/InputEventLabels.h
B:kl文件添加到system
将kl文件(通常)放在/device/qcom/XXX/(XXX为项目名称)
(1) AndroidBoard.mk 添加:
include $(CLERA_VARS)
LOCAL_MODULE := abcxxxx.kl
LOCAL_MODULE_TARGS := optional eng
LOCAL_MODULE_CLASS := ETC
LOCAL_SRC_FILES := $(LOCAL_MODULE)
LOCAL_MODULE_PATH := $(TARGET_OUT_KEYLAYOUT)
include $(BUILD_PREBUILT)
(2)/device/qcom/common/base.mk添加
KEYPAD += abcxxxx.kl
注:不加会导致kl文件不被打包进/system/usr/keylayout/