【问题分析】界面点击无响应,非ANR
内容提要
用户在点击Message界面时无响应,但不会发生ANR。经过log分析发现后台Activity发动策略限制了发动,且发动的Activity与预期不符。问题有两个疑问点:后台BAL策略限制了Message的发动,以及如何发动"com.google.android.apps.messaging/.main.MainActivity"。通过调试发现,通过接收短信后点击Notification可以发动"com.google.android.apps.messaging/.main.MainActivity"。最终复现问题的步骤为:将Message对应的Task从Recents中移除,接收短信后点击Notification跳转到短信,然后回到Launcher进入Phone,通过点击"Send a message"跳转到Message,再次回到Phone后通过左滑切换到Message界面,发现界面无法点击。该问题为Google原生问题,在Pixel上也能复现。
延伸解读
BAL_BLOCK 的触发条件
文章指出,后台 Activity 启动策略返回 BAL_BLOCK 的关键在于 callingPackage 与 realCallingPackage 不一致。当 Launcher 通过 startActivityFromRecents 启动 Message 时,realCallingUid 是 Launcher 的 uid,而 callingUid 取自 Task 的 mCallingUid。若该 Task 最初由 Message 自身启动,则 callingUid 为 Message,两者不一致导致策略拦截。这
Task 来源对复现的影响
复现问题需要让 Message 的 Task 从 RecentTasks 中获取,而非 RootWindowContainer 中的现有 Task。文章强调,若 Task 有 RootActivity,系统会直接将其移到前台并返回 START_TASK_TO_FRONT,不会走 startActivity 流程。因此,必须确保 Message 的 Task 已被移除,且启动的是 .main.MainActivity,因为该 Activity 在收到 Back 事件时会 finish,从而移除整个 Task。
稳定复现步骤与原生问题
文章给出了稳定复现步骤:先清除 Message 的 Task,接收短信后点击通知启动 Message,再通过 Phone 的“Send a message”跳转到 Message 以启动 .main.MainActivity,然后侧滑返回 Phone 使 Task 被移除,最后在 Launcher 底部左滑切换回 Message,即可看到界面无法点击。该问题在 Pixel 设备上也能复现,说明是 Google 原生问题,而非特定厂商定制导致。
Q&A
为什么点击Message界面时没有响应?
点击Message界面时没有响应是因为后台Activity发动策略限制了Message的发动,导致BAL_BLOCK,但不会发生ANR。
如何复现Message界面点击无响应的问题?
复现步骤包括:移除Message的Task,接收短信后点击Notification,进入Phone,再返回Message,最后通过左滑切换到Message界面。
什么是BAL_BLOCK?
BAL_BLOCK是指后台Activity发动策略限制了某个Activity的启动,导致无法正常发动Message。
如何成功发动'com.google.android.apps.messaging/.main.MainActivity'?
可以通过接收短信后点击Notification来成功发动'com.google.android.apps.messaging/.main.MainActivity'。
该问题是否只在特定设备上出现?
该问题为Google原生问题,在Pixel设备上也能复现。
为什么在不同情况下会出现不同的Activity?
在不同情况下,调用的Intent不同,可能导致启动的是'com.google.android.apps.messaging.ui.ConversationListActivity'而非'com.google.android.apps.messaging/.main.MainActivity'。