android input子系统--InputReader EventHub::getevents之mNeedToReopenDevices变量详细分析

原创 2018年04月14日 22:04:43
5.2.1 如果mNeedToReopenDevices=true 那么条件成立,先将mNeedToReopenDevices设置为false,然后

            closeAllDevicesLocked,将mNeedToScanDevices设置为true

    5.2.2 mNeedToReopenDevices 此变量设置的地方,通过si(source insight)查找整个android源码目录,发现在以下地方使用到

            mNeedToReopenDevices变量,第一行为EventHub::EventHub构造方法,将其设置为false;第二行第三行为上面的条件判断

            第四行为5.2.2.3介绍的EventHub::requestReopenDevices方法,将其设置为true;第五行为此变量的定义

            

            5.2.2.1  在EventHub::EventHub的构造方法中将其设置为false

            5.2.2.2 在EventHub:getEvents方法中依据此变量的值判断是否需要ReopenDevices

            5.2.2.3  在EventHub::requestReopenDevices方法中将其设置为true

                


           1)那么又是在什么情况下谁调用此方法将mNeedToReopenDevices此变量设置为true呢?

               

                通过si查找到在InputReader.cpp的 InputReader::refreshConfgurationLocked方法中调用到了

                EventHub::requestReopenDevices方法,其他的第1/2/3/4行是requestReopenDevices方法的声明和定义,先忽略

                这里需要主要该方法的参数changes,根据changes参数来选择是否调用请求重新打开设备

                                   

                    2)那么又是谁在什么情况下调用到的InputReader::refreshConfgurationLocked方法呢?

               

                    由上图查找结果可知:InputReader::refreshConfgurationLocked方法在InputReader::InputReader构造方法以及

                    InputReader::loopOnce方法中调用,如下图 :

                            

                    

                所以最终在InputReader::InputReader构造方法中以及  InputReader::loopOnce方法中将mNeedToReopenDevices设置,

        接下来,针对这两中情况分别进行说明.

a):InputReader::InputReader构造方法调用refreshConfgurationLocked(0)

    refreshConfgurationLocked(0)      ->    InputReader::refreshConfgurationLocked(0) ,由于参数changes = 0,所以此处不会调用

    

b) InputReader::loopOnce 中调用refreshConfgurationLocked(changes)

              

            由于此处changes = mConfigurationChangesToRefresh变量的值,所以再跟踪mConfigurationChangesToRefresh的调用

            过程,如下图

            

            第一行,在InputReader构造方法中,将mConfigurationChangesToRefresh初始化为0

            

            第二行第三行为loopOnce中的changes赋值,以及赋值后初始化为0的操作,此处是我们要获得结果的地方

             

              第四行第五行为 InpuReader::requestRefreshConfiguration中的操作,所以此处是进行mConfigurationChangesToRefresh

                设置的地方(因为第一行为0,第二三行的地方,我们要用mConfigurationChangesToRefresh值)

                   

                所以在InputReader::requestRefreshConfiguration方法中根据changes的值决定是否设置

                mConfigurationChangesToRefresh,那么是谁调用的InputReader::requestRefreshConfiguration方法呢?

                                由上图可知:

                1.NativeInputManager::setDisplayViewport

                2.NativeInputManager::setInputWindows

                3.NativeInputManager::setPointerSpeed

                4.NativeInputManager::setShowTouches

                5.nativeReloadKeyboardLayouts

                6.nativeReloadDeviceAliasess

此处暂先不分析,所以以上6中方法都会导致mConfigurationChangesToRefresh的值发生变化,即以上6个方法都会调用到

InputReader::requestRefreshConfiguration(changes),并传入一个参数,此参数是一个enum枚举类型,如下


   所以,以上六种事件只要调用到InputReader::requestRefreshConfiguration(changes),此时changes就不为0,

那么changes条件就会成立, needWake = !mConfigurationChangesToRefresh,翻转

mConfigurationChangesToRefresh | = changes ,可以根据mConfigurationChangesToRefresh得知是哪种事件发生(枚举值不同)

到此,如果有以上六种事件中的某种事件发生,那么mConfigurationChangesToRefresh就不为0,

那么InputReader::loopOnce 中 changes =  mConfigurationChangesToRefresh也不为0   

    

但是在第一次系统刚启动时,没有事件发生,所以changes = mConfigurationChangesToRefresh = 0,

InputReader构造方法中,将mConfigurationChangesToRefresh初始化为0,所以changes = 0,不会调用refreshConfigurationLocked

综上所述:在系统初始化阶段,不会去调用EventHub::requestReopenDevices,那么mNeedToReopenDevices=false,构造方法中

初始化为false






android input子系统--InputReader EventHub::getevents之mNeedToScanDevices变量详细分析

EventHub::getevents方法中,mNeedToScanDevices变量的调用过程详细分析        ...        if (mNeedToScanDevices) {    ...
  • qq_30025621
  • qq_30025621
  • 2018-04-14 23:30:12
  • 5

Android 输入事件系统之 EventHub 和 Input Lib(事件解析库)

从 Android 事件输入系统整体框架 一文可知Input Libs是一个事件解析库,完成事件解析、keycode转换,设备配置信息加载。EventHub  枚举当前系统设备,根据不同的输入设备...
  • tww85
  • tww85
  • 2016-09-22 16:33:08
  • 966

android input子系统--InputReader EventHub::getevents之mClosingDevices调用过程详细分析

EventHub::getEvents中:分析mClosingDevices在android系统中的调用过程        // Report any devices that had last be...
  • qq_30025621
  • qq_30025621
  • 2018-04-14 23:07:58
  • 4

Android输入子系统之InputReader读取键盘消息过程分析

InputReader读取键盘消息过程分析在Android输入子系统之启动过程分析中,InputManagerService启动之后,会调用start函数,之后调用native层的nativeStar...
  • chenweiaiyanyan
  • chenweiaiyanyan
  • 2017-06-09 10:17:29
  • 461

Android 输入系统之EventHub篇

做Android系统定制两年多了,受到别人启发,将自己的学习工作经历整理成博客,供以后重温,好了废话不多说,这段时间研究了下Android的输入系统,深深的感叹Android系统的庞大。。。。。。 ...
  • u010122827
  • u010122827
  • 2015-11-09 15:12:08
  • 3424

Android Framework------之Input子系统

http://www.cnblogs.com/haiming/p/3318614.html 下面这是基于Android4.2代码的关于Input子系统的笔记。在这篇笔记中,只涉及Android相...
  • wangkaiblog
  • wangkaiblog
  • 2013-09-27 11:25:05
  • 11231

Android input子系统之InputReader获取输入事件详细分析--EventHub->getevents

此文章只分析EventHub获取输入事件的getevents函数的具体实现首先在EventHub的构造函数中,将以下变量进行初始化,以下初始化变量在getevents中会用到        mBuil...
  • qq_30025621
  • qq_30025621
  • 2018-04-14 23:47:41
  • 8

Android 输入系统之InputReader篇

Android input系列文章
  • u010122827
  • u010122827
  • 2015-11-11 17:45:28
  • 2536

Android 的 KeyEvent : 從 EventHub 到 PhoneWindowManager

最近追蹤了一下 Android 4.3 的 source,並且追蹤了 KeyEvent 一路從 EventHub.cpp 到 PhoneWondowManager.java 的流程 這邊順便記錄一下...
  • whut_fn
  • whut_fn
  • 2015-03-12 10:44:33
  • 421

Linux/Android——Input系统之InputReader (七)

在前文 Linux/Android——Input系统之frameworks层InputManagerService (六) 这里介绍了android层input服务的启动,其中启动了一个读取来自底...
  • jscese
  • jscese
  • 2015-01-16 18:13:19
  • 7250
收藏助手
不良信息举报
您举报文章:android input子系统--InputReader EventHub::getevents之mNeedToReopenDevices变量详细分析
举报原因:
原因补充:

(最多只允许输入30个字)