diff options
author | 2020-07-24 17:09:29 +0000 | |
---|---|---|
committer | 2020-07-24 17:09:29 +0000 | |
commit | 5067b5655c0d5ad0051c6b198a746e47f41f481f (patch) | |
tree | 3d993814ce4f7fc41a674041cb6c15556cfa66dd | |
parent | 242ac5616bd26b052eca9b984e1a811397860356 (diff) | |
parent | 5a7e66275155eb1df02012132cd7104feb73251f (diff) |
Merge "Skip bg PSS collection for apps using a camera"
-rw-r--r-- | services/core/java/com/android/server/am/ActivityManagerService.java | 45 |
1 files changed, 44 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 2b6da4cfc62c..cfd2bf913b9c 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -291,6 +291,7 @@ import android.util.ArrayMap; import android.util.ArraySet; import android.util.DebugUtils; import android.util.EventLog; +import android.util.IntArray; import android.util.Log; import android.util.Pair; import android.util.PrintWriterPrinter; @@ -310,6 +311,7 @@ import android.view.autofill.AutofillManagerInternal; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.app.IAppOpsActiveCallback; import com.android.internal.app.IAppOpsCallback; import com.android.internal.app.IAppOpsService; import com.android.internal.app.ProcessMap; @@ -657,6 +659,14 @@ public class ActivityManagerService extends IActivityManager.Stub int mUidChangeDispatchCount; /** + * Uids of apps with current active camera sessions. Access synchronized on + * the IntArray instance itself, and no other locks must be acquired while that + * one is held. + */ + @GuardedBy("mActiveCameraUids") + final IntArray mActiveCameraUids = new IntArray(4); + + /** * Helper class which strips out priority and proto arguments then calls the dump function with * the appropriate arguments. If priority arguments are omitted, function calls the legacy * dump command. @@ -2053,7 +2063,10 @@ public class ActivityManagerService extends IActivityManager.Stub } if (proc != null) { long startTime = SystemClock.currentThreadTimeMillis(); - long pss = Debug.getPss(pid, tmp, null); + // skip background PSS calculation of apps that are capturing + // camera imagery + final boolean usingCamera = isCameraActiveForUid(proc.uid); + long pss = usingCamera ? 0 : Debug.getPss(pid, tmp, null); long endTime = SystemClock.currentThreadTimeMillis(); synchronized (ActivityManagerService.this) { if (pss != 0 && proc.thread != null && proc.setProcState == procState @@ -2066,6 +2079,7 @@ public class ActivityManagerService extends IActivityManager.Stub ProcessList.abortNextPssTime(proc.procStateMemTracker); if (DEBUG_PSS) Slog.d(TAG_PSS, "Skipped pss collection of " + pid + ": " + (proc.thread == null ? "NO_THREAD " : "") + + (usingCamera ? "CAMERA " : "") + (proc.pid != pid ? "PID_CHANGED " : "") + " initState=" + procState + " curState=" + proc.setProcState + " " + @@ -2155,6 +2169,14 @@ public class ActivityManagerService extends IActivityManager.Stub } } }); + + final int[] cameraOp = {AppOpsManager.OP_CAMERA}; + mAppOpsService.startWatchingActive(cameraOp, new IAppOpsActiveCallback.Stub() { + @Override + public void opActiveChanged(int op, int uid, String packageName, boolean active) { + cameraActiveChanged(uid, active); + } + }); } public void setWindowManager(WindowManagerService wm) { @@ -18266,6 +18288,27 @@ public class ActivityManagerService extends IActivityManager.Stub } } + final void cameraActiveChanged(@UserIdInt int uid, boolean active) { + synchronized (mActiveCameraUids) { + final int curIndex = mActiveCameraUids.indexOf(uid); + if (active) { + if (curIndex < 0) { + mActiveCameraUids.add(uid); + } + } else { + if (curIndex >= 0) { + mActiveCameraUids.remove(curIndex); + } + } + } + } + + final boolean isCameraActiveForUid(@UserIdInt int uid) { + synchronized (mActiveCameraUids) { + return mActiveCameraUids.indexOf(uid) >= 0; + } + } + @GuardedBy("this") final void doStopUidLocked(int uid, final UidRecord uidRec) { mServices.stopInBackgroundLocked(uid); |