diff options
5 files changed, 83 insertions, 11 deletions
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index b536dc524a80..e653f39d04c1 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -14565,7 +14565,7 @@ public class ActivityManagerService extends IActivityManager.Stub app.mProfile.addHostingComponentType(HOSTING_COMPONENT_TYPE_INSTRUMENTATION); } - app.setActiveInstrumentation(activeInstr); + mProcessStateController.setActiveInstrumentation(app, activeInstr); activeInstr.mFinished = false; activeInstr.mSourceUid = callingUid; activeInstr.mRunningProcesses.add(app); @@ -14711,7 +14711,7 @@ public class ActivityManagerService extends IActivityManager.Stub abiOverride, ZYGOTE_POLICY_FLAG_EMPTY); - app.setActiveInstrumentation(activeInstr); + mProcessStateController.setActiveInstrumentation(app, activeInstr); activeInstr.mFinished = false; activeInstr.mSourceUid = callingUid; activeInstr.mRunningProcesses.add(app); @@ -14848,7 +14848,7 @@ public class ActivityManagerService extends IActivityManager.Stub } instr.removeProcess(app); - app.setActiveInstrumentation(null); + mProcessStateController.setActiveInstrumentation(app, null); } app.mProfile.clearHostingComponentType(HOSTING_COMPONENT_TYPE_INSTRUMENTATION); diff --git a/services/core/java/com/android/server/am/AppProfiler.java b/services/core/java/com/android/server/am/AppProfiler.java index 6b24df4a1fa8..225c7ca2ca9e 100644 --- a/services/core/java/com/android/server/am/AppProfiler.java +++ b/services/core/java/com/android/server/am/AppProfiler.java @@ -2477,13 +2477,15 @@ public class AppProfiler { // This is the wildcard mode, where every process brought up for // the target instrumentation should be included. if (aInstr.mTargetInfo.packageName.equals(app.info.packageName)) { - app.setActiveInstrumentation(aInstr); + mService.mProcessStateController.setActiveInstrumentation(app, + aInstr); aInstr.mRunningProcesses.add(app); } } else { for (String proc : aInstr.mTargetProcesses) { if (proc.equals(app.processName)) { - app.setActiveInstrumentation(aInstr); + mService.mProcessStateController.setActiveInstrumentation(app, + aInstr); aInstr.mRunningProcesses.add(app); break; } diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java index 9c569db99797..98a54a62b4b2 100644 --- a/services/core/java/com/android/server/am/OomAdjuster.java +++ b/services/core/java/com/android/server/am/OomAdjuster.java @@ -3403,7 +3403,7 @@ public class OomAdjuster { private static int getCpuCapability(ProcessRecord app, long nowUptime) { final UidRecord uidRec = app.getUidRecord(); if (uidRec != null && uidRec.isCurAllowListed()) { - // Process has user visible activities. + // Process is in the power allowlist. return PROCESS_CAPABILITY_CPU_TIME; } if (UserHandle.isCore(app.uid)) { @@ -3418,6 +3418,12 @@ public class OomAdjuster { // It running a short fgs, just give it cpu time. return PROCESS_CAPABILITY_CPU_TIME; } + if (app.mReceivers.numberOfCurReceivers() > 0) { + return PROCESS_CAPABILITY_CPU_TIME; + } + if (app.hasActiveInstrumentation()) { + return PROCESS_CAPABILITY_CPU_TIME; + } // TODO(b/370817323): Populate this method with all of the reasons to keep a process // unfrozen. return 0; diff --git a/services/core/java/com/android/server/am/ProcessStateController.java b/services/core/java/com/android/server/am/ProcessStateController.java index 57899228e6ad..f44fb06727cf 100644 --- a/services/core/java/com/android/server/am/ProcessStateController.java +++ b/services/core/java/com/android/server/am/ProcessStateController.java @@ -246,12 +246,11 @@ public class ProcessStateController { } /** - * Set what sched group to grant a process due to running a broadcast. - * {@link ProcessList.SCHED_GROUP_UNDEFINED} means the process is not running a broadcast. + * Sets an active instrumentation running within the given process. */ - public void setBroadcastSchedGroup(@NonNull ProcessRecord proc, int schedGroup) { - // TODO(b/302575389): Migrate state pulled from BroadcastQueue to a pushed model - throw new UnsupportedOperationException("Not implemented yet"); + public void setActiveInstrumentation(@NonNull ProcessRecord proc, + ActiveInstrumentation activeInstrumentation) { + proc.setActiveInstrumentation(activeInstrumentation); } /********************* Process Visibility State Events *********************/ @@ -587,6 +586,34 @@ public class ProcessStateController { psr.updateHasTopStartedAlmostPerceptibleServices(); } + /************************ Broadcast Receiver State Events **************************/ + /** + * Set what sched group to grant a process due to running a broadcast. + * {@link ProcessList.SCHED_GROUP_UNDEFINED} means the process is not running a broadcast. + */ + public void setBroadcastSchedGroup(@NonNull ProcessRecord proc, int schedGroup) { + // TODO(b/302575389): Migrate state pulled from BroadcastQueue to a pushed model + throw new UnsupportedOperationException("Not implemented yet"); + } + + /** + * Note that the process has started processing a broadcast receiver. + */ + public boolean incrementCurReceivers(@NonNull ProcessRecord app) { + // TODO(b/302575389): Migrate state pulled from ATMS to a pushed model + // maybe used ActivityStateFlags instead. + throw new UnsupportedOperationException("Not implemented yet"); + } + + /** + * Note that the process has finished processing a broadcast receiver. + */ + public boolean decrementCurReceivers(@NonNull ProcessRecord app) { + // TODO(b/302575389): Migrate state pulled from ATMS to a pushed model + // maybe used ActivityStateFlags instead. + throw new UnsupportedOperationException("Not implemented yet"); + } + /** * Builder for ProcessStateController. */ diff --git a/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java b/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java index 4a09802fc822..fe7cc923d3d1 100644 --- a/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java +++ b/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java @@ -743,6 +743,43 @@ public class MockingOomAdjusterTests { @SuppressWarnings("GuardedBy") @Test + @EnableFlags(Flags.FLAG_USE_CPU_TIME_CAPABILITY) + public void testUpdateOomAdjFreezeState_receivers() { + final ProcessRecord app = makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID, + MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, true); + + updateOomAdj(app); + assertNoCpuTime(app); + + app.mReceivers.incrementCurReceivers(); + updateOomAdj(app); + assertCpuTime(app); + + app.mReceivers.decrementCurReceivers(); + updateOomAdj(app); + assertNoCpuTime(app); + } + + @SuppressWarnings("GuardedBy") + @Test + @EnableFlags(Flags.FLAG_USE_CPU_TIME_CAPABILITY) + public void testUpdateOomAdjFreezeState_activeInstrumentation() { + ProcessRecord app = makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID, MOCKAPP_PROCESSNAME, + MOCKAPP_PACKAGENAME, true); + updateOomAdj(app); + assertNoCpuTime(app); + + mProcessStateController.setActiveInstrumentation(app, mock(ActiveInstrumentation.class)); + updateOomAdj(app); + assertCpuTime(app); + + mProcessStateController.setActiveInstrumentation(app, null); + updateOomAdj(app); + assertNoCpuTime(app); + } + + @SuppressWarnings("GuardedBy") + @Test public void testUpdateOomAdj_DoOne_OverlayUi() { ProcessRecord app = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID, MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, true)); |