【问题分析】界面点击无响应,非ANR【Android 14】

文章详细探讨了用户操作Message应用时界面无响应的问题,涉及到后台启动策略、Intent复用、callingUid和realCallingUid的区别,以及如何通过特定步骤复现问题。作者揭示了通过短信通知启动Message可触发正确Activity的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

1. 问题描述

用户操作出的点击Message界面无任何响应的问题,但是也不发生ANR。

2. log分析

在这里插入图片描述

与Launcher的同事沟通后,继续分析startActivityFromRecents为什么没有把Message启动起来。

查看SystemLog,发现Launcher调用startActivityFromRecents方法启动Message后,紧接着就是以下log:

在这里插入图片描述

是后台Activitiy启动的策略限制了本次启动:“BAL_BLOCK”,但是不太清楚的是为什么,这是第一个疑问点。

另外这一次启动Message用的Intent为:

intent: Intent { flg=0x1010c000 cmp=com.google.android.apps.messaging/.main.MainActivity (has extras) };

原因是之前启动MainActivity用的就是这个Intent,这次是直接复用了。

而上一次启动MainActivity是在:

01-25 00:08:08.497936 1454 1636 I ActivityTaskManager: START u0 {flg=0x1010c000 cmp=com.google.android.apps.messaging/.main.MainActivity (has extras)} with LAUNCH_MULTIPLE from uid 10149 (realCallingUid=10081) (BAL_ALLOW_PENDING_INTENT) result code=0

这次应该是在Launcher的Recents启动的,因此Intent也是复用的。

继续往前排查,能从log中找到的三次启动Message的情况都是已经出现问题了:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

因此从目前的log中无法得知首次是如何启动“com.google.android.apps.messaging/.main.MainActivity”的,我们本地在Launcher界面点击Message图标,启动的是“com.google.android.apps.messaging.ui.ConversationListActivity”,这是第二个疑问点。

总结一下,问题中总共有两个疑问点,如果要复现这个问题,需要弄清这两个疑问点:

1、后台BAL策略为何限制了Message的启动,返回了BAL_BLOCK。

2、“com.google.android.apps.messaging/.main.MainActivity”是如何启动的,我们本地在Launcher界面点击Message图标,启动的是“com.google.android.apps.messaging.ui.ConversationListActivity”。

3. BAL_BLOCK分析

还是先看log:

在这里插入图片描述

这些log是在BackgroundActivityStartController.checkBackgroundActivityStart方法中被打印的。

看BackgroundActivityStartController.checkBackgroundActivityStart方法代码:
在这里插入图片描述

从log上知道,这里传入的originatingPendingIntent为null,那么局部变量useCallingUidState为true,也就是说,会走这这段逻辑:

219              // Always allow home application to start activities.
220              if (isHomeApp(callingUid, callingPackage)) {
   
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值