在之前的篇章中,我们已经对 Android 输入模块的组成有了大致的了解,包括从硬件事件的读取到应用层事件分发的全流程。本篇我们将深入探讨 Android 输入子系统如何通过 Linux 内核收集硬件设备产生的输入事件,以及这些事件是如何被转换和传递给用户空间的应用程序进行处理的。
一、输入子系统概述
Android 设备可以同时连接多个输入设备,如触摸屏、键盘、鼠标等。每当用户在任何一个设备上产生输入操作时,都会触发一个中断。这些中断经过 Linux 内核的中断处理机制以及相应的设备驱动程序转换为事件(Event),并最终传递给用户空间的应用程序进行处理。
同时,每个输入设备都有其特定的驱动程序,数据接口也各不相同。要在单个线程(例如 InputReader Thread)中捕获所有用户的输入,Linux 内核的输入子系统发挥了关键作用。该子系统在各种设备驱动程序之上提供了一个抽象层,只要底层设备驱动程序遵循这一抽象接口实现,上层应用就可以通过统一的接口访问所有的输入设备。这种设计极大地简化了多输入设备的支持和管理。
1、抽象层关键概念
在 Linux 内核的输入子系统中,为了实现对多种输入设备的支持,并提供统一的接口给用户空间的应用程序使用,定义了三个核心的概念:input_dev、input_handler 和 input handle。这些概念共同工