【Android】Android输入子系统

成鹏致远|2013-10-25

Linux输入子系统回顾1:为什么要回顾linux输入子系统?这个问题后面自然就知道了

1.linux输入子系统设备是基于平台设备机制的,所以先回顾平台设备机制,主要回顾后面用得到的东西

1.申请主设备号2.创建cdev->将cdev挂载到系统设备哈希链表中,同时生成inode节点3.创建device->将device与刚生成的inode节点关联起来,为上层调用提供接口

2.注册输入子系统设备

1.创建一个设备类class2.申请主设备号3.创建cdev->将cdev挂载到系统设备哈希链表中,同时生成inode节点4.创建input_device->将input_device与刚生成的inode节点关联起来,为事件驱动层提供接口

1.注册设备支持输入事件类型(type)->【这个后面会用到】2.注册设备支持输入事件编码3.生成/dev/input_device

      5.当input_device与input_hander匹配成功

1.生成/dev/input*2.上层应用通过主设备号打开/dev/input,通过次设备号打开/dev/input_device

3.输入子系统部分函数

1.read函数->读【后面会用到】2.write函数->写【后面会用到】3.event函数->上报事件【后面会用到】

【提前思考的问题】

1.Android事件处理系统是怎么捕捉到输入事件的?2.Android上层应用是怎么捕捉到输入事件的?3.Android上层应用捕捉到输入事件是怎么响应的?

2.从启动一个Android程序开始

  1.Activity启动流程:onCreate()->onStart()->onResume()->Activity Running

【Q1】:为什么onStart()后不直接Running,要插入一个onResume(),在onResume()中系统作了什么事情?<A1>:在onResume()中,系统会为该Activity创建一个ViewRoot!

【Q2】:这个ViewRoot有什么用?它做了哪些事情?这个后面解答

3.Android事件从输入到输出的整个流程

  1.Activity运行时,用户点击触摸屏操作->{事件产生}    1.点击触摸屏,必然会调用触摸屏驱动->{事件输入}

【Q3】:事件传递过程?->{事件传递}<A3>:以下所有步骤! 1.Android上层应用调用Framework层的JNI本地方法->{事件消息传递到JNI层}

 1.实现JNI层方法,填充本地方法映射表,实现提供Android上层应用的接口 2.生成so动态链接库文件,adb push到/system/lib目录下

 2.JNI本地方法调用HAL层(硬件抽象层:中间件)方法->{事件消息传递到HAL层}

 1.JNI层通过指定ID得到HAL模块实例,然后调用HAL层函数 2.生成so动态链接库文件,adb push到/system/lib/hw目录下

 3.HAL通过系统调用write进入内核层->{事件消息传递到内核}

 1.copy_from_user()取得用户层数据 2.调用input_device.write->{(1.1.2):事件消息传递到驱动层}

—————————————————————————————— 4.输入设备驱动获取事件,调用event函数->{(1.1.3)} 5.事件处理层根据事件类型进行上报->{事件消息传递到内核事件处理层}   1.调用input_event(device,type,code,value)->{【type】后面会用到} 6.到事件处理层时,内核会唤醒read函数->{(1.1.1):事件消息传递到内核层}   1.通过copy_to_user()将内核数据传递到用户空间->{事件消息传递到用户空间}【Q4】:read函数被谁调用的? 7.事件消息被Android的事件处理系统捕捉到->{事件消息传递到Android事件处理系统}

 1.Android事件处理系统将这个消息发送到Android应用层【Q5】:事件消息在Android事件处理系统中是怎么传递的?

 8.Android上层获取事件消息,根据事件类型(3.1.1.5.1:type)响应上层View相应回调函数 9.Android界面UI更新->{事件响应}

4.至此为此,项目中用到的框架知识已经介绍完毕

  1.Android事件处理系统作为一个黑盒子,暂时略过  2.切入到项目解读:电视棒远程遥控器

1.客户端APK

1.数据采集->{此数据必须与Linux输入子系统兼容,这样才能达到欺骗系统的目的}2.数据传递

2.服务端APK->{实现二个虚拟设备(虚拟键盘设备与虚拟鼠标设备}

1.接收数据2.将数据传送到虚拟设备3.虚拟设备上报事件,欺骗系统输入事件发生

5.剖析Android事件处理系统

【Q5】:事件消息在Android事件处理系统中是怎么传递的?<A5>:看看Android的事件处理系统1.紧接着3.1.1.7,事件消息传递到Android事件处理系统2.在Android开机时,系统服务(System Server)会初始化Android窗口管理服务(WindowManagerService)3.WMS服务会初始化InputManager(InputManager是Framework层的一个C++类,负责管理所有的输入事件的捕获与转发)

1.在InputManager构造函数中,会初始化事件处理系统中最重要的三个类(InputReader/InputDispatcher/EventHub)2.然后初始化InputManager(InputManager.initialize()),,产生两个线程(InputReaderThread/InputDispatcherThread,分别负责事件捕获与事件转发)3.InputReaderThread线程工作->{解决问题1:Android事件处理系统是怎么捕捉到输入事件的}

    1.调用InputReader::loopOnce(),在InputReader类中,已经实现looper机制,循环操作      1.调用EventHub::getEvent()函数        1.调用Epoll_wait()函数          1.在Epoll_wait()函数中,会去循环读取所有的/dev/input设备,一旦有事件产生,就会被此函数捕捉到

【Q6】:Android事件处理系统与/dev/input设备是如何关联起来的【A6】:EventHub::Device <—->/dev/input,一一对应关系

 2.当有事件发生时,Android事件处理系统会调用read函数->{系统调用,从内核层拿到事件消息}

【Q4】:read函数被谁调用的?<A4>:read函数是InputReader调用的

      2.将从内核层读取到的事件消息(input_event)保存到RawEvent中

生活若剥去了理想梦想幻想,那生命便只是一堆空架子

【Android】Android输入子系统

相关文章:

你感兴趣的文章:

标签云: