1. 按键映射的初始化 (文件Framework/base/libs/ui/EventHub.cpp )
EventHub::openDevice()
-----> // snprintf(keylayoutFilename, sizeof(keylayoutFilename),
// "%s/usr/keylayout/%s.kl", root, tmpfn); 确定按键映射文件名,按键映射文件在 (qwerty.kl全键盘的定义)
// a. 根文件系统中的ANDROID_ROOT/usr/keylayout/目录下的*.kl
// b.源码中的的各自工程目录下,如device/product/*.kl
KeyLayoutMap::load() 解析按键映射配置文件,完成按键的映射初始化等操作,
并生成按键映射keylayoutMap 中的Vector成员m_keys
主要流程是:
a. 解析*.kl的每一行,得出底层keycode 和其映射到android系统按键的映射字串.
b. 通过android 字串,从KEYCODES[]中获取其对应的android keycode.(KeycodeLabels.h)
c. 将原始的keycode 和得到的android keycode 绑定添加到Vector成员m_keys中.
2. 事件的获取 (文件Framework/base/libs/ui/EventHub.cpp )
EventHub::getEvent()
---> //从input文件中读取input 数据
KeyLayoutMap::map() 解析读取到的input数据,并从初始化的keylayoutMap 中的Vector成员m_keys中获取到android需要的按键keycode
解析代码如下:
ssize_t index = m_keys.indexOfKey(scancode); //通过input数据得到的keycode,获取其对应于vector中的索引
const Key& k = m_keys.valueAt(index); //通过索引找到其映射对应的android keycode