summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/app/ActivityManager.java11
-rw-r--r--services/core/java/com/android/server/am/CachedAppOptimizer.java2
-rw-r--r--services/core/java/com/android/server/am/OomAdjuster.java204
-rw-r--r--services/core/java/com/android/server/am/OomAdjusterModernImpl.java5
-rw-r--r--services/core/java/com/android/server/am/ProcessServiceRecord.java10
-rw-r--r--services/core/java/com/android/server/am/ProcessStateController.java25
-rw-r--r--services/core/java/com/android/server/am/flags.aconfig9
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java72
8 files changed, 66 insertions, 272 deletions
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index 25b07b1fa119..36fc65a76d53 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -1017,12 +1017,6 @@ public class ActivityManager {
public static final int PROCESS_CAPABILITY_FOREGROUND_AUDIO_CONTROL = 1 << 6;
/**
- * @hide
- * Process is guaranteed cpu time (IE. it will not be frozen).
- */
- public static final int PROCESS_CAPABILITY_CPU_TIME = 1 << 7;
-
- /**
* @hide all capabilities, the ORing of all flags in {@link ProcessCapability}.
*
* Don't expose it as TestApi -- we may add new capabilities any time, which could
@@ -1034,8 +1028,7 @@ public class ActivityManager {
| PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK
| PROCESS_CAPABILITY_BFSL
| PROCESS_CAPABILITY_USER_RESTRICTED_NETWORK
- | PROCESS_CAPABILITY_FOREGROUND_AUDIO_CONTROL
- | PROCESS_CAPABILITY_CPU_TIME;
+ | PROCESS_CAPABILITY_FOREGROUND_AUDIO_CONTROL;
/**
* All implicit capabilities. This capability set is currently only used for processes under
@@ -1060,7 +1053,6 @@ public class ActivityManager {
pw.print((caps & PROCESS_CAPABILITY_BFSL) != 0 ? 'F' : '-');
pw.print((caps & PROCESS_CAPABILITY_USER_RESTRICTED_NETWORK) != 0 ? 'U' : '-');
pw.print((caps & PROCESS_CAPABILITY_FOREGROUND_AUDIO_CONTROL) != 0 ? 'A' : '-');
- pw.print((caps & PROCESS_CAPABILITY_CPU_TIME) != 0 ? 'T' : '-');
}
/** @hide */
@@ -1073,7 +1065,6 @@ public class ActivityManager {
sb.append((caps & PROCESS_CAPABILITY_BFSL) != 0 ? 'F' : '-');
sb.append((caps & PROCESS_CAPABILITY_USER_RESTRICTED_NETWORK) != 0 ? 'U' : '-');
sb.append((caps & PROCESS_CAPABILITY_FOREGROUND_AUDIO_CONTROL) != 0 ? 'A' : '-');
- sb.append((caps & PROCESS_CAPABILITY_CPU_TIME) != 0 ? 'T' : '-');
}
/**
diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java
index da5b1fd1c079..416c11090515 100644
--- a/services/core/java/com/android/server/am/CachedAppOptimizer.java
+++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java
@@ -101,7 +101,7 @@ import java.util.Random;
import java.util.Set;
import java.util.concurrent.Executor;
-public class CachedAppOptimizer {
+public final class CachedAppOptimizer {
// Flags stored in the DeviceConfig API.
@VisibleForTesting static final String KEY_USE_COMPACTION = "use_compaction";
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
index a85f49614005..08632fe09b19 100644
--- a/services/core/java/com/android/server/am/OomAdjuster.java
+++ b/services/core/java/com/android/server/am/OomAdjuster.java
@@ -19,7 +19,6 @@ package com.android.server.am;
import static android.app.ActivityManager.PROCESS_CAPABILITY_ALL;
import static android.app.ActivityManager.PROCESS_CAPABILITY_ALL_IMPLICIT;
import static android.app.ActivityManager.PROCESS_CAPABILITY_BFSL;
-import static android.app.ActivityManager.PROCESS_CAPABILITY_CPU_TIME;
import static android.app.ActivityManager.PROCESS_CAPABILITY_FOREGROUND_AUDIO_CONTROL;
import static android.app.ActivityManager.PROCESS_CAPABILITY_FOREGROUND_CAMERA;
import static android.app.ActivityManager.PROCESS_CAPABILITY_FOREGROUND_LOCATION;
@@ -156,7 +155,6 @@ import android.os.Process;
import android.os.RemoteException;
import android.os.SystemClock;
import android.os.Trace;
-import android.os.UserHandle;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Slog;
@@ -471,6 +469,7 @@ public class OomAdjuster {
}
Process.setThreadPriority(tid, priority);
}
+
}
// TODO(b/346822474): hook up global state usage.
@@ -500,8 +499,7 @@ public class OomAdjuster {
}
OomAdjuster(ActivityManagerService service, ProcessList processList, ActiveUids activeUids,
- ServiceThread adjusterThread, GlobalState globalState,
- CachedAppOptimizer cachedAppOptimizer, Injector injector) {
+ ServiceThread adjusterThread, GlobalState globalState, Injector injector) {
mService = service;
mGlobalState = globalState;
mInjector = injector;
@@ -510,7 +508,7 @@ public class OomAdjuster {
mActiveUids = activeUids;
mConstants = mService.mConstants;
- mCachedAppOptimizer = cachedAppOptimizer;
+ mCachedAppOptimizer = new CachedAppOptimizer(mService);
mCacheOomRanker = new CacheOomRanker(service);
mLogger = new OomAdjusterDebugLogger(this, mService.mConstants);
@@ -2592,7 +2590,6 @@ public class OomAdjuster {
}
capability |= getDefaultCapability(app, procState);
- capability |= getCpuCapability(app, now);
// Procstates below BFGS should never have this capability.
if (procState > PROCESS_STATE_BOUND_FOREGROUND_SERVICE) {
@@ -2735,12 +2732,8 @@ public class OomAdjuster {
if (app.mOptRecord.setShouldNotFreeze(true, dryRun,
app.mOptRecord.shouldNotFreezeReason()
| client.mOptRecord.shouldNotFreezeReason(), mAdjSeq)) {
- if (Flags.useCpuTimeCapability()) {
- // Do nothing, capability updated check will handle the dryrun output.
- } else {
- // Bail out early, as we only care about the return value for a dryrun.
- return true;
- }
+ // Bail out early, as we only care about the return value for a dryrun.
+ return true;
}
}
@@ -2751,8 +2744,6 @@ public class OomAdjuster {
// we check the final procstate, and remove it if the procsate is below BFGS.
capability |= getBfslCapabilityFromClient(client);
- capability |= getCpuCapabilityFromClient(client);
-
if (cr.notHasFlag(Context.BIND_WAIVE_PRIORITY)) {
if (cr.hasFlag(Context.BIND_INCLUDE_CAPABILITIES)) {
capability |= cstate.getCurCapability();
@@ -2811,14 +2802,9 @@ public class OomAdjuster {
app.mOptRecord.shouldNotFreezeReason()
| ProcessCachedOptimizerRecord
.SHOULD_NOT_FREEZE_REASON_BINDER_ALLOW_OOM_MANAGEMENT, mAdjSeq)) {
- if (Flags.useCpuTimeCapability()) {
- // Do nothing, capability updated check will handle the dryrun output.
- } else {
- // Bail out early, as we only care about the return value for a dryrun.
- return true;
- }
+ // Bail out early, as we only care about the return value for a dryrun.
+ return true;
}
- capability |= PROCESS_CAPABILITY_CPU_TIME;
}
// Not doing bind OOM management, so treat
// this guy more like a started service.
@@ -3060,14 +3046,9 @@ public class OomAdjuster {
app.mOptRecord.shouldNotFreezeReason()
| ProcessCachedOptimizerRecord
.SHOULD_NOT_FREEZE_REASON_BIND_WAIVE_PRIORITY, mAdjSeq)) {
- if (Flags.useCpuTimeCapability()) {
- // Do nothing, capability updated check will handle the dryrun output.
- } else {
- // Bail out early, as we only care about the return value for a dryrun.
- return true;
- }
+ // Bail out early, as we only care about the return value for a dryrun.
+ return true;
}
- capability |= PROCESS_CAPABILITY_CPU_TIME;
}
}
if (cr.hasFlag(Context.BIND_TREAT_LIKE_ACTIVITY)) {
@@ -3120,24 +3101,9 @@ public class OomAdjuster {
capability &= ~PROCESS_CAPABILITY_BFSL;
}
if (!updated) {
- if (adj < prevRawAdj || procState < prevProcState || schedGroup > prevSchedGroup) {
- updated = true;
- }
-
- if (Flags.useCpuTimeCapability()) {
- if ((capability != prevCapability)
- && ((capability & prevCapability) == prevCapability)) {
- updated = true;
- }
- } else {
- // Ignore PROCESS_CAPABILITY_CPU_TIME in capability comparison
- final int curFiltered = capability & ~PROCESS_CAPABILITY_CPU_TIME;
- final int prevFiltered = prevCapability & ~PROCESS_CAPABILITY_CPU_TIME;
- if ((curFiltered != prevFiltered)
- && ((curFiltered & prevFiltered) == prevFiltered)) {
- updated = true;
- }
- }
+ updated = adj < prevRawAdj || procState < prevProcState || schedGroup > prevSchedGroup
+ || (capability != prevCapability
+ && (capability & prevCapability) == prevCapability);
}
if (dryRun) {
@@ -3213,8 +3179,6 @@ public class OomAdjuster {
// we check the final procstate, and remove it if the procsate is below BFGS.
capability |= getBfslCapabilityFromClient(client);
- capability |= getCpuCapabilityFromClient(client);
-
if (clientProcState >= PROCESS_STATE_CACHED_ACTIVITY) {
// If the other app is cached for any reason, for purposes here
// we are going to consider it empty.
@@ -3225,12 +3189,8 @@ public class OomAdjuster {
if (app.mOptRecord.setShouldNotFreeze(true, dryRun,
app.mOptRecord.shouldNotFreezeReason()
| client.mOptRecord.shouldNotFreezeReason(), mAdjSeq)) {
- if (Flags.useCpuTimeCapability()) {
- // Do nothing, capability updated check will handle the dryrun output.
- } else {
- // Bail out early, as we only care about the return value for a dryrun.
- return true;
- }
+ // Bail out early, as we only care about the return value for a dryrun.
+ return true;
}
}
@@ -3306,25 +3266,10 @@ public class OomAdjuster {
capability &= ~PROCESS_CAPABILITY_BFSL;
}
- if (dryRun) {
- if (adj < prevRawAdj || procState < prevProcState || schedGroup > prevSchedGroup) {
- return true;
- }
-
- if (Flags.useCpuTimeCapability()) {
- if ((capability != prevCapability)
- && ((capability & prevCapability) == prevCapability)) {
- return true;
- }
- } else {
- // Ignore PROCESS_CAPABILITY_CPU_TIME in capability comparison
- final int curFiltered = capability & ~PROCESS_CAPABILITY_CPU_TIME;
- final int prevFiltered = prevCapability & ~PROCESS_CAPABILITY_CPU_TIME;
- if ((curFiltered != prevFiltered)
- && ((curFiltered & prevFiltered) == prevFiltered)) {
- return true;
- }
- }
+ if (dryRun && (adj < prevRawAdj || procState < prevProcState || schedGroup > prevSchedGroup
+ || (capability != prevCapability
+ && (capability & prevCapability) == prevCapability))) {
+ return true;
}
if (adj < prevRawAdj) {
@@ -3376,29 +3321,6 @@ public class OomAdjuster {
return baseCapabilities | networkCapabilities;
}
- private static int getCpuCapability(ProcessRecord app, long nowUptime) {
- final UidRecord uidRec = app.getUidRecord();
- if (uidRec != null && uidRec.isCurAllowListed()) {
- // Process has user visible activities.
- return PROCESS_CAPABILITY_CPU_TIME;
- }
- if (UserHandle.isCore(app.uid)) {
- // Make sure all system components are not frozen.
- return PROCESS_CAPABILITY_CPU_TIME;
- }
- if (app.mState.getCachedHasVisibleActivities()) {
- // Process has user visible activities.
- return PROCESS_CAPABILITY_CPU_TIME;
- }
- if (app.mServices.hasUndemotedShortForegroundService(nowUptime)) {
- // It running a short fgs, just give it cpu time.
- return PROCESS_CAPABILITY_CPU_TIME;
- }
- // TODO(b/370817323): Populate this method with all of the reasons to keep a process
- // unfrozen.
- return 0;
- }
-
/**
* @return the BFSL capability from a client (of a service binding or provider).
*/
@@ -3447,15 +3369,6 @@ public class OomAdjuster {
}
/**
- * @return the CPU capability from a client (of a service binding or provider).
- */
- private static int getCpuCapabilityFromClient(ProcessRecord client) {
- // Just grant CPU capability every time
- // TODO(b/370817323): Populate with reasons to not propagate cpu capability across bindings.
- return client.mState.getCurCapability() & PROCESS_CAPABILITY_CPU_TIME;
- }
-
- /**
* Checks if for the given app and client, there's a cycle that should skip over the client
* for now or use partial values to evaluate the effect of the client binding.
* @param app
@@ -4036,39 +3949,6 @@ public class OomAdjuster {
mCacheOomRanker.dump(pw);
}
- /**
- * Return whether or not a process should be frozen.
- */
- boolean getFreezePolicy(ProcessRecord proc) {
- // Reasons to not freeze:
- if (Flags.useCpuTimeCapability()) {
- if ((proc.mState.getCurCapability() & PROCESS_CAPABILITY_CPU_TIME) != 0) {
- /// App is important enough (see {@link #getCpuCapability}) or bound by something
- /// important enough to not be frozen.
- return false;
- }
- } else {
- // The CPU capability handling covers all setShouldNotFreeze paths. Must check
- // shouldNotFreeze, if the CPU capability is not being used.
- if (proc.mOptRecord.shouldNotFreeze()) {
- return false;
- }
- }
-
- if (proc.mOptRecord.isFreezeExempt()) {
- return false;
- }
-
- // Reasons to freeze:
- if (proc.mState.getCurAdj() >= FREEZER_CUTOFF_ADJ) {
- // Oomscore is in a high enough state, it is safe to freeze.
- return true;
- }
-
- // Default, do not freeze a process.
- return false;
- }
-
@GuardedBy({"mService", "mProcLock"})
void updateAppFreezeStateLSP(ProcessRecord app, @OomAdjReason int oomAdjReason,
boolean immediate, int oldOomAdj) {
@@ -4083,44 +3963,43 @@ public class OomAdjuster {
(state.getCurAdj() >= FREEZER_CUTOFF_ADJ ^ oldOomAdj >= FREEZER_CUTOFF_ADJ)
|| oldOomAdj == UNKNOWN_ADJ;
final boolean shouldNotFreezeChanged = opt.shouldNotFreezeAdjSeq() == mAdjSeq;
- final boolean hasCpuCapability =
- (PROCESS_CAPABILITY_CPU_TIME & app.mState.getCurCapability())
- == PROCESS_CAPABILITY_CPU_TIME;
- final boolean usedToHaveCpuCapability =
- (PROCESS_CAPABILITY_CPU_TIME & app.mState.getSetCapability())
- == PROCESS_CAPABILITY_CPU_TIME;
- final boolean cpuCapabilityChanged = hasCpuCapability != usedToHaveCpuCapability;
- if ((oomAdjChanged || shouldNotFreezeChanged || cpuCapabilityChanged)
+ if ((oomAdjChanged || shouldNotFreezeChanged)
&& Trace.isTagEnabled(Trace.TRACE_TAG_ACTIVITY_MANAGER)) {
Trace.instantForTrack(Trace.TRACE_TAG_ACTIVITY_MANAGER,
CachedAppOptimizer.ATRACE_FREEZER_TRACK,
"updateAppFreezeStateLSP " + app.processName
- + " pid: " + app.getPid()
+ " isFreezeExempt: " + opt.isFreezeExempt()
+ " isFrozen: " + opt.isFrozen()
+ " shouldNotFreeze: " + opt.shouldNotFreeze()
+ " shouldNotFreezeReason: " + opt.shouldNotFreezeReason()
+ " curAdj: " + state.getCurAdj()
+ " oldOomAdj: " + oldOomAdj
- + " immediate: " + immediate
- + " cpuCapability: " + hasCpuCapability);
+ + " immediate: " + immediate);
}
}
- if (getFreezePolicy(app)) {
- // This process should be frozen.
- if (immediate && !opt.isFrozen()) {
- // And it will be frozen immediately.
- mCachedAppOptimizer.freezeAppAsyncAtEarliestLSP(app);
- } else if (!opt.isFrozen() || !opt.isPendingFreeze()) {
+ if (app.mOptRecord.isFreezeExempt()) {
+ return;
+ }
+
+ // if an app is already frozen and shouldNotFreeze becomes true, immediately unfreeze
+ if (opt.isFrozen() && opt.shouldNotFreeze()) {
+ mCachedAppOptimizer.unfreezeAppLSP(app,
+ CachedAppOptimizer.getUnfreezeReasonCodeFromOomAdjReason(oomAdjReason));
+ return;
+ }
+
+ // Use current adjustment when freezing, set adjustment when unfreezing.
+ if (state.getCurAdj() >= FREEZER_CUTOFF_ADJ && !opt.isFrozen()
+ && !opt.shouldNotFreeze()) {
+ if (!immediate) {
mCachedAppOptimizer.freezeAppAsyncLSP(app);
+ } else {
+ mCachedAppOptimizer.freezeAppAsyncAtEarliestLSP(app);
}
- } else {
- // This process should not be frozen.
- if (opt.isFrozen() || opt.isPendingFreeze()) {
- mCachedAppOptimizer.unfreezeAppLSP(app,
- CachedAppOptimizer.getUnfreezeReasonCodeFromOomAdjReason(oomAdjReason));
- }
+ } else if (state.getSetAdj() < FREEZER_CUTOFF_ADJ) {
+ mCachedAppOptimizer.unfreezeAppLSP(app,
+ CachedAppOptimizer.getUnfreezeReasonCodeFromOomAdjReason(oomAdjReason));
}
}
@@ -4144,8 +4023,7 @@ public class OomAdjuster {
final int size = processes.size();
for (int i = 0; i < size; i++) {
ProcessRecord proc = processes.get(i);
- mCachedAppOptimizer.unfreezeTemporarily(proc,
- CachedAppOptimizer.getUnfreezeReasonCodeFromOomAdjReason(reason));
+ mCachedAppOptimizer.unfreezeTemporarily(proc, reason);
}
processes.clear();
}
diff --git a/services/core/java/com/android/server/am/OomAdjusterModernImpl.java b/services/core/java/com/android/server/am/OomAdjusterModernImpl.java
index 1b7e8f0bd244..8b660559f550 100644
--- a/services/core/java/com/android/server/am/OomAdjusterModernImpl.java
+++ b/services/core/java/com/android/server/am/OomAdjusterModernImpl.java
@@ -758,9 +758,8 @@ public class OomAdjusterModernImpl extends OomAdjuster {
OomAdjusterModernImpl(ActivityManagerService service, ProcessList processList,
ActiveUids activeUids, ServiceThread adjusterThread, GlobalState globalState,
- CachedAppOptimizer cachedAppOptimizer, Injector injector) {
- super(service, processList, activeUids, adjusterThread, globalState, cachedAppOptimizer,
- injector);
+ Injector injector) {
+ super(service, processList, activeUids, adjusterThread, globalState, injector);
}
private final ProcessRecordNodes mProcessRecordProcStateNodes = new ProcessRecordNodes(
diff --git a/services/core/java/com/android/server/am/ProcessServiceRecord.java b/services/core/java/com/android/server/am/ProcessServiceRecord.java
index 364497491785..5cb8b954a2ba 100644
--- a/services/core/java/com/android/server/am/ProcessServiceRecord.java
+++ b/services/core/java/com/android/server/am/ProcessServiceRecord.java
@@ -256,24 +256,18 @@ final class ProcessServiceRecord {
}
// Now we need to look at all short-FGS within the process and see if all of them are
// procstate-timed-out or not.
- return !hasUndemotedShortForegroundService(nowUptime);
- }
-
- boolean hasUndemotedShortForegroundService(long nowUptime) {
for (int i = mServices.size() - 1; i >= 0; i--) {
final ServiceRecord sr = mServices.valueAt(i);
if (!sr.isShortFgs() || !sr.hasShortFgsInfo()) {
continue;
}
if (sr.getShortFgsInfo().getProcStateDemoteTime() >= nowUptime) {
- // This short fgs has not timed out yet.
- return true;
+ return false;
}
}
- return false;
+ return true;
}
-
int getReportedForegroundServiceTypes() {
return mRepFgServiceTypes;
}
diff --git a/services/core/java/com/android/server/am/ProcessStateController.java b/services/core/java/com/android/server/am/ProcessStateController.java
index 57899228e6ad..01468c640f6c 100644
--- a/services/core/java/com/android/server/am/ProcessStateController.java
+++ b/services/core/java/com/android/server/am/ProcessStateController.java
@@ -29,7 +29,6 @@ import android.util.Slog;
import android.util.SparseArray;
import com.android.internal.annotations.GuardedBy;
-import com.android.internal.annotations.VisibleForTesting;
import com.android.server.ServiceThread;
/**
@@ -45,14 +44,13 @@ public class ProcessStateController {
private final GlobalState mGlobalState = new GlobalState();
private ProcessStateController(ActivityManagerService ams, ProcessList processList,
- ActiveUids activeUids, ServiceThread handlerThread,
- CachedAppOptimizer cachedAppOptimizer, OomAdjuster.Injector oomAdjInjector,
+ ActiveUids activeUids, ServiceThread handlerThread, OomAdjuster.Injector oomAdjInjector,
boolean useOomAdjusterModernImpl) {
mOomAdjuster = useOomAdjusterModernImpl
? new OomAdjusterModernImpl(ams, processList, activeUids, handlerThread,
- mGlobalState, cachedAppOptimizer, oomAdjInjector)
+ mGlobalState, oomAdjInjector)
: new OomAdjuster(ams, processList, activeUids, handlerThread, mGlobalState,
- cachedAppOptimizer, oomAdjInjector);
+ oomAdjInjector);
}
/**
@@ -596,7 +594,6 @@ public class ProcessStateController {
private final ActiveUids mActiveUids;
private ServiceThread mHandlerThread = null;
- private CachedAppOptimizer mCachedAppOptimizer = null;
private OomAdjuster.Injector mOomAdjInjector = null;
private boolean mUseOomAdjusterModernImpl = false;
@@ -613,38 +610,24 @@ public class ProcessStateController {
if (mHandlerThread == null) {
mHandlerThread = OomAdjuster.createAdjusterThread();
}
- if (mCachedAppOptimizer == null) {
- mCachedAppOptimizer = new CachedAppOptimizer(mAms);
- }
if (mOomAdjInjector == null) {
mOomAdjInjector = new OomAdjuster.Injector();
}
return new ProcessStateController(mAms, mProcessList, mActiveUids, mHandlerThread,
- mCachedAppOptimizer, mOomAdjInjector, mUseOomAdjusterModernImpl);
+ mOomAdjInjector, mUseOomAdjusterModernImpl);
}
/**
* For Testing Purposes. Set what thread OomAdjuster will offload tasks on to.
*/
- @VisibleForTesting
public Builder setHandlerThread(ServiceThread handlerThread) {
mHandlerThread = handlerThread;
return this;
}
/**
- * For Testing Purposes. Set the CachedAppOptimzer used by OomAdjuster.
- */
- @VisibleForTesting
- public Builder setCachedAppOptimizer(CachedAppOptimizer cachedAppOptimizer) {
- mCachedAppOptimizer = cachedAppOptimizer;
- return this;
- }
-
- /**
* For Testing Purposes. Set an injector for OomAdjuster.
*/
- @VisibleForTesting
public Builder setOomAdjusterInjector(OomAdjuster.Injector injector) {
mOomAdjInjector = injector;
return this;
diff --git a/services/core/java/com/android/server/am/flags.aconfig b/services/core/java/com/android/server/am/flags.aconfig
index bde3ff61c239..7b4d6c7fff82 100644
--- a/services/core/java/com/android/server/am/flags.aconfig
+++ b/services/core/java/com/android/server/am/flags.aconfig
@@ -250,11 +250,4 @@ flag {
is_fixed_read_only: true
description: "Add +X to the prev scores according to their positions in the process LRU list"
bug: "359912586"
-}
-
-flag {
- name: "use_cpu_time_capability"
- namespace: "backstage_power"
- description: "Use PROCESS_CAPABILITY_CPU_TIME to control unfreeze state."
- bug: "370817323"
-}
+} \ No newline at end of file
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 f82a86092064..4a1315583ad4 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java
@@ -109,7 +109,6 @@ import android.platform.test.annotations.Presubmit;
import android.platform.test.flag.junit.SetFlagsRule;
import android.util.ArrayMap;
import android.util.SparseArray;
-import android.util.SparseBooleanArray;
import android.util.SparseIntArray;
import com.android.server.LocalServices;
@@ -176,7 +175,6 @@ public class MockingOomAdjusterTests {
private ActiveUids mActiveUids;
private PackageManagerInternal mPackageManagerInternal;
private ActivityManagerService mService;
- private TestCachedAppOptimizer mTestCachedAppOptimizer;
private OomAdjusterInjector mInjector = new OomAdjusterInjector();
private int mUiTierSize;
@@ -244,11 +242,9 @@ public class MockingOomAdjusterTests {
doNothing().when(pr).enqueueProcessChangeItemLocked(anyInt(), anyInt(), anyInt(),
anyBoolean());
mActiveUids = new ActiveUids(mService, false);
- mTestCachedAppOptimizer = new TestCachedAppOptimizer(mService);
mProcessStateController = new ProcessStateController.Builder(mService,
mService.mProcessList, mActiveUids)
.useModernOomAdjuster(mService.mConstants.ENABLE_NEW_OOMADJ)
- .setCachedAppOptimizer(mTestCachedAppOptimizer)
.setOomAdjusterInjector(mInjector)
.build();
mService.mProcessStateController = mProcessStateController;
@@ -3114,13 +3110,13 @@ public class MockingOomAdjusterTests {
mProcessStateController.setUidTempAllowlistStateLSP(MOCKAPP_UID, true);
assertEquals(true, app.getUidRecord().isSetAllowListed());
- assertFreezeState(app, false);
- assertFreezeState(app2, false);
+ assertEquals(true, app.mOptRecord.shouldNotFreeze());
+ assertEquals(true, app2.mOptRecord.shouldNotFreeze());
mProcessStateController.setUidTempAllowlistStateLSP(MOCKAPP_UID, false);
assertEquals(false, app.getUidRecord().isSetAllowListed());
- assertFreezeState(app, true);
- assertFreezeState(app2, true);
+ assertEquals(false, app.mOptRecord.shouldNotFreeze());
+ assertEquals(false, app2.mOptRecord.shouldNotFreeze());
}
@SuppressWarnings("GuardedBy")
@@ -3142,25 +3138,25 @@ public class MockingOomAdjusterTests {
assertEquals(true, app.getUidRecord().isSetAllowListed());
assertEquals(true, app2.getUidRecord().isSetAllowListed());
- assertFreezeState(app, false);
- assertFreezeState(app2, false);
- assertFreezeState(app3, false);
+ assertEquals(true, app.mOptRecord.shouldNotFreeze());
+ assertEquals(true, app2.mOptRecord.shouldNotFreeze());
+ assertEquals(true, app3.mOptRecord.shouldNotFreeze());
// Remove app1 from allowlist.
mProcessStateController.setUidTempAllowlistStateLSP(MOCKAPP_UID, false);
assertEquals(false, app.getUidRecord().isSetAllowListed());
assertEquals(true, app2.getUidRecord().isSetAllowListed());
- assertFreezeState(app, true);
- assertFreezeState(app2, false);
- assertFreezeState(app3, false);
+ assertEquals(false, app.mOptRecord.shouldNotFreeze());
+ assertEquals(true, app2.mOptRecord.shouldNotFreeze());
+ assertEquals(true, app3.mOptRecord.shouldNotFreeze());
// Now remove app2 from allowlist.
mProcessStateController.setUidTempAllowlistStateLSP(MOCKAPP2_UID, false);
assertEquals(false, app.getUidRecord().isSetAllowListed());
assertEquals(false, app2.getUidRecord().isSetAllowListed());
- assertFreezeState(app, true);
- assertFreezeState(app2, true);
- assertFreezeState(app3, true);
+ assertEquals(false, app.mOptRecord.shouldNotFreeze());
+ assertEquals(false, app2.mOptRecord.shouldNotFreeze());
+ assertEquals(false, app3.mOptRecord.shouldNotFreeze());
}
@SuppressWarnings("GuardedBy")
@@ -3374,14 +3370,6 @@ public class MockingOomAdjusterTests {
assertEquals(expectedCached, state.isCached());
}
- @SuppressWarnings("GuardedBy")
- private void assertFreezeState(ProcessRecord app, boolean expectedFreezeState) {
- boolean actualFreezeState = mTestCachedAppOptimizer.mLastSetFreezeState.get(app.getPid(),
- false);
- assertEquals("Unexcepted freeze state for " + app.processName, expectedFreezeState,
- actualFreezeState);
- }
-
private class ProcessRecordBuilder {
@SuppressWarnings("UnusedVariable")
int mPid;
@@ -3525,39 +3513,6 @@ public class MockingOomAdjusterTests {
return app;
}
}
- private static final class TestProcessDependencies
- implements CachedAppOptimizer.ProcessDependencies {
- @Override
- public long[] getRss(int pid) {
- return new long[]{/*totalRSS*/ 0, /*fileRSS*/ 0, /*anonRSS*/ 0, /*swap*/ 0};
- }
-
- @Override
- public void performCompaction(CachedAppOptimizer.CompactProfile action, int pid) {}
- }
-
- private static class TestCachedAppOptimizer extends CachedAppOptimizer {
- private SparseBooleanArray mLastSetFreezeState = new SparseBooleanArray();
-
- TestCachedAppOptimizer(ActivityManagerService ams) {
- super(ams, null, new TestProcessDependencies());
- }
-
- @Override
- public boolean useFreezer() {
- return true;
- }
-
- @Override
- public void freezeAppAsyncLSP(ProcessRecord app) {
- mLastSetFreezeState.put(app.getPid(), true);
- }
-
- @Override
- public void unfreezeAppLSP(ProcessRecord app, @UnfreezeReason int reason) {
- mLastSetFreezeState.put(app.getPid(), false);
- }
- }
static class OomAdjusterInjector extends OomAdjuster.Injector {
// Jump ahead in time by this offset amount.
@@ -3569,6 +3524,7 @@ public class MockingOomAdjusterTests {
mLastSetOomAdj.clear();
}
+
void jumpUptimeAheadTo(long uptimeMillis) {
final long jumpMs = uptimeMillis - getUptimeMillis();
if (jumpMs <= 0) return;