Merge "Remove mCached and mEmpty from PSR and calculate on query" into main
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
index df46e5d..9568116 100644
--- a/services/core/java/com/android/server/am/OomAdjuster.java
+++ b/services/core/java/com/android/server/am/OomAdjuster.java
@@ -1628,6 +1628,7 @@
int appUid;
int logUid;
int processStateCurTop;
+ String mAdjType;
ProcessStateRecord mState;
void initialize(ProcessRecord app, int adj, boolean foregroundActivities,
@@ -1642,6 +1643,7 @@
this.appUid = appUid;
this.logUid = logUid;
this.processStateCurTop = processStateCurTop;
+ mAdjType = app.mState.getAdjType();
this.mState = app.mState;
}
@@ -1650,14 +1652,14 @@
// App has a visible activity; only upgrade adjustment.
if (adj > VISIBLE_APP_ADJ) {
adj = VISIBLE_APP_ADJ;
- mState.setAdjType("vis-activity");
+ mAdjType = "vis-activity";
if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise adj to vis-activity: " + app);
}
}
if (procState > processStateCurTop) {
procState = processStateCurTop;
- mState.setAdjType("vis-activity");
+ mAdjType = "vis-activity";
if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
reportOomAdjMessageLocked(TAG_OOM_ADJ,
"Raise procstate to vis-activity (top): " + app);
@@ -1666,8 +1668,6 @@
if (schedGroup < SCHED_GROUP_DEFAULT) {
schedGroup = SCHED_GROUP_DEFAULT;
}
- mState.setCached(false);
- mState.setEmpty(false);
foregroundActivities = true;
mHasVisibleActivities = true;
}
@@ -1676,14 +1676,14 @@
public void onPausedActivity() {
if (adj > PERCEPTIBLE_APP_ADJ) {
adj = PERCEPTIBLE_APP_ADJ;
- mState.setAdjType("pause-activity");
+ mAdjType = "pause-activity";
if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise adj to pause-activity: " + app);
}
}
if (procState > processStateCurTop) {
procState = processStateCurTop;
- mState.setAdjType("pause-activity");
+ mAdjType = "pause-activity";
if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
reportOomAdjMessageLocked(TAG_OOM_ADJ,
"Raise procstate to pause-activity (top): " + app);
@@ -1692,8 +1692,6 @@
if (schedGroup < SCHED_GROUP_DEFAULT) {
schedGroup = SCHED_GROUP_DEFAULT;
}
- mState.setCached(false);
- mState.setEmpty(false);
foregroundActivities = true;
mHasVisibleActivities = false;
}
@@ -1702,7 +1700,7 @@
public void onStoppingActivity(boolean finishing) {
if (adj > PERCEPTIBLE_APP_ADJ) {
adj = PERCEPTIBLE_APP_ADJ;
- mState.setAdjType("stop-activity");
+ mAdjType = "stop-activity";
if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
reportOomAdjMessageLocked(TAG_OOM_ADJ,
"Raise adj to stop-activity: " + app);
@@ -1718,15 +1716,13 @@
if (!finishing) {
if (procState > PROCESS_STATE_LAST_ACTIVITY) {
procState = PROCESS_STATE_LAST_ACTIVITY;
- mState.setAdjType("stop-activity");
+ mAdjType = "stop-activity";
if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
reportOomAdjMessageLocked(TAG_OOM_ADJ,
"Raise procstate to stop-activity: " + app);
}
}
}
- mState.setCached(false);
- mState.setEmpty(false);
foregroundActivities = true;
mHasVisibleActivities = false;
}
@@ -1735,7 +1731,7 @@
public void onOtherActivity() {
if (procState > PROCESS_STATE_CACHED_ACTIVITY) {
procState = PROCESS_STATE_CACHED_ACTIVITY;
- mState.setAdjType("cch-act");
+ mAdjType = "cch-act";
if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
reportOomAdjMessageLocked(TAG_OOM_ADJ,
"Raise procstate to cached activity: " + app);
@@ -1791,8 +1787,6 @@
state.setAdjTypeCode(ActivityManager.RunningAppProcessInfo.REASON_UNKNOWN);
state.setAdjSource(null);
state.setAdjTarget(null);
- state.setEmpty(false);
- state.setCached(false);
if (!couldRecurse || !cycleReEval) {
// Don't reset this flag when doing cycles re-evaluation.
state.setNoKillOnBgRestrictedAndIdle(false);
@@ -1944,8 +1938,6 @@
adj = cachedAdj;
procState = PROCESS_STATE_CACHED_EMPTY;
if (!couldRecurse || !state.containsCycle()) {
- state.setCached(true);
- state.setEmpty(true);
state.setAdjType("cch-empty");
}
if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
@@ -1964,6 +1956,7 @@
hasVisibleActivities = state.getCachedHasVisibleActivities();
procState = state.getCachedProcState();
schedGroup = state.getCachedSchedGroup();
+ state.setAdjType(state.getCachedAdjType());
}
if (procState > PROCESS_STATE_CACHED_RECENT && state.getCachedHasRecentTasks()) {
@@ -2021,7 +2014,6 @@
adj = newAdj;
procState = newProcState;
state.setAdjType(adjType);
- state.setCached(false);
schedGroup = SCHED_GROUP_DEFAULT;
if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
@@ -2079,7 +2071,6 @@
// thus out of background check), so we yes the best background level we can.
adj = PERCEPTIBLE_APP_ADJ;
procState = PROCESS_STATE_TRANSIENT_BACKGROUND;
- state.setCached(false);
state.setAdjType("force-imp");
state.setAdjSource(state.getForcingToImportant());
schedGroup = SCHED_GROUP_DEFAULT;
@@ -2094,7 +2085,6 @@
// We don't want to kill the current heavy-weight process.
adj = HEAVY_WEIGHT_APP_ADJ;
schedGroup = SCHED_GROUP_BACKGROUND;
- state.setCached(false);
state.setAdjType("heavy");
if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise adj to heavy: " + app);
@@ -2115,7 +2105,6 @@
// home app, so we don't want to let it go into the background.
adj = HOME_APP_ADJ;
schedGroup = SCHED_GROUP_BACKGROUND;
- state.setCached(false);
state.setAdjType("home");
if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise adj to home: " + app);
@@ -2149,7 +2138,6 @@
if (adj > PREVIOUS_APP_ADJ) {
adj = PREVIOUS_APP_ADJ;
schedGroup = SCHED_GROUP_BACKGROUND;
- state.setCached(false);
state.setAdjType("previous");
if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise adj to prev: " + app);
@@ -2197,7 +2185,6 @@
if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise adj to backup: " + app);
}
- state.setCached(false);
}
if (procState > ActivityManager.PROCESS_STATE_BACKUP) {
procState = ActivityManager.PROCESS_STATE_BACKUP;
@@ -2251,7 +2238,6 @@
reportOomAdjMessageLocked(TAG_OOM_ADJ,
"Raise adj to started service: " + app);
}
- state.setCached(false);
}
}
// If we have let the service slide into the background
@@ -2376,7 +2362,6 @@
adj = FOREGROUND_APP_ADJ;
state.setCurRawAdj(adj);
schedGroup = SCHED_GROUP_DEFAULT;
- state.setCached(false);
state.setAdjType("ext-provider");
state.setAdjTarget(cpr.name);
if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
@@ -2399,7 +2384,6 @@
if (adj > PREVIOUS_APP_ADJ) {
adj = PREVIOUS_APP_ADJ;
schedGroup = SCHED_GROUP_BACKGROUND;
- state.setCached(false);
state.setAdjType("recent-provider");
if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
reportOomAdjMessageLocked(TAG_OOM_ADJ,
@@ -2707,10 +2691,12 @@
if (adj > clientAdj) {
adjType = "cch-bound-ui-services";
}
- if (state.setCached(false, dryRun)) {
+
+ if (state.isCached() && dryRun) {
// Bail out early, as we only care about the return value for a dryrun.
return true;
}
+
clientAdj = adj;
clientProcState = procState;
} else {
@@ -2795,12 +2781,14 @@
newAdj = adj;
}
}
+
if (!cstate.isCached()) {
- if (state.setCached(false, dryRun)) {
+ if (state.isCached() && dryRun) {
// Bail out early, as we only care about the return value for a dryrun.
return true;
}
}
+
if (adj > newAdj) {
adj = newAdj;
if (state.setCurRawAdj(adj, dryRun)) {
@@ -2958,8 +2946,8 @@
schedGroup = SCHED_GROUP_DEFAULT;
}
}
+
if (!dryRun) {
- state.setCached(false);
state.setAdjType("service");
state.setAdjTypeCode(ActivityManager.RunningAppProcessInfo
.REASON_SERVICE_IN_USE);
@@ -3000,7 +2988,6 @@
}
state.setCurCapability(capability);
- state.setEmpty(false);
return updated;
}
@@ -3090,7 +3077,8 @@
}
adjType = "provider";
}
- if (state.setCached(state.isCached() & cstate.isCached(), dryRun)) {
+
+ if (state.isCached() && !cstate.isCached() && dryRun) {
// Bail out early, as we only care about the return value for a dryrun.
return true;
}
@@ -3157,7 +3145,6 @@
}
state.setCurCapability(capability);
- state.setEmpty(false);
return false;
}
@@ -3614,7 +3601,6 @@
state.setCurProcState(initialProcState);
state.setCurRawProcState(initialProcState);
state.setCurCapability(initialCapability);
- state.setCached(initialCached);
state.setCurAdj(ProcessList.FOREGROUND_APP_ADJ);
state.setCurRawAdj(ProcessList.FOREGROUND_APP_ADJ);
diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java
index 9883f09..7009bd0 100644
--- a/services/core/java/com/android/server/am/ProcessRecord.java
+++ b/services/core/java/com/android/server/am/ProcessRecord.java
@@ -1122,11 +1122,6 @@
mInFullBackup = inFullBackup;
}
- @GuardedBy("mService")
- public void setCached(boolean cached) {
- mState.setCached(cached);
- }
-
@Override
@GuardedBy("mService")
public boolean isCached() {
diff --git a/services/core/java/com/android/server/am/ProcessStateRecord.java b/services/core/java/com/android/server/am/ProcessStateRecord.java
index 8362eaf..8de748e 100644
--- a/services/core/java/com/android/server/am/ProcessStateRecord.java
+++ b/services/core/java/com/android/server/am/ProcessStateRecord.java
@@ -17,6 +17,7 @@
package com.android.server.am;
import static android.app.ActivityManager.PROCESS_CAPABILITY_NONE;
+import static android.app.ActivityManager.PROCESS_STATE_CACHED_EMPTY;
import static android.app.ActivityManager.PROCESS_STATE_NONEXISTENT;
import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_UI_VISIBILITY;
import static android.app.ProcessMemoryState.HOSTING_COMPONENT_TYPE_ACTIVITY;
@@ -24,6 +25,7 @@
import static android.app.ProcessMemoryState.HOSTING_COMPONENT_TYPE_STARTED_SERVICE;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_OOM_ADJ;
+import static com.android.server.am.ProcessList.CACHED_APP_MIN_ADJ;
import static com.android.server.am.ProcessRecord.TAG;
import android.annotation.ElapsedRealtimeLong;
@@ -283,18 +285,6 @@
private long mLastTopTime = Long.MIN_VALUE;
/**
- * Is this an empty background process?
- */
- @GuardedBy("mService")
- private boolean mEmpty;
-
- /**
- * Is this a cached process?
- */
- @GuardedBy("mService")
- private boolean mCached;
-
- /**
* This is a system process, but not currently showing UI.
*/
@GuardedBy("mService")
@@ -395,7 +385,7 @@
private boolean mNoKillOnBgRestrictedAndIdle;
/**
- * Last set value of {@link #mCached}.
+ * Last set value of {@link #isCached()}.
*/
@GuardedBy("mService")
private boolean mSetCached;
@@ -408,7 +398,7 @@
/**
* The last time when the {@link #mNoKillOnBgRestrictedAndIdle} is false and the
- * {@link #mCached} is true, and either the former state is flipping from true to false
+ * {@link #isCached()} is true, and either the former state is flipping from true to false
* when latter state is true, or the latter state is flipping from false to true when the
* former state is false.
*/
@@ -446,6 +436,8 @@
};
@GuardedBy("mService")
+ private String mCachedAdjType = null;
+ @GuardedBy("mService")
private int mCachedAdj = ProcessList.INVALID_ADJ;
@GuardedBy("mService")
private boolean mCachedForegroundActivities = false;
@@ -535,7 +527,7 @@
@GuardedBy(anyOf = {"mService", "mProcLock"})
int getSetAdjWithServices() {
- if (mSetAdj >= ProcessList.CACHED_APP_MIN_ADJ) {
+ if (mSetAdj >= CACHED_APP_MIN_ADJ) {
if (mHasStartedServices) {
return ProcessList.SERVICE_B_ADJ;
}
@@ -915,36 +907,13 @@
}
@GuardedBy("mService")
- void setEmpty(boolean empty) {
- mEmpty = empty;
- }
-
- @GuardedBy("mService")
boolean isEmpty() {
- return mEmpty;
- }
-
- @GuardedBy("mService")
- void setCached(boolean cached) {
- setCached(cached, false);
- }
-
- /**
- * @return {@code true} if it's a dry run and it's going to uncache the process
- * if it was a real run.
- */
- @GuardedBy("mService")
- boolean setCached(boolean cached, boolean dryRun) {
- if (dryRun) {
- return mCached && !cached;
- }
- mCached = cached;
- return false;
+ return mCurProcState >= PROCESS_STATE_CACHED_EMPTY;
}
@GuardedBy("mService")
boolean isCached() {
- return mCached;
+ return mCurAdj >= CACHED_APP_MIN_ADJ;
}
@GuardedBy("mService")
@@ -1041,6 +1010,7 @@
mCachedForegroundActivities = false;
mCachedProcState = ActivityManager.PROCESS_STATE_CACHED_EMPTY;
mCachedSchedGroup = ProcessList.SCHED_GROUP_BACKGROUND;
+ mCachedAdjType = null;
}
@GuardedBy("mService")
@@ -1152,6 +1122,7 @@
mCachedHasVisibleActivities = callback.mHasVisibleActivities ? VALUE_TRUE : VALUE_FALSE;
mCachedProcState = callback.procState;
mCachedSchedGroup = callback.schedGroup;
+ mCachedAdjType = callback.mAdjType;
if (mCachedAdj == ProcessList.VISIBLE_APP_ADJ) {
mCachedAdj += minLayer;
@@ -1179,6 +1150,11 @@
}
@GuardedBy("mService")
+ String getCachedAdjType() {
+ return mCachedAdjType;
+ }
+
+ @GuardedBy("mService")
boolean shouldScheduleLikeTopApp() {
return mScheduleLikeTopApp;
}
@@ -1381,8 +1357,8 @@
pw.print(prefix); pw.print("hasShownUi="); pw.print(mHasShownUi);
pw.print(" pendingUiClean="); pw.println(mApp.mProfile.hasPendingUiClean());
}
- pw.print(prefix); pw.print("cached="); pw.print(mCached);
- pw.print(" empty="); pw.println(mEmpty);
+ pw.print(prefix); pw.print("cached="); pw.print(isCached());
+ pw.print(" empty="); pw.println(isEmpty());
if (mServiceB) {
pw.print(prefix); pw.print("serviceb="); pw.print(mServiceB);
pw.print(" serviceHighRam="); pw.println(mServiceHighRam);
diff --git a/services/tests/mockingservicestests/src/com/android/server/am/CacheOomRankerTest.java b/services/tests/mockingservicestests/src/com/android/server/am/CacheOomRankerTest.java
index dfb8fda..240ddf5 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/CacheOomRankerTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/CacheOomRankerTest.java
@@ -751,7 +751,6 @@
app.mState.setCurAdj(setAdj);
app.setLastActivityTime(lastActivityTime);
mPidToRss.put(app.getPid(), lastRss);
- app.mState.setCached(false);
for (int i = 0; i < wentToForegroundCount; ++i) {
app.mState.setSetProcState(ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
app.mState.setSetProcState(ActivityManager.PROCESS_STATE_CACHED_RECENT);
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 47928bc..1226f0c 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java
@@ -470,6 +470,7 @@
ProcessRecord app = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID,
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, true));
app.mState.setCurRawAdj(CACHED_APP_MIN_ADJ);
+ app.mState.setCurAdj(CACHED_APP_MIN_ADJ);
doReturn(null).when(sService).getTopApp();
sService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app);
@@ -494,6 +495,8 @@
field.set(callback, PROCESS_STATE_TOP);
field = callback.getClass().getDeclaredField("schedGroup");
field.set(callback, SCHED_GROUP_TOP_APP);
+ field = callback.getClass().getDeclaredField("mAdjType");
+ field.set(callback, "vis-activity");
return 0;
})).when(wpc).computeOomAdjFromActivities(
any(WindowProcessController.ComputeOomAdjCallback.class));
@@ -501,6 +504,9 @@
updateOomAdj(app);
assertProcStates(app, PROCESS_STATE_TOP, VISIBLE_APP_ADJ, SCHED_GROUP_TOP_APP);
+ assertFalse(app.mState.isCached());
+ assertFalse(app.mState.isEmpty());
+ assertEquals("vis-activity", app.mState.getAdjType());
}
@SuppressWarnings("GuardedBy")
@@ -871,8 +877,8 @@
public void testUpdateOomAdj_DoOne_NonCachedToCached() {
ProcessRecord app = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID,
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, false));
- app.mState.setCached(false);
app.mState.setCurRawAdj(SERVICE_ADJ);
+ app.mState.setCurAdj(SERVICE_ADJ);
doReturn(null).when(sService).getTopApp();
sService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app);
@@ -2546,7 +2552,6 @@
s.startRequested = true;
s.lastActivity = now;
- app.mState.setCached(false);
app.mServices.startService(s);
app.mState.setHasShownUi(true);
@@ -2559,7 +2564,6 @@
s2.startRequested = true;
s2.lastActivity = now - sService.mConstants.MAX_SERVICE_INACTIVITY - 1;
- app2.mState.setCached(false);
app2.mServices.startService(s2);
app2.mState.setHasShownUi(false);
@@ -2577,7 +2581,6 @@
assertProcStates(app, false, PROCESS_STATE_SERVICE, SERVICE_ADJ, "started-services");
- app.mState.setCached(false);
app.mState.setSetProcState(PROCESS_STATE_NONEXISTENT);
app.mState.setAdjType(null);
app.mState.setSetAdj(UNKNOWN_ADJ);
@@ -2605,7 +2608,6 @@
assertProcStates(app, false, PROCESS_STATE_SERVICE, SERVICE_ADJ, "started-services");
assertProcStates(app2, true, PROCESS_STATE_SERVICE, cachedAdj1, "cch-started-services");
- app.mState.setCached(true);
app.mState.setSetProcState(PROCESS_STATE_NONEXISTENT);
app.mState.setAdjType(null);
app.mState.setSetAdj(UNKNOWN_ADJ);
@@ -3035,7 +3037,6 @@
state.setHasTopUi(mHasTopUi);
state.setRunningRemoteAnimation(mRunningRemoteAnimation);
state.setHasOverlayUi(mHasOverlayUi);
- state.setCached(mCached);
state.setLastTopTime(mLastTopTime);
state.setForcingToImportant(mForcingToImportant);
services.setConnectionGroup(mConnectionGroup);
diff --git a/services/tests/mockingservicestests/src/com/android/server/am/ServiceBindingOomAdjPolicyTest.java b/services/tests/mockingservicestests/src/com/android/server/am/ServiceBindingOomAdjPolicyTest.java
index 2f12a3b..709a804 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/ServiceBindingOomAdjPolicyTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/ServiceBindingOomAdjPolicyTest.java
@@ -21,7 +21,6 @@
import static android.app.ActivityManager.PROCESS_STATE_CACHED_EMPTY;
import static android.app.ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE;
import static android.app.ActivityManager.PROCESS_STATE_HOME;
-import static android.app.ActivityManager.PROCESS_STATE_LAST_ACTIVITY;
import static android.app.ActivityManager.PROCESS_STATE_SERVICE;
import static android.content.Context.BIND_AUTO_CREATE;
import static android.content.Context.BIND_INCLUDE_CAPABILITIES;
@@ -30,10 +29,10 @@
import static android.os.UserHandle.USER_SYSTEM;
import static android.platform.test.flag.junit.SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT;
+import static com.android.server.am.ProcessList.CACHED_APP_MIN_ADJ;
import static com.android.server.am.ProcessList.HOME_APP_ADJ;
import static com.android.server.am.ProcessList.PERCEPTIBLE_APP_ADJ;
import static com.android.server.am.ProcessList.SERVICE_ADJ;
-import static com.android.server.am.ProcessList.CACHED_APP_MIN_ADJ;
import static org.junit.Assert.assertNotEquals;
import static org.mockito.ArgumentMatchers.any;
@@ -47,8 +46,8 @@
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
@@ -582,7 +581,6 @@
app.mState.setSetAdj(adj);
app.mState.setCurCapability(cap);
app.mState.setSetCapability(cap);
- app.mState.setCached(procState >= PROCESS_STATE_LAST_ACTIVITY || adj >= CACHED_APP_MIN_ADJ);
return app;
}