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
This commit is contained in:
Winson Chung
2018-03-08 11:10:27 -08:00
parent 2cb0244ade
commit 7dbdbc85c7

View File

@@ -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<IBinder> 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);
}