【Android工场】Android Input System介绍

主要模块

Android Input System主要涉及到EventHub,InputReader,InputDispatcher和InputTransport相关。
EventHub 主要监听/dev/input/event*事件上报,同时监听device的Add和Remove事件,封装成RawEvent
InputReader 根据RawEvent事件来源的device类型做对应的处理
InputDispatcher 判断事件是否丢弃,负责事件的分发
InputTransport 封装成了lib库,包括publiser和consumer两个模块,server端负责publish,APP的client端负责consume
【Android工场】Android Input System介绍_第1张图片

Native对象

InputManager持有和管理InputReader和InputDispatcher两个对象以及两个对象所运行在的线程。
InputManager又被NativeInputManager持有,NativeInputManager为InputManagerService的Native对象,其地址被InputManagerService的成员变量mPtr保存。
NativeInputManager继承了InputDispatcherPolicyInterface和InputReaderPolicyInterface,因此Reader和Dispatcher中的mPolicy都指向它,policy的回调也会回调到它。
【Android工场】Android Input System介绍_第2张图片

InputReader

Input Reader中维护了InputDevice向量,InputDevice中包含负责对应处理的InputMapper
Input Reader通过EventHub的getEvents获取Event
根据Event来源device的不同,选取对应的Input Mapper执行process(例如mt touch事件识别virtualkey并做处理,合成手写笔信息等)
【Android工场】Android Input System介绍_第3张图片

InputListener

InputReader通过Input Listener调用InputDispatcher。
InputListener中维护一个NotifyArgs队列,对于不同的事件类型,使用不同的NotifyArgs。
InputReader解析出NotifyArgs对象,push进队列。Input Reader全部解析完后,调用InputListener flush方法,调用各个NotifyArgs的notify方法,回调InputDispatcher中的各个dispatch。
【Android工场】Android Input System介绍_第4张图片

InputDispatcher

【Android工场】Android Input System介绍_第5张图片

notifyMotion

此时会将motion event加入InputBoundQueue,同时会调用policy的interceptMotionBeforeQueueing和filterInputEvent。
interceptMotionBeforeQueueing给上层提供了分发前的拦截机会,回调会修改policyFlag,对后续分发产生影响。
filterInputEvent为上层提供filter功能的实现,如果event直接在filter中被处理了,直接跳过该事件的分发。

Drop reason

消息在分发阶段可能被drop掉,Dispatcher确定了集中drop原因,比如DROP_REASON_APP_SWITCH:APP切换时有一定保护延时,不接受按键信息 DROP_REASON_DISABLED:上层策略通知不接受信息。
Dispatcher还有种Frozen状态,该状态下事件会不处理,但是不会被drop。

findTouchedWindowTargetsLocked

窗口增改删除时,WindowManagerService会将窗口信息保存在InputDispatcher的mWindowHandles中。 FindTouchedWindowTargetsLocked会根据触摸事件的位置及窗口信息来确定将事件发送到哪个窗口。

CommandQueue

InputDispatcherThread维护了一个CommandQueue,除了正常接收、处理和分发消息外,其他的操作通过push Command到队列里,在下次循环时执行。例如doNotifyANRLockedInterruptible(通知ANR), doNotifyConfigurationChangedInterruptible(通知配置的变化), doInterceptKeyBeforeDispatchingLockedInterruptible(分发前拦截)等都是这个方式执行。

InputTransport

【Android工场】Android Input System介绍_第6张图片
APP启动的时候调用addWindow注册InputChannel
InputConsumer和InputPublisher分别被APP和InputSystem所持有,Consumer中封装了socket的client端,Publisher封装了server端
APP端通过InputConsumer来接收处理event和发送finishSignal
InputSystem通过InputPublisher来发送event

Event Consume

APP进程监听到System通过socket发送过来的事件后会做对应的处理

  • 非Move事件,立刻上报给APP,回调APP的事件监听函数
  • Move事件
    • 第一次接收到Move事件,通知FWK层打开app vsync监听,并且schedule vsync到来时的回调函数
    • 后来监听到的Move事件会保存在mBatch对象中,不上报给APP
      vsync到来时,consume Move事件的batch,生成MOVE事件上报给APP
      【Android工场】Android Input System介绍_第7张图片

Resample

插点算法出现的背景

由于Touch上报的频率和VSYNC不一致,会导致每次报点之间的距离不相同,导致滑动不平滑
【Android工场】Android Input System介绍_第8张图片

插点算法介绍

  • vsync到来时判断
    如果RESAMPLE_LATENCY之内有MOVE point B上报,根据point B和之前的point A计算出虚拟上报点(绿点)
  • 下次vsync到来时
    根据上次遗留的point B和本周期内上报的point C预测出虚拟上报点(黄点)
  • 因此每次vsync到来,consumeBatch时过滤掉RESAMPLE_LATENCY(默认5ms)内的点
    【Android工场】Android Input System介绍_第9张图片

更多相关文章

  1. GridView的简单使用,带有点击事件
  2. Android中通过Intent 调用图片、视频、音频、录音、拍照
  3. android解决坚屏拍照和保存图片旋转90度的问题,并兼容4.0
  4. 详解Android 触摸事件处理和传递过程的来龙去脉
  5. Android退出程序(三)——Android事件总线
  6. android:定制checkbox 图片

随机推荐

  1. android 简单比较 两个图片是否一致
  2. Android P 隐藏Setting主页面Suggestion
  3. android 內存等使用情況
  4. android中使用intent传输值
  5. Android(安卓)检测是否有ROOT权限
  6. android 之 新浪微博
  7. Android Handler:子线程发消息到UI主线程
  8. android 3d 问题汇总1
  9. Android绘图API自定义View(三)
  10. Android修改状态栏颜色