快速了解Android6.0系统触摸事件工作原理——InputManagerService

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

简介

Android的事件处理是在Linux基础上完成的。事件的最开始是由硬件监听到,然后通过硬件分到Kernel,Kernel在分到框架层,最后最后框架层把事件分布到应用程序的UI中。下面就以触摸事件为例进行分析。
当有事件发生的时候,硬件首先监听到,然后InputDriver起作用,而框架层的EventHub类一直在InputDriver中读事件;当EventHub类读到事件之后,EventHub就会通过NativeInputManager类首先分发事件到Java层的InputManager,而Java层的InputManager又会把这个事件分发到服务WindowManagerService(WMS),之后又分发到PhoneWindowManager中,最后分发到ViewRootImpl中,ViewRootImpl将事件分发到应用程序的Activity和View中。
具体流程:首先有一个线程在不断的监听屏幕,一旦有触摸事件,就将其事件捕获;其次,还应该存在某种方式可以找到目标窗口,因为可能有多个APP的多个界面为用户可见,必须确定这个事件究竟通知哪个窗口;最后才是目标窗口如何消费事件的问题。
总体来说,Android事件投递(主要以触摸事件为主)的工作流程分为4个部分,如图所示:
这里写图片描述
(1) 采集
即对“硬件源”所产生的原始信息进行收集的过程。它需要Linux内核驱动的支持,Android系统则是通过/dev/input/下的节点来访问当前发生的事件。
(2) 前期处理
上一步采集到的信息为“原始数据”,这其中一部分内容对应程序而言并不是“必须”的,而且格式上也相对烦琐,所以需要先经过前期的提炼和转化。
(3)WMS分配
WindowManagerService是窗口的大主管,同时也是InputEvent的派发者。WMS记录了当前系统中所有窗口的完整状态信息,所以只有它才能判断出应该把事件投递给哪一个具体的应用进程进行处理。其派发策略也因事件类型的不同而有所差异,以触摸消息为例,则要先计算出触摸点落在哪个区域,然后才能传递给相应的窗口单元。
(4)应用程序处理
应用开发人员的工作主要体现在这一部分。经过前面的几个步骤的传递,应用程序端收到的事件已经相对“可理解”“好处理”了,接下来要做的就是充分利用这些事件来实现软件的功能。

1、InputManagerService(IMS)诞生

IMS服务的创建过程是在SystemServer进程启动的时候实例化的,并注册到ServiceManager中去,这个服务对外主要是用来提供一些输入设备的信息的作用。
/frameworks/base/services/java/com/android/server/SystemServer.java

private void startOtherServices() {
    ...
    //新建IMS对象
    inputManager = new InputManagerService(context);
    wm = WindowManagerService.main(context, inputManager,
            mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL,
            !mFirstBoot, mOnlyCore);
    ServiceManager.addService(Context.WINDOW_SERVICE, wm);
    //将IMS发布给ServiceManager,以便其他人可以访问IMS提供的接口
    ServiceManager.addService(Context.INPUT_SERVICE, inputManager);
    mActivityManagerService.setWindowManager(wm);
    //设置向WMS发起回调Callback对象
    inputManager.setWindowManagerCallbacks(wm.getInputMonitor());
    //启动IMS
    inputManager.start();
    ...
}

InputManagerService和WindowManagerService有密切的联系,也是触摸事件处理的时候同时涉及两个服务,InputManagerService主要负责事件(以触摸事件为例)的采集,而WindowManagerService负责找到目标窗口。接下来,继续分析InputManagerService如何完成触摸事件的采集。

2、事件的采集

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

NativeInputManager::NativeInputManager(jobject contextObj,
        jobject serviceObj, const sp<Looper>& looper) :
        mLooper(looper), mInteractive(true) {
    ...
    //NativeInputManager创建了EventHub
    sp<EventHub> eventHub = new EventHub();
    //继续创建Native层的InputManager
    mInputManager = new InputManager(eventHub, this, this);
}

这里的EventHub,可以看作是事件集线器,是利用Linux的inotify和epoll机制,对设备节点增删事件以及可读状态的监听,例如,各种触摸、按钮事件等等,主要面向的是/dev/input目录下的设备节点,比如说/dev/input/event0上的事件就是输入事件,通过EventHub的getEvents就可以监听并获取该事件。在InputManager创建的时候,同时也会再创建一个InputReader对象及InputReaderThread Loop线程,这个loop线程的主要作用就是像一台水泵一样,通过EventHub的getEvents获取Input事件。
/frameworks/native/services/inputflinger/InputManager.cpp

InputManager::InputManager(
        const sp<EventHubInterface>& eventHub,
        const sp<InputReaderPolicyInterface>& readerPolicy,
        const sp<InputDispatcherPolicyInterface>& dispatcherPolicy) {
    //创建InputDispatcher,事件分发执行类    
    mDispatcher = new InputDispatcher(dispatcherPolicy);
    //创建InputReader,事件读取执行类
    mReader = new InputReader(eventHub, readerPolicy, mDispatcher);
    //将InputReader与InputDispatcher建立关联
    initialize();
}
void InputManager::initialize() {
    //创建供InputReader运行的线程InputReaderThread
    mReaderThread = new InputReaderThread(mReader);
    //创建供InputDispatcher运行的线程InputDispatcherThread
    mDispatcherThread = new InputDispatcherThread(mDispatcher);
}

/frameworks/native/services/inputflinger/InputReader.cpp


        
Android Input子系统 - 触控事件处理机制 最后借用业界大牛做的一张图来描述Android系统触控事件处理机制的整体全貌作为总结。 阅读详情

相关推荐

Android WMS深度解析:从窗口管理到车机系统实战

Android系统开发中,窗口管理是构建复杂用户界面的核心技术基础。其核心原理在于通过WindowManagerService(WMS)统一管理系统中的所有窗口(Window),负责窗口的创建、排序(Z-order)、布局以及输入事件分发。这项技术的核心价值在于为应用提供了稳定、高效的显示与交互基础,尤其在多窗口、分屏以及系统级悬浮窗等高级场景中不可或缺。在智能座舱、车机系统等复杂应用场景下,对WMS的深入理解和定制能力直接决定了系统UI的稳定性与表现力。本文聚焦WMS的架构设计与实战,通过剖析窗口类型、

weixin_34337381的博客 392

十分钟了解Android触摸事件原理(InputManagerService

从手接触屏幕到MotionEvent被传送到Activity或者View,中间究竟经历了什么?Android触摸事件到底是怎么来的呢?源头是哪呢?本文就直观的描述一个整个流程,不求甚解,只求了解Android触摸事件模型 触摸事件肯定要先捕获才能传给窗口,因此,首先应该有一个线程在不断的监听屏幕,一旦有触摸事件,就将事件捕获;其次,还应该存在某种手段可以找到目标窗口,因为可能有多个APP的...

weixin_34266504的博客 908

Android Framework车载双屏互动:从架构设计到车规级实现

在智能座舱与物联网领域,设备间的无缝协同已成为核心体验。其技术原理通常基于分布式系统架构,通过中间件实现异构设备间的发现、连接与数据同步,从而将计算与显示能力解耦并重组。这一技术的核心价值在于打破硬件边界,实现资源(如算力、屏幕、传感器)的高效共享与体验的连续性。典型的应用场景包括跨设备应用流转、多屏协同办公以及本文聚焦的智能座舱双屏互动。在车载环境下,该技术面临高可靠性、低延迟与严苛安全性的独特挑战。以Android Framework为基础进行深度定制,构建包含虚拟显示管理、输入事件注入与低延迟编解码传

weixin_30448603的博客 514

Android系统全局触摸事件监听

Android 触摸

weixin_41931477的博客 3515

3【Android 12】InputReader读取事件

1)、InputReader通过EventHub.getEvents读取原始事件RawEvent。2)、InputReader调用InputReader.processEventsLocked函数将原始事件加工为NotifyArgs类型,然后存储到InputReader的QueuedInputListener类型的成员变量mQueuedListener内部的mArgsQueue中进行排队等待分发。

ukynho的博客 1642

Android源码分析 - InputManagerService触摸事件

我们这里以触摸事件为例,梳理流程 - 点击屏幕 - InputManagerService的InputReader线程通过EventHub捕获输入事件 - 经过处理后将消息发给InputDispatcher线程 - InputDispatcher找到触摸的目标窗口,通过InputChannel的 socket将事件发送给客户端的主线程Looper - 主线程Looper通过socket的fd,找到对应的窗口,将事件交给这个window - 具体window下的View处理具体的事件。

深海流浪汉 1506

linux屏幕触碰事件,从你触摸屏幕开始分析android触摸事件分发

WMS而这里的复杂步骤涉及到frameWork层,我们就从WMS开始吧,先是有SystemServer启动的WMS。SystemServer.java的startOtherServices()wm = WindowManagerService.main(context, inputManager,mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LE...

weixin_31165655的博客 269

Android 事件捕捉和处理流程

1.    InputManagerService(IMS) 1.1     IMS初始化           在系统启动的时候,SystemServer会启动窗口管理服务WindowManagerService(WMS),同时启动InputManagerService(IMS) ,并且把IMS实例传入WMS之中,以便后面调用。然后调用start()方法开启工作线程, WMS在启动的时候

QQ18334373taikongyi的专栏 1030

深入解析Android事件分发机制:从原理到滑动冲突实战

Android应用开发中,UI交互的流畅性直接关系到用户体验,其底层核心是事件分发机制。这一机制基于责任链模式,通过`dispatchTouchEvent`、`onInterceptTouchEvent`和`onTouchEvent`个核心方法,将用户的触摸事件在View树中层层传递与处理。理解其原理对于实现复杂的自定义控件和优化交互至关重要。在实际工程实践中,嵌套滑动场景下的滑动冲突是常见挑战,开发者需要掌握根据滑动距离与方向判断拦截时机的技巧,或运用更现代的NestedScrolling接口进行协作

weixin_33860553的博客 409

Wayland协议与Weston实现深度解析:从Android图形架构的视角看Linux显示的未来

本文深入解析Wayland协议与Weston实现,从Android图形架构的视角探讨Linux显示的未来。通过对比Android图形栈与Wayland的设计差异,揭示Weston的模块化架构和高效通信模型,特别关注其在车载系统和嵌入式设备中的优化实践与应用优势。

weixin_30580341的博客 345

Android事件注入:从adb input到无障碍服务的自动化测试实战

在移动应用自动化测试与辅助功能开发中,模拟用户操作是核心需求。其基本原理是通过程序向系统注入输入事件,替代真实硬件交互。从技术价值看,这不仅是自动化测试脚本稳定执行的基础,更是实现无障碍服务、远程控制等高级功能的关键。在Android生态中,事件注入主要通过系统服务层实现,涉及InputManagerService与权限控制机制。具体到应用场景,开发者常从adb shell input命令入门,但其存在事件分发层级与坐标适配等局限。为突破这些限制,需深入理解INJECT_EVENTS权限路径与无障碍服务框架

weixin_34268169的博客 491

2023 Android面试核心南:从JVM到Framework,性能优化与架构设计全解析

在移动开发领域,深入理解Java虚拟机(JVM)内存模型与垃圾回收机制是构建高性能应用的基础。JVM通过堆、栈、方法区等内存区域的协同管理,以及分代收集等GC算法,保障了应用的稳定运行。在Android平台上,ART虚拟机针对移动设备特性进行了深度优化,其并发复制GC等策略有效减少了停顿时间。掌握这些底层原理,对于解决内存泄漏、优化应用性能具有重要价值。特别是在Android开发中,对Binder IPC机制和事件分发流程的透彻理解,能帮助开发者构建响应迅速、体验流畅的应用。本南聚焦于Android面试中

weixin_34319111的博客 391

面试题kkk

这篇文章摘要主要涵盖了Android开发中的核心知识点和技术难点,包括数据结构、Java与Kotlin语言特性、多线程与并发、内存管理、安卓组件与UI、IPC通信、数据库、多媒体处理、设计模式、性能优化、跨端开发等多个方面。文章详细解析了常见数据结构的使用与实现、JVM机制、内存泄漏分析与解决方案、Activity生命周期、事件分发机制、Handler原理、音视频处理、设计模式应用等核心内容,并提供了实际项目中的技术卡点与解决方案。此外,还涉及了性能优化策略、跨端开发差异、技术方案设计思路以及Git常用命令

mix39的博客 867

十分钟让你了解Android触摸事件原理(InputManagerService

由于文章篇幅原因,我只把面试题列了出来,详细的答案,我整理成了一份PDF文档,这份文档还包括了还有高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 ,帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习。《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!由于文章篇幅原因,我只把面试题列了出来,详细的答案,我整理成了一份PDF文档,这份文档还包括了还有高级架构技术进阶脑图、Android开发面试专题资料。

2401_84121627的博客 1258

input InputDispatcher::findTouchedWindowTargetsLocked查看

在input事件分发的时候,会调用到 int32_t InputDispatcher::findTouchedWindowTargetsLocked 这个地方写的比较复杂,在点击后,滑动,可以查看log发现,这个方法会不断的被调用。 一些点击事件被drop,也是这里处理的, 点击的时候,newGesture 为true 1204 bool newGesture = (maskedAction == AMOTION_EVENT_ACTION_DOWN 1205 .

aaajj的专栏 1081

frameworks 之 触摸事件窗口查找

frameworks 之 触摸事件窗口查找

u011410770的博客 1164

Android12特性“不受信任的触摸事件被屏蔽”其他细节

Android12特性“不受信任的触摸事件被屏蔽”其他细节 android12-release Android 12关于Input触摸事件的行为变更 这篇介绍了input实际的拦截findTouchedWindowTargetsLocked “不受信任的触摸事件被屏蔽”相关属性 mBlockUntrustedTouchesMode 种属性值:DISABLED不拦截;PERMISSIVE拦截判断最后没拦截;BLOCK拦截 frameworks\base\core\java\android\hardwar

许浑的博客 1万+

Android Input系统(1) Input事件的产生与传递

这篇博客介绍了Android系统中的Input系统,它是负责处理用户输入操作的核心组件。该系统从各种输入设备获取原始输入事件,并将其转换为Android应用可以理解和消费的KeyEvent或MotionEvent对象。博客详细解释了Input系统的角色和重要性,以及它的主要组成部分,包括InputReader、InputDispatcher等。还介绍了输入事件的来源,包括硬件设备和软件模拟,以及不同类型的输入事件,如按键事件和触摸事件

我其实什么都不会 3247
上一篇: Android6.0输入系统之EventHub源码分析
下一篇: Android中使用Fragment与RadioGroup实现页面布局切换
猫哥,你好
博客等级 码龄8年 59粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值