所涉及的类:
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.最后,也可以查询设备的驱动文件,在驱动中修改。