Android Input 输入事件日志

Android Input 输入事件日志
Photo by Amir Hanna / Unsplash

一、日志关键字

关键日志: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事件总结

  1. 整体流程
  • 输入系统部分
    手机的输入设备(包括屏幕、键盘、鼠标),会在文件系统/dev/input中创建对应的设备节点,用户操作输入设备会产生输入事件(按键事件、触摸事件、鼠标事件)等

    IMS核心功能实现在native层,由SystemServer创建。
  • WMS处理部分
    WMS的职责之一就是输入系统的中转站,WMS作为Windows的管理者,会配合IMS讲输入事件交由合适的Window来处理。
  • View处理部分
    app端的ViewRootImpl里面的InputEventReceiver会接到从Socket得到的InputEvent。
  1. InputManagerService初始化过程
  • startOtherServices中,创建了IMS及WMS,并将WMS中的monitor传给IMS作为回调,最后启动IMS
  • IMS的初始化中执行nativeInit,该方法中创建了一个NativeInputManager实例,并且合java层使用的是同一个looper
  • NativeInputManager的初始化创建了一个EventHub,同时这个EventHub传给新建的InputManager,EventHub就是将数据从硬件驱动上读出来然后传递上来的通道。
  • InputManager初始化时创建了两个重要的线程:InputReaderThread和InputDispatcherThred
  • InputManager的start方法,让两个线程开启了循环执行操作
  1. InputReader处理InputEvent流程
  • InputReader启动后执行loopOnce可阻塞循环
  • loopOnce循环中会通过Eventhub调用getEvents,来获取底层input事件
  1. InputDispatch分发流程
  • InputDispatcherThread被唤醒后,通过InputDispatcher主要任务时找到对应的window,并建立进程间通信,把input event传递过去
  1. App端处理流程
皖ICP备2023003517号-1