(一)
Step 1 => WindowManagerService运行线程InputDeviceReader 用于读取如下消息: 按键消息,触摸屏消息,轨迹球消息
Step 2 => WindowManagerService运行线程PolicyThread : 结合PhoneWindowManager.java/KeyguardViewMediator.java 来管理当前窗口显示等
Step 3 => WindowManagerService运行线程InputDispatcherThread : 将线程InputDeviceReader()放在事件队列里面的消息分发出去
(二)InputDeviceReader() 运行流程:
Step 1: 调用底层函数,从/dev/input/下面的输入设备读入输入事件
Step 2: 对读入的输入事件作预处理 -> 用于决定是否要分发给系统的其他模块(不分发的输入事件要么自己处理,要么丢弃,这需要让PhoneWindowManager来决定)
Step 3: 将读入的输入事件放到各自对应的事件队列中
(三)androkd寻找kl文件的原理如下:
1)首先寻找/system/usr/keylayout/gpio-keys.kl => I/EventHub( 698): New keyboard: publicID=65537 device->id=65537 devname='gpio-keys' propName='hw.keyboards.65537.devname' keylayout='/system/usr/keylayout/qwerty.kl'
2)如果没有,就默认使用/system/usr/keylayout/qwerty.kl
(四)
从驱动读取到输入事件的信息:
然后将CPP层读取到的输入事件写入java层代码中:
env->SetIntField(event, gInputOffsets.mDeviceId, (jint)deviceId);
env->SetIntField(event, gInputOffsets.mType, (jint)type);
env->SetIntField(event, gInputOffsets.mScancode, (jint)scancode);
env->SetIntField(event, gInputOffsets.mKeycode, (jint)keycode);
env->SetIntField(event, gInputOffsets.mFlags, (jint)flags);
env->SetIntField(event, gInputOffsets.mValue, value);