Android 中input event的分析

本文详细分析了Android系统的Input Event子系统,通过运行并解释getevent工具的使用,展示了如何获取和理解设备输入事件。从getevent的输出中,可以看到系统中的不同input设备,如sensor-input、88pm860x_hook、88pm860x-on、88pm860x-touch和pxa27x-keypad。文章进一步探讨了getevent的源代码,揭示了事件处理的基本原理,包括读取/dev/input下的事件,并解释了每个event的三个属性:type、code和value。最后,文章追溯到Android Framework,展示了EventHub在处理输入事件中的作用,并逐步揭示了从Kernel到Framework再到应用程序的事件处理流程。
摘要由CSDN通过智能技术生成

文章将分析Android 的Input Event 子系统的来龙去脉。

 

Android 系统里面有很多小工具,运行这些工具,我们对它们有一个感性的认识,进而阅读和分析这些小工具源代码,再顺藤摸瓜,就可以把整个子系统的来龙去脉弄清楚。

 

1.运行toolbox的getevent 工具。

 

# getevent -help
getevent -help
Usage: getevent [-t] [-n] [-s switchmask] [-S] [-v [mask]] [-p] [-q] [-c count] [-r] [device]
    -t: show time stamps
    -n: don't print newlines
    -s: print switch states for given bits
    -S: print all switch states
    -v: verbosity mask (errs=1, dev=2, name=4, info=8, vers=16, pos. events=32)
    -p: show possible events (errs, dev, name, pos. events)
    -q: quiet (clear verbosity mask)
    -c: print given number of events then exit
    -r: print rate events are received
# getevent -c 20
getevent -c 20
add device 1: /dev/input/event4
  name:     "sensor-input"
add device 2: /dev/input/event3
  name:     "88pm860x_hook"
add device 3: /dev/input/event2
  name:     "88pm860x_on"
add device 4: /dev/input/event1
  name:     "88pm860x-touch"
add device 5: /dev/input/event0
  name:     "pxa27x-keypad"
/dev/input/event0: 0001 0066 00000001
/dev/input/event0: 0000 0000 00000000
/dev/input/event0: 0001 0066 00000000
/dev/input/event0: 0000 0000 00000000
/dev/input/event1: 0003 0000 00000c48
/dev/input/event1: 0003 0001 00000751
/dev/input/event1: 0001 014a 00000001
/dev/input/event1: 0000 0000 00000000
/dev/input/event1: 0003 0000 00000c67
/dev/input/event1: 0003 0001 000006f9
/dev/input/event1: 0000 0000 00000000
/dev/input/event1: 0003 0000 00000c9e
/dev/input/event1: 0003 0001 0000069e
/dev/input/event1: 0000 0000 00000000
/dev/input/event1: 0003 0000 00000cc4
/dev/input/event1: 0003 0001 00000620
/dev/input/event1: 0000 0000 00000000
/dev/input/event1: 0003 0000 00000ce8
/dev/input/event1: 0003 0001 000005ba
/dev/input/event1: 0000 0000 00000000

运行这个工具,然后按键或者滑动触摸屏,会看到程序会实时打印event。从上面的输出来看,系统有5个input 子系统。它们分别是

 

add device 1: /dev/input/event4
  name:     "sensor-input"

#Sensor input 子系统

 

add device 2: /dev/input/event3
  name:     "88pm860x_hook"

#耳机Hook键子系统。可支持接电话挂电话的耳机上面有一个按键,对应的就是这个input 子系统。


add device 3: /dev/input/event2
  name:     "88pm860x_on"

 

#开机键 input 子系统
add device 4: /dev/input/event1
  name:     "88pm860x-touch"

#Touch Screen input 子系统


add device 5: /dev/input/event0
  name:     "pxa27x-keypad"

#按键子系统,包括Home/Menu/Back等按键。

 

可以尝试多种event,实际感觉一下出来的log。

 

 

2.阅读getevent的代码。代码为./core/toolbox/getevent.c

 

从代码中,我们知道,程序在while(1)的一个死循环里,不断地在读取 (select 操作)/dev/input 下面的文件,检查是否Kernel往里面更新内容,如果有内容更新,就把它打印出来。并且从代码中,我们还知道,任何一个event都有三种属性,type,code,value.

 

 

    while(1) {
        pollres = poll(ufds, nfds, -1);
        //printf("poll %d, return

评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值