基本原理
触摸事件数据的传递基本流程大致应该分为如下几个阶段
首先,当然是硬件感应 - - >
固件软件 - - >
Kernel驱动, 驱动将数据写入设备文件 - - >
用户空间进程, android中对应的当然是system进程, 首先input reader线程从设备文件读取数据 - - >
system进程input dispatcher线程拿到input reader线程转化后的数据,准备进行分发 - - >
app进程, native层receiver对象被回调, 接收数据 - - >
app进程, java层ViewRootImpl对象被回调, 接收数据 - - >
最后就是我们熟悉的decorview - > activity - > window - > decorview - > viewgroup
这次先分享一下input reader线程对触摸事件数据处理的大致原理。个人感觉逻辑细节还是相当复杂的,所以,不足之处还请高手们多多指点。
android将从设备文件中读取数据的操作封装在EventHub类, 当有数据到达设备文件后, input reader线程会被唤醒, 调用mEventHub→getEvents获取数据, 数据格式为RawEvent, input reader的主要工作就是将RawEvent转化为Motion Event交给input dispatcher进行分发.
设备文件目录在/dev/input
通过命令 adb shell getevent -p查看哪个设备文件是用于触摸事件的
adb shell getevent /dev/input/设备文件名, 可以打印数据
RawEvent
nsecs_t when;
int32_t deviceId;
int32_t type;