您当前的位置: 首页 > 
  • 3浏览

    0关注

    417博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

第六章:输入系统(5)-Reader_Dispatcher线程启动分析

江南才尽,年少无知! 发布时间:2019-02-22 16:31:24 ,浏览量:3

在前面的的小节提到过,输入子系统框架中,在应用层会创建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 = new EventHub();
	mInputManager = new InputManager(eventHub, this, this);

对以源码追踪总结如下: 在这里插入图片描述 细致的调用过程如下 在这里插入图片描述

关注
打赏
1592542134
查看更多评论
立即登录/注册

微信扫码登录

0.0347s