Android input处理机制(二)改键机制

时间:2021-03-28 20:27:21
本文主要总结一下Android平台的改键机制,从三个层次 驱动  键盘布局文件  InputReader

所涉及的类:

   class EventHub;

   struct Device;

   class KeyMap;

   KeylayoutMap;

   class InputReader;

所涉及的文件:

frameworks \

EventHub.h;

EventHub.cpp;

KeyBoard.h;

KeyBoard.cpp;

KeyLayoutMap.h

KeyLayoutMap.cpp

KeycodeLabel.h

InputReader.cpp

kernel \

具体的驱动文件

涉及流程:

从EventHub入手,EventHub::openDeviceLocked->  EventHub::loadKeyMapLocked   ->    KeyMap::load -> KeyMap::loadKeyLayout  -> KeyLayoutMap::load -> KeyLayoutMap::Parser::parse() ->  KeyLayoutMap::Parser::parseKey() -> getKeyCodeByLabel     -> lookupValueByLabel (KeyCodeLabels.h)

实施改键的关键位置

1.KeyLayoutMap::load 此处加载 (驱动名.kl) 文件,从而加载键盘布局,如设备不提供键盘布局文件,则默认加载usr/keylayout/qwerty.kl

根据键盘布局文件提供的scanCode和关键字在KeyCodeLabels中查找KeyCode。有关详细内容,请参考android键盘布局

所以,修改键盘布局文件,可以改键成功,或修改KeyCodeLabels.h包含的KeyCodeLabels数组也可以。

2.另外,也可以从InputReader 或InputDispatcher进行改键。在InputReader中我们可以拦截一个按键,并利用下面这个函数InputReader::dispatchVirtualKey()重新产生一个虚拟按键。

3.最后,也可以查询设备的驱动文件,在驱动中修改。