在前面的的小节提到过,输入子系统框架中,在应用层会创建Reader与Dispatcher两个线程,这两个线程都是while循环,该小节我们就查看源码他们是如何创建如何工作的。
基于面向对象思想,源码中定义了两个类,InputRread(实例化为mRead)与InputDispatcher(mDispatcher),两个类类中实现了一些方法并且在这两个类中分别包含了类成员
InputRreadTHread(实例化mRreadTHread),InputDispatcherTHread(mDispatcherTHread),
InputRreadTHread与InputDispatcherTHread,然后分别实例化了两个对象mRreadTHread与mDispatcherTHread,现在我们来查看InputRreadTHread,在源码中打开文件frameworks/native/services/inputflinger/InputReader.cpp文件,可以看到如下代码:
bool InputReaderThread::threadLoop() {
mReader->loopOnce();
return true;
}
该函数就是InputRreadTHread(实例化mRreadTHread)线程的循环主体,并且在
InputRread中还存在类成员EnventHub meventHub,InputRread是可以接收很多个设备的,如鼠标,触摸屏键盘等等,以后我们会使用meventHub这个成员去监测多个设备。这些东西都太复杂了,所以还实现了一个InputMenager去进行了封装,在编写java的时候,也不想了解那么复杂的过程,所以再次通过NativeInputManager(实例化为im)进行封装,所有的源头都从java开始的,即SystemServer.java开始。
打开SystemServer.java文件,可以找到
traceBeginAndSlog("StartInputManagerService");
inputManager = new InputManagerService(context);
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
我们查看 InputManagerService的构造函数可以找到
mPtr = nativeInit(this, mContext, mHandler.getLooper().getQueue());
看到nativeInit我们就知道,他是去调用C++实现的一个函数,这个C++函数就在com_android_server_input_InputManagerService.cpp中,怎么找到该文件呢?我们搜索nativeInit,找到相似的即可,我们进入该文件,在该文件的nativeInit()函数中:
NativeInputManager* im = new NativeInputManager(contextObj, serviceObj,
继续查看 NativeInputManager的构造函数,可以看到:
sp<EventHub> eventHub = new EventHub();
mInputManager = new InputManager(eventHub, this, this);
对以源码追踪总结如下:
细致的调用过程如下