
Android Input子系统
文章平均质量分 95
DJLZPP
不积跬步无以至千里,不积小流无以成江海
展开
-
AndroidR Input子系统(10)View的事件分发机制
上一篇文章我们说到当输入事件从InputDispatcher通过server端InputChannel将输入事件发送给应用程序的client端,其实最终事件被发送到了java层ViewRootImpl中,此类定义了多种类型的InputStage,以责任链模式进行处理分发输入事件。final class SyntheticInputStage extends InputStage{}final class ViewPostImeInputStage extends InputStage{}final c原创 2021-04-24 17:33:49 · 1189 阅读 · 0 评论 -
AndroidR Input子系统(9)UI线程对Input事件的分发与结束处理
上一篇文章分析到应用程序和InputDispatcher分别属于两个不同进程,他们之间的连接需要依靠InputChannel(内部通过一对socket实现)来建立,连接建立之后,InputDispatcher就可以将Input事件发送到应用程序的UI线程,而应用程序处理完事件之后也可以通过InputChannel通知到InputDispatcher。整个过程总结如下:首先当一个APP启动时,会将自己的Window添加到WMS,并传递一个空InputChannel过去。WMS端,通过openInput原创 2021-01-26 14:18:37 · 2303 阅读 · 3 评论 -
AndroidR Input子系统(8)InputChannel注册,建立APP和InputDispatcher的连接
上一篇文章分析到InputDispatcher将Input事件做了一些列处理之后,会将事件发送到APP进程,InputDispatcher和APP属于两个不同进程,他们之间是如何通信的呢?答案就是InputChannel,我们看看InputChannel的注释:/** * An input channel specifies the file descriptors used to send input events to * a window in another process. It is P原创 2020-12-20 16:48:07 · 2993 阅读 · 3 评论 -
AndroidR Input子系统(7)InputDispatcher线程分发输入事件
我们在AndroidR Input子系统(3)InputReader线程中分析了EventHub读取了输入系统的原始事件之后会将其转换为NotifyKeyArgs(对于按键事件来说),接着会调用InputDispatcher的notifyKey函数将NotifyKeyArgs发送到InputDispatcher线程做进一步处理。我们先来简单看看NotifyKeyArgs这个结构体,它是在KeyboardInputMapper的processKey函数中构造的:NotifyKeyArgs结构体void原创 2020-12-06 17:54:19 · 2545 阅读 · 6 评论 -
AndroidR Input子系统(6)解析“.kcm“文件
上一篇文章分析了".kl"文件的解析,".kl"文件的作用是将linux scancode转换为Android keycode,相比之下".kcm"文件的解析要复杂一些。“.kcm"文件意为按键字符映射文件,作用是将 Android按键代码与修饰符的组合映射到 Unicode字符,注意这里提到组合,意思是它可以提供组合按键功能,其实就目前的Android手机来说,基本都是全触摸屏,除了外接键盘,否则已经很少会用到”.kcm"文件了,但我们出于学习的目的还是来分析下其内部解析原理,和".kl"文件一样,系统原创 2020-11-22 18:21:08 · 2033 阅读 · 5 评论 -
AndroidR Input子系统(5)解析“.kl“文件
上一篇文章看了Input系统首次启动时会扫描/dev/input目录,并且会通过函数loadKeyLayout和loadKeyCharacterMap加载和解析".kl",".kcm"文件,这两个文件的解析规则对应熟悉Input系统还是比较重要的,上一篇文章限于篇幅只看了加载过程,本篇我们就来分析一下其解析过程,还是先将loadKeyLayout函数贴出来看看:KeyMap::loadKeyLayoutstatus_t KeyMap::loadKeyLayout(const InputDeviceIde原创 2020-11-15 13:24:50 · 2182 阅读 · 2 评论 -
AndroidR Input子系统(4)扫描/dev/input目录
上一篇文章分析了InputReader线程对Input事件的处理流程,主要分为了三大步骤:EventHub通过INotify与Epoll监听/dev/input下的事件,在读取到事件之后放入mEventBuffer,此步骤将input_event转换为了RawEvent。拿到原始事件RawEvent之后调用processEventsLocked对事件进行加工,不同事件类型有不同的加工厂(InputMapper),此步骤将RawEvent转换为了NotifyKeyArgs。通过QueuedListen原创 2020-11-08 16:26:05 · 2879 阅读 · 2 评论 -
AndroidR Input子系统(3)InputReader线程读取输入事件
上一篇文章分析了Input系统的启动之后会通过INotify与Epoll监听dev/input/目录下文件的创建和删除,并且启动两个线程InputReader和InputDispatcher,InputReader启动之后调用其loopOnce()函数,InputDispatcher启动之后调用其dispatchOnce函数,它们都是死循环的调用,这篇文章就先来看看InputReader的loopOnce()函数://InputReader.cppvoid InputReader::loopOnce()原创 2020-11-03 19:32:02 · 2069 阅读 · 5 评论 -
AndroidR Input子系统(2)Input子系统的启动
分析Input子系统的启动主要是看InputManagerService的启动,InputManagerService是java层的一个系统服务,继承IInputManager.Stub,作为binder服务端,在SystemServer中启动:private void startOtherServices(@NonNull TimingsTraceAndSlog t) { ...... t.traceBegin("StartInputManagerServ原创 2020-10-18 14:20:50 · 2190 阅读 · 8 评论 -
AndroidR Input子系统(1)INotify与Epoll机制
之前写过几篇Input系统相关的分析,但是比较零散,本篇来时准备基于Android 11代码看一下Android Input子系统的大概流程,首先来学习下Linux下的INotify与Epoll机制,这两个机制主要是对Input子系统下的文件节点的增删和文件节点发生的事件进行监听。INotify机制INotify是Linux提供给用户态监听内核文件系统变化的机制,可以监听文件/目录的增删等。INotify的用法很简单,首先需要调用如下代码创建一个文件描述符:int inotifyfd = inoti原创 2020-09-28 15:09:15 · 2156 阅读 · 2 评论