http://blog.csdn.net/sincethen/article/details/5942483 (一) 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);