Android input 原理分析_总序

本文详细阐述了Android系统中键盘按键事件的管理和分发机制,包括创建主线、运行主线、event主线及其关键模块组成,如Java层InputManagerService、JNI层NativeInputManager和native层InputManager等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

请支持原创~~

基于版本:Android R

源码

frameworks/native/servcies/inputflinger/

产生:

  • libinputflinger.so
  • libinputflinger_base.so
  • libinputreader.so

frameworks/native/libs/input/

产生:

  • libinput.so

frameworks/base/services/java/com/android/server/SystemServer.java

frameworks/base/services/core/java/com/android/server/input/InputManagerService.java

frameworks/base/services/core/jni/com_android_server_input_InputManagerService.cpp

概述

在Android系统中,键盘按键事件是由WindowManagerService服务来管理的,然后再以消息的形式来分发给应用程序处理,不过和普通消息不一样,它是由硬件中断触发的。

在系统启动的时候,SystemServer会启动窗口管理服务WindowManagerService,WindowManagerService在启动的时候就会通过系统输入管理器InputManager来总负责监控键盘消息。这些键盘消息一般都是分发给当前激活的Activity窗口来处理的,因此,当前激活的Activity窗口在创建的时候,会到WindowManagerService中去注册一个接收键盘消息的通道,表明它要处理键盘消息,而当InputManager监控到有键盘消息时,就会分给给它处理。当当前激活的Activity窗口不再处于激活状态时,它也会到WindowManagerService中去反注册之前的键盘消息接收通道,这样,InputManager就不会再把键盘消息分发给它来处理。

框架

框架有三条主线,分别是黄色、蓝色、红色:

  • 黄色为创建主线,从SystemServer 开始启动input service,并创建native 实例,最终创建dispatcher thread、reader thread;
  • 蓝色为运行主线,SystemServer 会调用 IMS.start(),用以启动native 下的dispatcher thread 和reader thread;
  • 红色为event主线,InputReaderThread 负责通过EventHub 监听event,EventHub通过epoll 机制监听驱动收到的input 消息,并通过getEvent 接口返回给InputReaderThread,进而notify 给InputDispatcher,将event 存入InputDispatcher 的mInboundQueue 后,InputDispatcher 会唤醒dispatcher thread,最终真正分发到各个App;

模块组成:

  • Java 层InputManagerService 跟WMS 交互,WMS 记录所有窗口信息,并同步更新到 IMS, 为InputDispatcher 正确派发event 到ViewRootImpl 提供保障;
  • JNI 层 NativeInputManager 是Java 与 native 交互的重要转接点,这里是 inputflinger 创建起点,也是InputManager 实例创建、存放点;
  • native 层 InputManager 是inputflinger 的server 端,用以注册和反注册 InputChannel,也是InputReader 和InputDispatcher 启动的起点;
  • native 层InputReader 负责从EventHub 取出事件并处理,再交给InputDispatcher;
  • native 层InputDispatcher 接收来自InputReader 的输入事件,并记录 WMS 的窗口信息,用于派发事件到合适的窗口;

当然这些空口说也没什么效果,还是需要结合source code 来分析,但是这个过程比较长,所以,将其细分为:

Android input 原理分析_总序

Android input 原理分析(一) _ input 启动

Android input 原理分析(二) _ EventHub

Android input 原理分析(三) _ scanCode与keyCode映射

Android input 原理分析(四) _ input 分发

Andorid input 原理分析(五) _ input 命令

Android input 原理分析(六) _ input 上层分发流程

Android input 原理分析(七)_ input ANR

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

私房菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值