From 0f2bcbedc94d130f07279115812d398d1242c060 Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Thu, 27 May 2021 19:16:30 +0800 Subject: [PATCH] Pass real calling uid to metrics logger if available So the method such as startActivities which clears binder identity can still be recognized as a consecutive launch. Bug: 189428401 Test: ActivityMetricsLaunchObserverTests Change-Id: Ia7d1056afde6b1709b9878bc8ecb6051311c28bb --- .../android/server/wm/ActivityMetricsLogger.java | 16 +++------------- .../com/android/server/wm/ActivityStarter.java | 4 +++- .../wm/ActivityMetricsLaunchObserverTests.java | 7 ++++--- 3 files changed, 10 insertions(+), 17 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityMetricsLogger.java b/services/core/java/com/android/server/wm/ActivityMetricsLogger.java index e1b7dd3a081b4..602a0ff639a99 100644 --- a/services/core/java/com/android/server/wm/ActivityMetricsLogger.java +++ b/services/core/java/com/android/server/wm/ActivityMetricsLogger.java @@ -80,7 +80,6 @@ import android.content.pm.IncrementalStatesInfo; import android.content.pm.dex.ArtManagerInternal; import android.content.pm.dex.PackageOptimizationInfo; import android.metrics.LogMaker; -import android.os.Binder; import android.os.Handler; import android.os.Looper; import android.os.SystemClock; @@ -507,22 +506,13 @@ class ActivityMetricsLogger { return notifyActivityLaunching(intent, null /* caller */, IGNORE_CALLER); } - /** - * If the caller is found in an active transition, it will be considered as consecutive launch - * and coalesced into the active transition. - * - * @see #notifyActivityLaunching(Intent, ActivityRecord, int) - */ - LaunchingState notifyActivityLaunching(Intent intent, @Nullable ActivityRecord caller) { - return notifyActivityLaunching(intent, caller, Binder.getCallingUid()); - } - /** * Notifies the tracker at the earliest possible point when we are starting to launch an * activity. The caller must ensure that {@link #notifyActivityLaunched} will be called later - * with the returned {@link LaunchingState}. + * with the returned {@link LaunchingState}. If the caller is found in an active transition, + * it will be considered as consecutive launch and coalesced into the active transition. */ - private LaunchingState notifyActivityLaunching(Intent intent, @Nullable ActivityRecord caller, + LaunchingState notifyActivityLaunching(Intent intent, @Nullable ActivityRecord caller, int callingUid) { final long transitionStartTimeNs = SystemClock.elapsedRealtimeNanos(); TransitionInfo existingInfo = null; diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index 8262c59945c4a..657411d712bc3 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -617,8 +617,10 @@ class ActivityStarter { final LaunchingState launchingState; synchronized (mService.mGlobalLock) { final ActivityRecord caller = ActivityRecord.forTokenLocked(mRequest.resultTo); + final int callingUid = mRequest.realCallingUid == Request.DEFAULT_REAL_CALLING_UID + ? Binder.getCallingUid() : mRequest.realCallingUid; launchingState = mSupervisor.getActivityMetricsLogger().notifyActivityLaunching( - mRequest.intent, caller); + mRequest.intent, caller, callingUid); } // If the caller hasn't already resolved the activity, we're willing diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java index 349270ff708a9..beff3862df010 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java @@ -306,7 +306,8 @@ public class ActivityMetricsLaunchObserverTests extends WindowTestsBase { private void notifyActivityLaunching(Intent intent) { final ActivityMetricsLogger.LaunchingState previousState = mLaunchingState; mLaunchingState = mActivityMetricsLogger.notifyActivityLaunching(intent, - mLaunchTopByTrampoline ? mTrampolineActivity : null /* caller */); + mLaunchTopByTrampoline ? mTrampolineActivity : null /* caller */, + mLaunchTopByTrampoline ? mTrampolineActivity.getUid() : 0); if (mLaunchTopByTrampoline) { // The transition of TrampolineActivity has not been completed, so when the next // activity is starting from it, the same launching state should be returned. @@ -429,7 +430,7 @@ public class ActivityMetricsLaunchObserverTests extends WindowTestsBase { .setCreateTask(true) .build(); mActivityMetricsLogger.notifyActivityLaunching(activityOnNewTask.intent, - mTrampolineActivity /* caller */); + mTrampolineActivity /* caller */, mTrampolineActivity.getUid()); notifyActivityLaunched(START_SUCCESS, activityOnNewTask); transitToDrawnAndVerifyOnLaunchFinished(activityOnNewTask); @@ -453,7 +454,7 @@ public class ActivityMetricsLaunchObserverTests extends WindowTestsBase { // Before TopActivity is drawn, it launches another activity on a different display. mActivityMetricsLogger.notifyActivityLaunching(activityOnNewDisplay.intent, - mTopActivity /* caller */); + mTopActivity /* caller */, mTopActivity.getUid()); notifyActivityLaunched(START_SUCCESS, activityOnNewDisplay); // There should be 2 events instead of coalescing as one event.