層次說明:
1.android應用層
實現(xiàn)onTouchEvent和onTrackballEvent等函數(shù)接受運動事件,通過實現(xiàn)onKeyDown和onKeyUp等函數(shù)接受按鍵事件
2.java框架層
通過KeyInputDevice等類處理由EventHub傳送上來的數(shù)據(jù)通過RawInputEvent和KeyEvent表示,按鍵事件直接由KeyEvent傳給應用程序,觸摸或軌跡球由RawInputEvent轉(zhuǎn)換為MotionEvent傳給應用程序
3.EventHub
本地框架層的EventHub是libui中的一部分,實現(xiàn)了對驅(qū)動程序的控制,需要kl和kcm文件的支持
4.驅(qū)動程序
真實設(shè)備節(jié)點位置dev/input/eventX
android輸入設(shè)備驅(qū)動程序的頭文件include/linux/input.h或include/uapi/linux/input.h,核心文件是drivers/input/input.c,event部分代碼文件driver/input/evdev.c
硬件抽象層:
framework/base/include/androidfw/KeycodeLabels.h或framework/native/include/input/KeycodeLabels.h是本地框架層libui的頭文件,實現(xiàn)用戶空間處理功能,觸摸屏和軌跡球只需要傳遞坐標,按下,抬起等信息,而按鍵處理的過程先經(jīng)過按鍵布局轉(zhuǎn)換和按鍵碼轉(zhuǎn)換
數(shù)組KEYCODES[]是表示存儲從字符串到整數(shù)的映射關(guān)系
framework/base/core/java/android/view/KeyEvent.java是android的KeyCode
映射解析:
文件位置:framework/base/data/keyboards
KeyLayoutMap.cpp負責解析處理kl文件,第一列為按鍵的掃描碼,是整數(shù)值,第二列為按鍵的標簽,字符串,完成第一次轉(zhuǎn)換,第三列按鍵的Flag,WAKE表示可以喚醒系統(tǒng),KeycodeLabels.h是第二次轉(zhuǎn)換
KeyCharacterMap.cpp負責解析kcm文件
EventHub.cpp
framework/base/services/input/EventHub.cpp是輸入系統(tǒng)的核心控制文件,例如當按下電源鍵后,系統(tǒng)把scanCode寫入對應的設(shè)備節(jié)點,文件EventHub.cpp會讀取該設(shè)備節(jié)點,并把scanCode通過KL文件對應成keyCode發(fā)送到上層