2.inputReader初始化和工作流程
2021-02-04 15:57:48 3 举报
inputReader初始化和工作流程
作者其他创作
大纲/内容
唤醒InputDispatcher线程,下一步就是dispatcher的分发流程了
loopOnce
closeAllDevicesLocked
epoll_create
scanDevicesLocked
getListener()->notifyKey
创建NotifyKeyArgs 对象,记录时间,deviceId,按键操作,按键状态,keyCode等信息
mClosingDevices
EventHub初始化过程
设备增加/移除event处理完成,现在处理传递的event
上报设备扫描完成event
inotify_add_watch
mapKey
device->process
如果有读取到足够的数据,就会回去了,没有读取到数据则会一直等待
interceptKeyBeforeQueueing
InputReader处理event流程
EventHub.cpp
底层有事件了唤醒 wake_up_interruptible
InputReader.cpp
read
processEventsForDeviceLocked
notifyKey
getDeviceIdentifier
通过设备ID获取设备身份信息
创建pipe,并将read端加入epoll监听
设备变动event
转换完成返回
加入队列前的拦截动作
enqueueInboundEventLocked
InputListener.cpp
输入监听对象,这里的监听则是创建的inputDispatcher
优先报告所有的设备增加/移除event
将扫描码转换成KeyCode的地方
InputDispatcher.cpp
processEventsLocked
主要作用就是将ScanCode转换成keycode
如果有设备移除event,优先报告
NotifyKeyArgs args
createDeviceLocked
如果有设备打开event,优先上报
notify(mInnerListener)
[InputManager.cpp] new InputReader
addDeviceLocked
调用read来读取监听的pipe和INotify
KeyboardInputMapper::process
mNeedToSendFinishedDeviceScan
getListener就是获取的mQueuedListener,调用其notifyKey方法,其实就是创建NotifyKeyArgs并将其压入栈顶
processKey
mLooper->wake
event都读取完成了,现在是调用epoll去监听
addDeviceLockedremoveDeviceLockedhandleConfigurationChangedLocked
[InputListener.cpp]NotifyKeyArgs::notify
new EventHub
调用notify方法,其中mInnerListener为初始化时传入的InputDispatcher
InputReader初始化过程
进行数据的处理,根据事件类型的处理,分为普通event和设备增加/移除event
KeyCharacterMap.cpp
监听/dev/input目录
根据mNeedToScanDevices来决定是否执行,执行该方法会调用所有device的open方法
根据mNeedToReopenDevices判断是否需要执行,该方法作用为执行所有device的close的方法,执行流程会将mNeedToScanDevices置为true
mOpeningDevices
epoll_wait
new QueuedInputListener
epoll_ctl将mINotifyFd加入epoll监听
getDeviceLocked
预处理完成后,执行flush将数据推送到InputDispatcher
getEvents
判断是down还是up,如果是down则继续,如果是up则移除之前记录的down
以设备增加为例说明
findKeyDown
创建相应的设备mapper并加入到mapper中
将keyEntry加入队列
QueuedInputListener::flush
其他event,以keyevent为例
epoll_ctl
初始化keyevent
读取到足够数据
KeyEvent.initialize
epoll_create创建epoll来监听
device->addMapper
0 条评论
回复 删除
下一页