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)) {