diff options
| author | 2020-07-24 21:07:00 +0000 | |
|---|---|---|
| committer | 2020-07-24 21:07:00 +0000 | |
| commit | e81a883fea26ad2eb5ca40d4d7448d41bfcc72a3 (patch) | |
| tree | 591b5f7c59c1e1787fe66c00b7fd18f312106595 | |
| parent | f2aee92d758dd846608c79f7cd80cc969c26de50 (diff) | |
| parent | 1144fb6987fb4ac879db534ea70f367b980e0e6b (diff) | |
Skip bg PSS collection for apps using a camera am: fc76b97d1b am: 1144fb6987
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/12227201
Change-Id: Idb64b3bdf08d3ffceaef9c99dfd4a4af2d97e70e
| -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 9994f6647699..ec24014f77d7 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -292,6 +292,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; @@ -311,6 +312,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; @@ -655,6 +657,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. @@ -2032,7 +2042,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 @@ -2045,6 +2058,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 + " " + @@ -2134,6 +2148,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) { @@ -18224,6 +18246,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); |