Android输入事件传递流程系统源码级解析

news/2025/2/23 20:03:49

 


1. 硬件层到Linux内核
  • 设备节点:触摸事件由内核驱动捕获,写入/dev/input/eventX
  • 关键结构体input_event(包含时间戳、类型、代码、值)。

2. Native层处理(system_server进程)
2.1 EventHub
  • 路径frameworks/native/services/inputflinger/EventHub.cpp
  • 职责:通过epoll监听设备节点,读取原始事件。
  • 关键函数
     

    CPP

    size_t EventHub::getEvents(int timeoutMillis, RawEvent* buffer, size_t bufferSize);

2.2 InputReader
  • 路径frameworks/native/services/inputflinger/InputReader.cpp
  • 职责:将原始事件转换为KeyEvent/MotionEvent
  • 线程模型InputReaderThread循环调用loopOnce()
  • 关键类
    • InputDevice:设备抽象。
    • TouchInputMapper:处理触摸事件映射。
     

    CPP

    void InputReader::loopOnce();

2.3 InputDispatcher
  • 路径frameworks/native/services/inputflinger/InputDispatcher.cpp
  • 职责:事件分发策略管理,通过InputChannel发送事件到应用。
  • 关键函数
     

    CPP

    void InputDispatcher::dispatchOnce(); // 主分发循环 status_t InputDispatcher::dispatchMotion(...); // 处理MotionEvent分发

  • 数据传递InputEvent封装为InputMessage,通过共享内存或Socket传递。
2.4 InputChannel与跨进程通信
  • IPC机制:基于Socket或共享内存(ashmem)。
  • 关键类
    • InputChannel:封装通信通道(服务端/客户端各一个Socket)。
    • InputWindowHandle:关联窗口焦点信息。
  • 注册流程:应用通过ViewRootImpl.addToDisplay()注册窗口时,通过WindowManagerService创建InputChannel

3. 应用进程处理(App进程)
3.1 NativeInputEventReceiver
  • 路径frameworks/base/core/jni/android_view_InputEventReceiver.cpp
  • 职责:通过Looper监听InputChannel,接收事件。
  • 关键函数
     

    CPP

    status_t NativeInputEventReceiver::consumeEvents(...); // JNI层事件接收

3.2 ViewRootImpl.WindowInputEventReceiver
  • 路径frameworks/base/core/java/android/view/ViewRootImpl.java
  • 职责:将事件传递给Java层。
  • 关键代码
     

    JAVA

    final class WindowInputEventReceiver extends InputEventReceiver { @Override public void onInputEvent(InputEvent event) { enqueueInputEvent(event, this, 0, true); } }


4. Java层事件分发
4.1 ViewRootImpl分发入口
  • 关键函数
     

    JAVA

    void deliverInputEvent(InputEvent event) { // 调用DecorView的dispatchInputEvent mView.dispatchPointerEvent(event); }

4.2 Activity/View树分发
  • 流程
    1. ActivitydispatchTouchEvent() → Window.superDispatchTouchEvent()
    2. DecorViewdispatchTouchEvent() → Activity.dispatchTouchEvent()
    3. ViewGrouponInterceptTouchEvent() → dispatchTouchEventToChildren()
    4. ViewonTouchEvent()处理事件。
  • 关键方法
     

    JAVA

    // ViewGroup public boolean dispatchTouchEvent(MotionEvent ev); public boolean onInterceptTouchEvent(MotionEvent ev); // View public boolean onTouchEvent(MotionEvent event);

4.3 MotionEvent对象复用
  • 优化机制:通过MotionEvent.obtain()复用对象,减少GC压力。

5. 关键数据结构
  • InputEvent:基类,包含设备ID、事件时间。
  • MotionEvent:存储触摸坐标、动作(ACTION_DOWN/ACTION_MOVE等)。
  • InputMessage:跨进程传输的二进制结构,包含事件类型、窗口令牌等。

6. 超时与ANR机制
  • InputDispatcher:等待应用finishInputEvent()确认处理,超时(默认5秒)触发ANR。
  • 监控逻辑:在InputDispatcher::dispatchEntryLocked()中设置超时检查。


http://www.niftyadmin.cn/n/5863732.html

相关文章

DeepSeek:AI商业化的新引擎与未来蓝图

摘要 在人工智能迅猛发展的浪潮中,DeepSeek以其卓越的技术实力和高超的商业化能力崭露头角。作为一款现象级AI产品,它不仅在算法性能上位居行业前列,还通过灵活的定制解决方案渗透到金融、医疗、零售等多个领域。DeepSeek以创新的商业模式和场…

Python爬虫实战:获取腾牛网高清壁纸图片

注意:以下内容仅供技术研究,请遵守目标网站的robots.txt规定,控制请求频率避免对目标服务器造成过大压力! 1. 核心思路 要使用爬虫技术从 www.qqtn.com 网站获取壁纸图片,核心思路是模拟浏览器向目标网站发送请求,获取网页的 HTML 内容,然后对其进行解析以提取图片链接…

华为动态路由-OSPF-综合案例

华为动态路由-OSPF-综合案例 一、OSPF简介 1、OSPF概述 OSPF是一种开放式的、基于链路状态的内部网关协议(IGP),用于在自治系统内部进行路由选择和通信。 OSPF是互联网工程任务组(IETF)定义的标准之一,被…

大白话React第一章基础入门

大白话React第一章基础入门 1. 环境准备 咱要学 React 开发,就好比要开一家蛋糕店,首先得把开店要用的工具和场地准备好。 安装 Node.js 和 npm:Node.js 就像是蛋糕店的烤箱,有了它,咱们写的代码才能像蛋糕一样“烤…

uniapp微信小程序PC端选择文件(无法使用wx.chooseMessageFile问题)

客户要求通过小程序选择excel文件并读取数据导入,查了一下资料,微信小程序选择文件是调用API【wx.chooseMessageFile】,知道了之后马上开干,没一会做好了,却发现在电脑端微信小程序上面调用此API没有反应,一…

在摩尔线程 MTT S80 上使用 Ollama 进行 DeepSeek R1 蒸馏版模型推理

什么是 Ollama?​ Ollama 是一个工具和平台,专注于简化和优化大语言模型( LLM )的管理和部署。它主要提供了一种方便的方式,在本地或边缘设备上运行、管理和调用大型语言模型,同时通过其特有的 Docker 集成和 API 接…

Kubernetes 中服务注册机制解析:自动化与灵活性的背后

目录 1. 引言:Kubernetes 中的服务注册与发现2. Kubernetes 中的服务注册与发现2.1 Kubernetes Service3. 服务注册流程3.1 Pod 与 Service 的关联3.2 自动注册3.3 DNS 解析与服务发现4. 例子:Kubernetes 服务注册与发现流程5. 总结1. 引言:Kubernetes 中的服务注册与发现 …

linux查看程序占用的本地端口

ss是Socket Statistics的缩写,用来替代旧的netstat工具,功能更强大,执行更快。它用于查看系统的网络连接情况,包括TCP、UDP等协议的信息。 一. 命令解析: sudo ss -tulwnpss (Socket Statistics):替代 ne…