![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Android Input
文章平均质量分 84
介绍Android Input 框架设计
CodeFarmerL
软件架构,硬件建模、硬件IP验证、智能网卡、DPU、Android、NPU、AI、RISC-V、NIC(network_interconnect)
展开
-
Android Input之InputDispatcherThread
InputDispatcherThread为InputDispatcher提供了运行的线程环境,InputDispatcher的核心工作在dispatchOnce()函数中展开。原创 2023-06-19 14:05:45 · 92 阅读 · 0 评论 -
Android Input之InputReader
InputReader的一次线程循环的工作思路总共分为三步:1 从EvenHub中抽取为处理的事件列表。事件分为两类:一类是从设备节点读取的原始输入事件,另一类是输入设备的可用性变化事件,即设备事件2 通过processEventsLocked()对事件进行处理。对于设备事件此函数根据设备的可用性加载或者移除设备对应的配置信息;对于原始输入事件,则在进行转译、封装与加工后将结果存储到mQueueListener中。原创 2023-06-19 14:05:14 · 300 阅读 · 0 评论 -
Android Input 之InputMapper
InputMapper完成了原始输入事件的加工处理。从createDeviceLocked()函数的实现可知,InputMapper的分配依据是设备类型,这个设备类型来自EventHub的Device结构体。而中Device结构体中所保存的设备类型的设置依据来自设备节点中读取的事件位置掩码。在Device结构体中,对应的事件位掩码keyBitmask描述了设备上可以产生的按键事件的集合。按键事件的全集包括字符按键、方向键、控制键、游戏按键等。原创 2023-06-19 14:04:39 · 422 阅读 · 0 评论 -
Android Input 之Input InputDispatcher
新入队的触摸事件的目标是另一个窗口,则将这个新事件保存到mNextUnblockEvent中,随后的dispatchOnceInnerLocked()会将此事件之。EventEntry是输入事件在InputDispatcher中的存在形式,另外,由于InputDispatcher在没有事件可以派发时,会进入休眠。为事件寻找合适的目标窗口。因此在前一个事件的派发。这个程序,然而由于派发事件的串行性,用户所按的HOME键在其之前的输入事件成功派发给无响应的窗口之前无法获得派发的机会,因此在ANR。原创 2023-06-19 14:00:57 · 935 阅读 · 0 评论 -
Android Input之InputDevice
InputDevice是InputReader中用来存储输入设备信息的类。与EventHub中的Device结构体相同,InputDevice也描述了一个输入设备,并以设备Id为键保存在mDevices字典中。InputDevice类与EventHub的Device结构体类似也保存了设备Id、厂商信息以及设备所属的类别。它们之间的一个重要差别是:InputDevice相对于Device结构体多了一个InputMapper列表。原创 2023-06-16 11:07:34 · 1232 阅读 · 0 评论 -
Android Input之InputReaderThread
InputReaderThread为InputReader提供了运行的线程环境,InputReader的核心工作在loopOnce()函数中展开。原创 2023-06-16 11:05:37 · 88 阅读 · 0 评论 -
Android Input之InputChannel
mWindowSession.addToDisplay()最终会调用WMS的addWindow()方法。原创 2023-06-16 11:04:35 · 505 阅读 · 0 评论 -
Android Input之EventHub
当发生设备增删时,addDeviceLocked()与closeDeviceLocked()函数会将相应的设备放入mOpeningDevices和mClosingDe-vices链表中getEvents()函数会根据mOpeningDevices和mClosingDevices两个链表生成对应的DEVICE_ADDED和DEVICE_REMOVED事件,其中后者的优先级高于前者。原创 2023-06-16 11:01:52 · 472 阅读 · 0 评论 -
Android Input之Receive Event
在中,分析过,当InputPublisher将事件以InputMessage写入InputChannel之后,窗口端的Looper会因此被唤醒,并执行NativeInputEventReceiver的handleEvent().原创 2023-06-16 11:02:36 · 461 阅读 · 0 评论 -
Android Input之Original Event Process
loadKeyMapLocked()函数分析.kl文件,每一行都将名称转换为虚拟键值后存储在Key的结构体中,所得到的Key结构体集合以扫描码为键存储在KeyLayoutMap对象中,于是EventHub::mapKey()函数可以根据设备Id找到对应的KeyLayoutMap,进而根据扫描码找到对应的key结体中所保存的虚拟键值(传出参数keycode)以及策略值(传出参数flag),从而完成从扫描码到虚拟键值的映射工作。原创 2023-06-16 11:01:44 · 153 阅读 · 0 评论 -
Android Input 之Send Event
根据publishMotionEvent()和publishKeyEvent()函数,都是将事件封装成InputMessage然后调用InputChannel的sendMessage()函数。不断从派发队列中取出事件,寻找合适的窗口并进行发送的过程,是InputDispatcher线程的主要工作,而事件的发送循环是指InputDispatcher。插入发送事件完成,如果Connection的发送队列从空到有事件,则立刻启动发送循环。中讨论的事件的派发循环不同,派发循环是指InputDispatcher。原创 2023-06-16 11:00:30 · 225 阅读 · 0 评论