Android Input 输入事件日志
一、日志关键字
关键日志:InputReader|InputDispatcher|InputEvent
Android Input指的是输入事件,主要是触摸滑动,当然还包括类似蓝牙外设的输入。Input涉及到的主要模块:
- InputReader:负责从硬件获取输入,转换成事件(Event),并传给Input Dispatcher。
- InputDispatcher:将InputReader传送过了的Events分发给合适的窗口,并监控ANR。
- InputManagerService:负责Input和InputDsitpatcher的创建,并提供Policy用于Events的预处理
- WindowManagerService:管理InputManager与View(Window)以及ActivityManager之间的通信
- View and Activity:接受按键并处理
- AcitivityMangerService:ANR处理
它们之间的关系如下图所示(黑色箭头代表控制信号传递方向,而红色箭头代表用户输入数据的传递方向)。
InputReader
- Motion事件格式:
InputReader: UL_Input first down(X坐标, Y坐标)
InputReader: UL_Input last up(X坐标, Y坐标)
InputReader system_process I UL_Input first down(664,2615)
InputReader system_process I UL_Input first offset move.
InputReader system_process I UL_Input last up(731,2167)
- Key事件:
InputReader: UL_Input down(keycode)
InputReader: UL_Input up(keycode)
InputReader system_process I UL_Input down(24) from device gpio-keys.
InputReader system_process I UL_Input up(24) from device gpio-keys.
24 gpio-keys
25 pmic_resin
26 pmic_pwrkey
3-home, 4-back
InputDispatcher
分发相关信息,可查看分发的窗口信息,或异常信息(如事件丢弃原因):
- Touch时切换窗口焦点(即新的焦点应用进程)
InputDispatcher system_server I UL_Input touch(230,1655) in new 6c0580a com.huawei.camera/com.huawei.camera,region=[0,0][1256,2760],frame=[0,0][1256,2760],scale=[1.000000,1.000000],tSize=1,diff=false,flag=NOT_TOUCH_MODAL | KEEP_SCREEN_ON | LAYOUT_IN_SCREEN | FULLSCREEN | LAYOUT_INSET_DECOR | SPLIT_TOUCH | HARDWARE_ACCELERATED | DRAWS_SYSTEM_BAR_BACKGROUNDS
InputDispatcher system_server I oldType:FOCUS newType:MOTION, seq=18637
Focused app:ActivityRecord{353f9fc u0 com.huawei.camera/com.huawei.camera t72}, displayId=0
InputEvent
- Touch事件格式
InputEvent: (相对坐标):(绝对坐标){action}-{toolType}-{displayId}
InputEvent com.android.systemui I ViewUI (334,2183):(334,2183)0-1-0
InputEvent com.android.systemui I ViewUI Moving, count=1
InputEvent com.android.systemui I ViewUI (262,1585):(262,1585)1-1-0
- Key事件格式
InputEvent: {keycode}-{action}-{displayId}
InputEvent com.huawei.android.launcher I ViewUI 4-0--1
InputEvent com.huawei.android.launcher I ViewUI 4-1--1
- 三键导航情况下home无InputEvent事件打印关键日志
keyCode=|handleHomeButton in display
HwPhoneWindowManager system_server I interceptKeyTi keyCode=3 isActionDown=false repeatCount=0 isInjected=true
PhoneWindowManager system_server I handleHomeButton in display#0 mHomePressed = true
- 格式中的字段信息
字段 | 字段信息 |
---|---|
action | 0:Down,1:Up,2:Move,3表示Cancel; 5:ACTION_POINTER_DOWN,6:ACTION_POINTER_UP;7:ACTION_HOVER_MOVE,9:ACTION_HOVER_ENTER,10:ACTION_HOVER_EXIT; 11: ACTION_BUTTON_PRESS, 12: ACTION_BUTTON_RELEASE |
toolType | 手机通常只会出现1:Finger。1:Finger; 2:手写笔;3:鼠标;4:橡皮擦;5:手掌;7:指关节;101:指尖;102:指甲;103:指关节;104:BEZEL |
displayId | 屏幕Id。-1:获取焦点的屏幕,0:主屏。 |
keycode | 常见如下:3:回Home界面,4:back返回键 24:音量Up,25:音量Down;26:Power键 265:手表下键 517:非光学指纹按下,518:非光学指纹抬起 716:单击唤醒屏幕,131:双击唤醒屏幕 |
二、Input事件总结
- 整体流程
- 输入系统部分
手机的输入设备(包括屏幕、键盘、鼠标),会在文件系统/dev/input中创建对应的设备节点,用户操作输入设备会产生输入事件(按键事件、触摸事件、鼠标事件)等
IMS核心功能实现在native层,由SystemServer创建。 - WMS处理部分
WMS的职责之一就是输入系统的中转站,WMS作为Windows的管理者,会配合IMS讲输入事件交由合适的Window来处理。 - View处理部分
app端的ViewRootImpl里面的InputEventReceiver会接到从Socket得到的InputEvent。
- InputManagerService初始化过程
- startOtherServices中,创建了IMS及WMS,并将WMS中的monitor传给IMS作为回调,最后启动IMS
- IMS的初始化中执行nativeInit,该方法中创建了一个NativeInputManager实例,并且合java层使用的是同一个looper
- NativeInputManager的初始化创建了一个EventHub,同时这个EventHub传给新建的InputManager,EventHub就是将数据从硬件驱动上读出来然后传递上来的通道。
- InputManager初始化时创建了两个重要的线程:InputReaderThread和InputDispatcherThred
- InputManager的start方法,让两个线程开启了循环执行操作
- InputReader处理InputEvent流程
- InputReader启动后执行loopOnce可阻塞循环
- loopOnce循环中会通过Eventhub调用getEvents,来获取底层input事件
- InputDispatch分发流程
- InputDispatcherThread被唤醒后,通过InputDispatcher主要任务时找到对应的window,并建立进程间通信,把input event传递过去
- App端处理流程