- 将Java层的Context和InputManagerService转换为native层的Context和InputManagerService存储在mContextObj和mServiceObj中
- 初始化变量
- 创建EventHub
- 创建InputManager
- com_android_server_input_InputManagerService.cpp
- NativeInputManager::NativeInputManager(jobject contextObj,
- jobject serviceObj, const sp<Looper>& looper) :
- mLooper(looper), mInteractive(true) {
- JNIEnv* env = jniEnv();
- mContextObj = env->NewGlobalRef(contextObj);
- mServiceObj = env->NewGlobalRef(serviceObj);
- { AutoMutex _l(mLock);
- mLocked.systemUiVisibility = ASYSTEM_UI_VISIBILITY_STATUS_BAR_VISIBLE;
- mLocked.pointerSpeed = 0;
- mLocked.pointerGesturesEnabled = true;
- mLocked.showTouches = false;
- }
- mInteractive = true;
- sp<EventHub> eventHub = new EventHub();
- mInputManager = new InputManager(eventHub, this, this);
- }
EventHub
看到这里很多人就会想,EventHub是什么?取英语释义来看,它的意思是事宜枢纽。我们在文┞仿开首的时刻也提到过,Input体系的事沂攀来源竽暌冠驱动/内核,那么我们可以猜测EventHub是处理来自驱动/内核的元事宜的枢纽。接下来就在源码中验证我们的设法主意吧。
EventHub的创建过程中做了以下工作:
- 创建mEpollFd用于监听是否稀有据(有无事宜)可读
- 创建mINotifyFd将它注册到DEVICE_PATH(这里路径就是/dev/input)节点,并将它交给内核用于监听该设备节点的增删数据事宜。那么只要稀有据增删的事宜到来,epoll_wait()就会返回,使得EventHub能收到来自体系的通知,并获取事宜的具体信息
- 调用epoll_ctl函数将mEpollFd和mINotifyFd注册到epoll中
- 定义int wakeFd[2]作为事宜传输管道的读写两端,并将读端住册到epoll中让mEpollFd监听
- bool InputReaderThread::threadLoop() {
- mReader->loopOnce(); return true;
- }void InputReader::loopOnce() {
- ……
- size_t count = mEventHub->getEvents(timeoutMillis, mEventBuffer, EVENT_BUFFER_SIZE);
- { // acquire lock
- AutoMutex _l(mLock);
- mReaderIsAliveCondition.broadcast(); if (count) {
- processEventsLocked(mEventBuffer, count);
- }
- …… if (oldGeneration != mGeneration) {
推荐阅读
51CTO诚邀您9月23号和秒拍/国美/美团元专家一路聊智能CDN的优化之路,抓紧时光哦! 以前几个月,安然界见证了多起重大年夜云数据泄漏事宜。6月份1.97亿美国选平易近的泄漏事宜,震动全球。>>>详细阅读
本文标题:Android Input子系统:Input进程的创建,监听线程的启动
地址:http://www.17bianji.com/lsqh/37309.html
1/2 1