diff options
| -rw-r--r-- | services/core/java/com/android/server/am/OomAdjuster.java | 11 | ||||
| -rw-r--r-- | services/core/java/com/android/server/am/UidRecord.java | 13 |
2 files changed, 22 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java index 862542e3d3d0..7d82f0c2a63e 100644 --- a/services/core/java/com/android/server/am/OomAdjuster.java +++ b/services/core/java/com/android/server/am/OomAdjuster.java @@ -1499,8 +1499,12 @@ public class OomAdjuster { && !uidRec.isCurAllowListed()) { // UID is now in the background (and not on the temp allowlist). Was it // previously in the foreground (or on the temp allowlist)? + // Or, it wasn't in the foreground / allowlist, but its last background + // timestamp is also 0, this means it's never been in the + // foreground / allowlist since it's born at all. if (!ActivityManager.isProcStateBackground(uidRec.getSetProcState()) - || uidRec.isSetAllowListed()) { + || uidRec.isSetAllowListed() + || uidRec.getLastBackgroundTime() == 0) { uidRec.setLastBackgroundTime(nowElapsed); if (mService.mDeterministicUidIdle || !mService.mHandler.hasMessages(IDLE_UIDS_MSG)) { @@ -1526,6 +1530,7 @@ public class OomAdjuster { uidRec.setIdle(false); } uidRec.setLastBackgroundTime(0); + uidRec.setLastIdleTime(0); } final boolean wasCached = uidRec.getSetProcState() > ActivityManager.PROCESS_STATE_RECEIVER; @@ -3700,12 +3705,14 @@ public class OomAdjuster { for (int i = N - 1; i >= 0; i--) { final UidRecord uidRec = mActiveUids.valueAt(i); final long bgTime = uidRec.getLastBackgroundTime(); - if (bgTime > 0 && !uidRec.isIdle()) { + final long idleTime = uidRec.getLastIdleTime(); + if (bgTime > 0 && (!uidRec.isIdle() || idleTime == 0)) { if (bgTime <= maxBgTime) { EventLogTags.writeAmUidIdle(uidRec.getUid()); synchronized (mProcLock) { uidRec.setIdle(true); uidRec.setSetIdle(true); + uidRec.setLastIdleTime(nowElapsed); } mService.doStopUidLocked(uidRec.getUid(), uidRec); } else { diff --git a/services/core/java/com/android/server/am/UidRecord.java b/services/core/java/com/android/server/am/UidRecord.java index 4329afc7e863..45fd470401e2 100644 --- a/services/core/java/com/android/server/am/UidRecord.java +++ b/services/core/java/com/android/server/am/UidRecord.java @@ -66,6 +66,9 @@ public final class UidRecord { private long mLastBackgroundTime; @CompositeRWLock({"mService", "mProcLock"}) + private long mLastIdleTime; + + @CompositeRWLock({"mService", "mProcLock"}) private boolean mEphemeral; @CompositeRWLock({"mService", "mProcLock"}) @@ -255,6 +258,16 @@ public final class UidRecord { } @GuardedBy(anyOf = {"mService", "mProcLock"}) + long getLastIdleTime() { + return mLastIdleTime; + } + + @GuardedBy({"mService", "mProcLock"}) + void setLastIdleTime(long lastActiveTime) { + mLastIdleTime = lastActiveTime; + } + + @GuardedBy(anyOf = {"mService", "mProcLock"}) boolean isEphemeral() { return mEphemeral; } |