From 0b4249a31483bdcb9ab5b422615022bc57ddb177 Mon Sep 17 00:00:00 2001 From: Jing Ji Date: Fri, 20 Dec 2019 19:20:06 -0800 Subject: [PATCH] Lift the throttle on polling meminfo for instruments started from shell Bug: 142710821 Test: atest CtsAppTestCases:ActivityManagerMemoryInfoTest Test: adb shell am instrument -e apps Maps^maps -w \ com.android.tests.memoryusage/com.android.tests.memoryusage.MemoryUsageInstrumentation Change-Id: I5d0e59475f27c427075967d253891d505ffc38a7 --- .../android/server/am/ActiveInstrumentation.java | 3 +++ .../server/am/ActivityManagerService.java | 16 +++++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/am/ActiveInstrumentation.java b/services/core/java/com/android/server/am/ActiveInstrumentation.java index b2c82f0bc9c7a..db63638bbfbad 100644 --- a/services/core/java/com/android/server/am/ActiveInstrumentation.java +++ b/services/core/java/com/android/server/am/ActiveInstrumentation.java @@ -67,6 +67,9 @@ class ActiveInstrumentation { // Set to true when we have told the watcher the instrumentation is finished. boolean mFinished; + // The uid of the process who started this instrumentation. + int mSourceUid; + ActiveInstrumentation(ActivityManagerService service) { mService = service; } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 1852e01fa9c76..f25e998d821af 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -4337,6 +4337,18 @@ public class ActivityManagerService extends IActivityManager.Stub final boolean allUids = mAtmInternal.isGetTasksAllowed( "getProcessMemoryInfo", callingPid, callingUid); + // Check if the caller is actually instrumented and from shell, if it's true, we may lift + // the throttle of PSS info sampling. + boolean isCallerInstrumentedFromShell = false; + synchronized (mPidsSelfLocked) { + ProcessRecord caller = mPidsSelfLocked.get(callingPid); + if (caller != null) { + final ActiveInstrumentation instr = caller.getActiveInstrumentation(); + isCallerInstrumentedFromShell = instr != null + && (instr.mSourceUid == SHELL_UID || instr.mSourceUid == ROOT_UID); + } + } + Debug.MemoryInfo[] infos = new Debug.MemoryInfo[pids.length]; for (int i=pids.length-1; i>=0; i--) { infos[i] = new Debug.MemoryInfo(); @@ -4360,7 +4372,8 @@ public class ActivityManagerService extends IActivityManager.Stub continue; // Not allowed to see other users. } } - if (proc != null && proc.lastMemInfoTime >= lastNow && proc.lastMemInfo != null) { + if (proc != null && proc.lastMemInfoTime >= lastNow && proc.lastMemInfo != null + && !isCallerInstrumentedFromShell) { // It hasn't been long enough that we want to take another sample; return // the last one. infos[i].set(proc.lastMemInfo); @@ -16116,6 +16129,7 @@ public class ActivityManagerService extends IActivityManager.Stub disableTestApiChecks, mountExtStorageFull, abiOverride); app.setActiveInstrumentation(activeInstr); activeInstr.mFinished = false; + activeInstr.mSourceUid = callingUid; activeInstr.mRunningProcesses.add(app); if (!mActiveInstrumentation.contains(activeInstr)) { mActiveInstrumentation.add(activeInstr);