From 7dbdbc85c709eb095f26ca3fb9dcc0bbb410f442 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Thu, 8 Mar 2018 11:10:27 -0800 Subject: [PATCH] Don't hold AM lock during assist data request. Bug: 73992642 Test: Manual, just ensure that we don't hold the lock while requesting assist data Change-Id: I38305a0982722669733481b7ef74550f972c85ee --- .../server/am/ActivityManagerService.java | 39 ++++++++++--------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 76564537ca68f..71fbb36f1f547 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -5151,26 +5151,14 @@ public class ActivityManagerService extends IActivityManager.Stub enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "startRecentsActivity()"); final long origId = Binder.clearCallingIdentity(); try { + final int recentsUid; + final String recentsPackage; + final List topVisibleActivities; synchronized (this) { - final int recentsUid = mRecentTasks.getRecentsComponentUid(); final ComponentName recentsComponent = mRecentTasks.getRecentsComponent(); - final String recentsPackage = recentsComponent.getPackageName(); - - // If provided, kick off the request for the assist data in the background before - // starting the activity - if (assistDataReceiver != null) { - final AppOpsManager appOpsManager = (AppOpsManager) - mContext.getSystemService(Context.APP_OPS_SERVICE); - final AssistDataReceiverProxy proxy = new AssistDataReceiverProxy( - assistDataReceiver, recentsPackage); - final AssistDataRequester requester = new AssistDataRequester(mContext, this, - mWindowManager, appOpsManager, proxy, this, - OP_ASSIST_STRUCTURE, OP_NONE); - requester.requestAssistData(mStackSupervisor.getTopVisibleActivities(), - true /* fetchData */, false /* fetchScreenshots */, - true /* allowFetchData */, false /* alloweFetchScreenshots */, - recentsUid, recentsPackage); - } + recentsPackage = recentsComponent.getPackageName(); + recentsUid = mRecentTasks.getRecentsComponentUid(); + topVisibleActivities = mStackSupervisor.getTopVisibleActivities(); // Start a new recents animation final RecentsAnimation anim = new RecentsAnimation(this, mStackSupervisor, @@ -5178,6 +5166,21 @@ public class ActivityManagerService extends IActivityManager.Stub anim.startRecentsActivity(intent, recentsAnimationRunner, recentsComponent, recentsUid); } + + // If provided, kick off the request for the assist data in the background. Do not hold + // the AM lock as this will just proxy directly to the assist data receiver provided. + if (assistDataReceiver != null) { + final AppOpsManager appOpsManager = (AppOpsManager) + mContext.getSystemService(Context.APP_OPS_SERVICE); + final AssistDataReceiverProxy proxy = new AssistDataReceiverProxy( + assistDataReceiver, recentsPackage); + final AssistDataRequester requester = new AssistDataRequester(mContext, this, + mWindowManager, appOpsManager, proxy, this, OP_ASSIST_STRUCTURE, OP_NONE); + requester.requestAssistData(topVisibleActivities, + true /* fetchData */, false /* fetchScreenshots */, + true /* allowFetchData */, false /* allowFetchScreenshots */, + recentsUid, recentsPackage); + } } finally { Binder.restoreCallingIdentity(origId); }