Android 怎么debug按键无响应的问题

557 阅读2分钟

遇到一个按home键无响应的问题,正好总结一下对于按键问题怎么去debug。

由于按键的响应是多种多样的,比如button的onClick点击事件,或者onPress,或者是像点击home键这种,去创建一个intent然后startActivity,宏观上来说可以分成三步:

  1. touch point 事件成功从屏幕输入到input;
  2. input事件上报到正确的窗口并成功消费;
  3. 对应窗口执行此input事件的响应动作。

以按home键无响应为例,首先我们排查第一个环节,确认问题是否与input driver相关

通过软件模拟Home key

adb shell input keyevent 3 adb shell dumpsys input

发现此时设备并没有返回home键,也就是说touch事件已经到framework中了,但仍然无法启动home,说明和input driver是无关的。接下来直接debug第三步,模拟输入事件的相应动作。因为第二步input事件的dispatch过程,涉及的log比较多,混杂着很多layer、window等,不太直观,要通过log和dump来判断,所以先跳过这一步。

对于按home键,可以看到它的点击事件就是去启动Launcher的home activity,我们可以通过am命令来模拟这个过程

adb shell am start -a android.intent.action.MAIN -c android.intent.category.Home

通过这步我们就可以排查input事件的响应动作能否正常实现,在我debug的问题中,到这里已经有结论了,就是通过am命令也无法启动home activity,方向明确之后就直接从AMS角度,startActivity流程开始分析,查看相关log也比较容易定位问题了。

如果第三步仍然无法确定问题怎么办?那说明无响应的是input事件的传输过程。关于input事件在系统中是如何dispatch的,也有很多文章可以参考,input事件的分发流程比较简单,就是log有些多。对于debug问题来讲,通常还是要先通过一些经验或者试验初步定位原因,这样有利于快速解决问题。

实际在平时遇到的问题当中,input的dispatch流程是很少出错的,如果问题出在input dispatch环节,那么大概率是当前系统loading太重导致整体卡顿,或者是有某些透明的layer挡住把input事件消费掉了。

adb shell dumpsys window windows > dumpwin.log

adb shell dumpsys SurfaceFlinger > dumpsf.log

可以通过对比正常环境下的dump和异常环境下的dump,看下是否对应的layer有多出来,也可以通过Hierarchy View或WinScope工具来查看图层,找到对应图层看下属于哪种view,最好能找到id,再去查这个view是如何被inflate出来的以及何时应该remove。

stateDiagram-v2
模拟inputEvent并抓log,排除driver问题 --> 模拟input事件响应动作,排除应用端问题

模拟input事件响应动作,排除应用端问题 --> 分析input的dispatch流程