Loading services/core/java/com/android/server/am/ActivityManagerService.java +15 −5 Original line number Diff line number Diff line Loading @@ -14189,8 +14189,12 @@ public class ActivityManagerService extends IActivityManager.Stub proc.mProfile.addHostingComponentType(HOSTING_COMPONENT_TYPE_BACKUP); if (Flags.pushGlobalStateToOomadjuster() && Flags.autoTriggerOomadjUpdates()) { // Do nothing, ProcessStateController will handle the update in setBackupTarget. } else { // Try not to kill the process during backup updateOomAdjLocked(proc, OOM_ADJ_REASON_BACKUP); } // If the process is already attached, schedule the creation of the backup agent now. // If it is not yet live, this will be done when it attaches to the framework. Loading Loading @@ -14316,9 +14320,15 @@ public class ActivityManagerService extends IActivityManager.Stub // Not backing this app up any more; reset its OOM adjustment final ProcessRecord proc = backupTarget.app; if (Flags.pushGlobalStateToOomadjuster() && Flags.autoTriggerOomadjUpdates()) { // Do nothing. // ProcessStateController will handle the update in stopBackupTarget. } else { // TODO(b/369300367): Triggering the update before the state is actually set // seems wrong. updateOomAdjLocked(proc, OOM_ADJ_REASON_BACKUP); } proc.setInFullBackup(false); proc.mProfile.clearHostingComponentType(HOSTING_COMPONENT_TYPE_BACKUP); services/core/java/com/android/server/am/ProcessStateController.java +17 −2 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.server.am; import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_ACTIVITY; import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_BACKUP; import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_SERVICE_BINDER_CALL; import static android.app.ProcessMemoryState.HOSTING_COMPONENT_TYPE_BROADCAST_RECEIVER; Loading Loading @@ -108,7 +109,7 @@ public class ProcessStateController { * Add a process to evaluated the next time an update is run. */ @GuardedBy("mLock") public void enqueueUpdateTarget(@NonNull ProcessRecord proc) { public void enqueueUpdateTarget(@Nullable ProcessRecord proc) { mOomAdjuster.enqueueOomAdjTargetLocked(proc); } Loading Loading @@ -313,7 +314,15 @@ public class ProcessStateController { */ @GuardedBy("mLock") public void setBackupTarget(@NonNull ProcessRecord proc, @UserIdInt int userId) { final ProcessRecord prev = mGlobalState.mBackupTargets.get(userId); if (prev == proc) return; mGlobalState.mBackupTargets.put(userId, proc); if (Flags.pushGlobalStateToOomadjuster() && Flags.autoTriggerOomadjUpdates()) { enqueueUpdateTarget(prev); enqueueUpdateTarget(proc); runPendingUpdate(OOM_ADJ_REASON_BACKUP); } } /** Loading @@ -321,7 +330,13 @@ public class ProcessStateController { */ @GuardedBy("mLock") public void stopBackupTarget(@UserIdInt int userId) { mGlobalState.mBackupTargets.delete(userId); final ProcessRecord prev = mGlobalState.mBackupTargets.removeReturnOld(userId); if (prev == null) return; if (Flags.pushGlobalStateToOomadjuster() && Flags.autoTriggerOomadjUpdates()) { enqueueUpdateTarget(prev); runPendingUpdate(OOM_ADJ_REASON_BACKUP); } } /** Loading services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java +34 −8 Original line number Diff line number Diff line Loading @@ -1575,14 +1575,28 @@ public class MockingOomAdjusterTests { public void testUpdateOomAdj_DoOne_Backup() { ProcessRecord app = makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID, MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, true); setBackupTarget(app); setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE); setBackupTarget(app); if (Flags.pushGlobalStateToOomadjuster() && Flags.autoTriggerOomadjUpdates()) { // Do not manually run the update. } else { updateOomAdj(app); doReturn(null).when(mService.mBackupTargets).get(anyInt()); } assertProcStates(app, PROCESS_STATE_TRANSIENT_BACKGROUND, BACKUP_APP_ADJ, SCHED_GROUP_BACKGROUND); assertThatProcess(app).hasImplicitCpuTimeCapability(); stopBackupTarget(app.userId); if (Flags.pushGlobalStateToOomadjuster() && Flags.autoTriggerOomadjUpdates()) { // Do not manually run the update. } else { updateOomAdj(app); } final int expectedAdj = mService.mConstants.USE_TIERED_CACHED_ADJ ? sFirstUiCachedAdj : sFirstCachedAdj; assertProcStates(app, PROCESS_STATE_CACHED_EMPTY, expectedAdj, SCHED_GROUP_BACKGROUND); assertThatProcess(app).notHasImplicitCpuTimeCapability(); } @SuppressWarnings("GuardedBy") Loading Loading @@ -4458,17 +4472,20 @@ public class MockingOomAdjusterTests { private ProcessRecord makeDefaultProcessRecord(int pid, int uid, String processName, String packageName, boolean hasShownUi) { return new ProcessRecordBuilder(pid, uid, processName, packageName).setHasShownUi( hasShownUi).build(); final ProcessRecord proc = new ProcessRecordBuilder(pid, uid, processName, packageName).setHasShownUi(hasShownUi).build(); updateProcessLru(proc); return proc; } private ProcessRecord makeSpiedProcessRecord(int pid, int uid, String processName, String packageName, boolean hasShownUi) { final ProcessRecord proc = spy( makeDefaultProcessRecord(pid, uid, processName, packageName, hasShownUi)); final ProcessRecord proc = spy(new ProcessRecordBuilder(pid, uid, processName, packageName).setHasShownUi(hasShownUi).build()); final WindowProcessController wpc = proc.getWindowProcessController(); // Need to overwrite the WindowProcessController.mOwner with the new spy object setFieldValue(WindowProcessController.class, wpc, "mOwner", proc); updateProcessLru(proc); return proc; } Loading Loading @@ -4628,6 +4645,15 @@ public class MockingOomAdjusterTests { } } @SuppressWarnings("GuardedBy") private void stopBackupTarget(int userId) { if (Flags.pushGlobalStateToOomadjuster()) { mProcessStateController.stopBackupTarget(userId); } else { doReturn(null).when(mService.mBackupTargets).get(anyInt()); } } private void setHasActivity(WindowProcessController wpc, boolean hasActivity) { if (Flags.pushActivityStateToOomadjuster()) { mActivityStateAsyncUpdater.setHasActivityAsync(wpc, hasActivity); Loading Loading
services/core/java/com/android/server/am/ActivityManagerService.java +15 −5 Original line number Diff line number Diff line Loading @@ -14189,8 +14189,12 @@ public class ActivityManagerService extends IActivityManager.Stub proc.mProfile.addHostingComponentType(HOSTING_COMPONENT_TYPE_BACKUP); if (Flags.pushGlobalStateToOomadjuster() && Flags.autoTriggerOomadjUpdates()) { // Do nothing, ProcessStateController will handle the update in setBackupTarget. } else { // Try not to kill the process during backup updateOomAdjLocked(proc, OOM_ADJ_REASON_BACKUP); } // If the process is already attached, schedule the creation of the backup agent now. // If it is not yet live, this will be done when it attaches to the framework. Loading Loading @@ -14316,9 +14320,15 @@ public class ActivityManagerService extends IActivityManager.Stub // Not backing this app up any more; reset its OOM adjustment final ProcessRecord proc = backupTarget.app; if (Flags.pushGlobalStateToOomadjuster() && Flags.autoTriggerOomadjUpdates()) { // Do nothing. // ProcessStateController will handle the update in stopBackupTarget. } else { // TODO(b/369300367): Triggering the update before the state is actually set // seems wrong. updateOomAdjLocked(proc, OOM_ADJ_REASON_BACKUP); } proc.setInFullBackup(false); proc.mProfile.clearHostingComponentType(HOSTING_COMPONENT_TYPE_BACKUP);
services/core/java/com/android/server/am/ProcessStateController.java +17 −2 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.server.am; import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_ACTIVITY; import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_BACKUP; import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_SERVICE_BINDER_CALL; import static android.app.ProcessMemoryState.HOSTING_COMPONENT_TYPE_BROADCAST_RECEIVER; Loading Loading @@ -108,7 +109,7 @@ public class ProcessStateController { * Add a process to evaluated the next time an update is run. */ @GuardedBy("mLock") public void enqueueUpdateTarget(@NonNull ProcessRecord proc) { public void enqueueUpdateTarget(@Nullable ProcessRecord proc) { mOomAdjuster.enqueueOomAdjTargetLocked(proc); } Loading Loading @@ -313,7 +314,15 @@ public class ProcessStateController { */ @GuardedBy("mLock") public void setBackupTarget(@NonNull ProcessRecord proc, @UserIdInt int userId) { final ProcessRecord prev = mGlobalState.mBackupTargets.get(userId); if (prev == proc) return; mGlobalState.mBackupTargets.put(userId, proc); if (Flags.pushGlobalStateToOomadjuster() && Flags.autoTriggerOomadjUpdates()) { enqueueUpdateTarget(prev); enqueueUpdateTarget(proc); runPendingUpdate(OOM_ADJ_REASON_BACKUP); } } /** Loading @@ -321,7 +330,13 @@ public class ProcessStateController { */ @GuardedBy("mLock") public void stopBackupTarget(@UserIdInt int userId) { mGlobalState.mBackupTargets.delete(userId); final ProcessRecord prev = mGlobalState.mBackupTargets.removeReturnOld(userId); if (prev == null) return; if (Flags.pushGlobalStateToOomadjuster() && Flags.autoTriggerOomadjUpdates()) { enqueueUpdateTarget(prev); runPendingUpdate(OOM_ADJ_REASON_BACKUP); } } /** Loading
services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java +34 −8 Original line number Diff line number Diff line Loading @@ -1575,14 +1575,28 @@ public class MockingOomAdjusterTests { public void testUpdateOomAdj_DoOne_Backup() { ProcessRecord app = makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID, MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, true); setBackupTarget(app); setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE); setBackupTarget(app); if (Flags.pushGlobalStateToOomadjuster() && Flags.autoTriggerOomadjUpdates()) { // Do not manually run the update. } else { updateOomAdj(app); doReturn(null).when(mService.mBackupTargets).get(anyInt()); } assertProcStates(app, PROCESS_STATE_TRANSIENT_BACKGROUND, BACKUP_APP_ADJ, SCHED_GROUP_BACKGROUND); assertThatProcess(app).hasImplicitCpuTimeCapability(); stopBackupTarget(app.userId); if (Flags.pushGlobalStateToOomadjuster() && Flags.autoTriggerOomadjUpdates()) { // Do not manually run the update. } else { updateOomAdj(app); } final int expectedAdj = mService.mConstants.USE_TIERED_CACHED_ADJ ? sFirstUiCachedAdj : sFirstCachedAdj; assertProcStates(app, PROCESS_STATE_CACHED_EMPTY, expectedAdj, SCHED_GROUP_BACKGROUND); assertThatProcess(app).notHasImplicitCpuTimeCapability(); } @SuppressWarnings("GuardedBy") Loading Loading @@ -4458,17 +4472,20 @@ public class MockingOomAdjusterTests { private ProcessRecord makeDefaultProcessRecord(int pid, int uid, String processName, String packageName, boolean hasShownUi) { return new ProcessRecordBuilder(pid, uid, processName, packageName).setHasShownUi( hasShownUi).build(); final ProcessRecord proc = new ProcessRecordBuilder(pid, uid, processName, packageName).setHasShownUi(hasShownUi).build(); updateProcessLru(proc); return proc; } private ProcessRecord makeSpiedProcessRecord(int pid, int uid, String processName, String packageName, boolean hasShownUi) { final ProcessRecord proc = spy( makeDefaultProcessRecord(pid, uid, processName, packageName, hasShownUi)); final ProcessRecord proc = spy(new ProcessRecordBuilder(pid, uid, processName, packageName).setHasShownUi(hasShownUi).build()); final WindowProcessController wpc = proc.getWindowProcessController(); // Need to overwrite the WindowProcessController.mOwner with the new spy object setFieldValue(WindowProcessController.class, wpc, "mOwner", proc); updateProcessLru(proc); return proc; } Loading Loading @@ -4628,6 +4645,15 @@ public class MockingOomAdjusterTests { } } @SuppressWarnings("GuardedBy") private void stopBackupTarget(int userId) { if (Flags.pushGlobalStateToOomadjuster()) { mProcessStateController.stopBackupTarget(userId); } else { doReturn(null).when(mService.mBackupTargets).get(anyInt()); } } private void setHasActivity(WindowProcessController wpc, boolean hasActivity) { if (Flags.pushActivityStateToOomadjuster()) { mActivityStateAsyncUpdater.setHasActivityAsync(wpc, hasActivity); Loading