【问题分析】WMS无焦点窗口的ANR问题【Android 14】

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

在这里插入图片描述

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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值