层次说明:
1.android应用层
实现onTouchEvent和onTrackballEvent等函数接受运动事件,通过实现onKeyDown和onKeyUp等函数接受按键事件
2.java框架层
通过KeyInputDevice等类处理由EventHub传送上来的数据通过RawInputEvent和KeyEvent表示,按键事件直接由KeyEvent传给应用程序,触摸或轨迹球由RawInputEvent转换为MotionEvent传给应用程序
3.EventHub
本地框架层的EventHub是libui中的一部分,实现了对驱动程序的控制,需要kl和kcm文件的支持
4.驱动程序
真实设备节点位置dev/input/eventX
android输入设备驱动程序的头文件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的头文件,实现用户空间处理功能,触摸屏和轨迹球只需要传递坐标,按下,抬起等信息,而按键处理的过程先经过按键布局转换和按键码转换
数组KEYCODES[]是表示存储从字符串到整数的映射关系
framework/base/core/java/android/view/KeyEvent.java是android的KeyCode
映射解析:
文件位置:framework/base/data/keyboards
KeyLayoutMap.cpp负责解析处理kl文件,第一列为按键的扫描码,是整数值,第二列为按键的标签,字符串,完成第一次转换,第三列按键的Flag,WAKE表示可以唤醒系统,KeycodeLabels.h是第二次转换
KeyCharacterMap.cpp负责解析kcm文件
EventHub.cpp
framework/base/services/input/EventHub.cpp是输入系统的核心控制文件,例如当按下电源键后,系统把scanCode写入对应的设备节点,文件EventHub.cpp会读取该设备节点,并把scanCode通过KL文件对应成keyCode发送到上层