
Monkey跑出的 Launcher ANR,场景为在Launcher的Recents界面下一个Activity启动又快速销毁导致的无焦点窗口问题。
1. log分析

2. 模拟ANR
根据之前的log分析,我们已经可以写一个Demo App来模拟该ANR的发生情况了,总结如下:
1、启动任意一个Activity,我这里写的Demo App为MainActivity。
2、接着输入事件KEYCODE_RECENT_APPS,回到Recents。
3、切回到Launcher后100ms,马上让MainActivity以NEW_TASK的方式调起一个另外一个Activity,我这里用一个名为SingleTaskActivity的Activity去模拟。
4、SingleTaskActivity启动后,马上调用finish,我这里是在onCreate方法中调用的 —— KO,可以复现无焦点窗口的情况,如果此时再输入一个KeyEvent事件,即可发生ANR。
另外把Demo App安装在Pixel上发现没问题:

有可能是Pixel多了一些patch,所以修复了此问题?
3. recents_animation_input_consumer分析
多打些log:

看到及时是发生问题后,其实也是有继续调用InputMonitor.updateInputFocusRequest方法的,但是"recents_animation_input_consumer"却没有获取焦点,继续看看代码是为什么:

这里的RecentsAnimationController是之前的逻辑了,现在点击切换到Recents,RecentsAnimationController也是为空的,那么我们主要看这个逻辑:
// Shell transitions doesn't use RecentsAnimationController

本文详细描述了一种由Monkey工具模拟的LauncherANR问题,源于快速启动和销毁Activity导致的焦点窗口丢失。文章通过log分析、代码审查和对比,揭示了焦点获取和窗口管理的逻辑差异,最终定位到代码中暂停任务的处理问题和可见性判断上的错误。
1152

被折叠的 条评论
为什么被折叠?



