From 766e7d730b517875a0c3790b1ae823bf6373f960 Mon Sep 17 00:00:00 2001 From: Jing Ji Date: Sat, 29 May 2021 02:57:59 -0700 Subject: [PATCH] Do not kill process bound with WAIVE_PRIORITY / ALLOW_OOM_MANAGEMENT ...when it's cached & idle and in forced-app-standby mode, if the client app is not cached. Bug: 189598723 Test: atest FrameworksServicesTests:ActivityManagerTest Test: atest FrameworksMockingServicesTests:AppStateTrackerTest Test: Manual - make such bindings from non-cached app and verify it Change-Id: I96e4160711cf3d29cb3fc810df505ca4dd6f8e89 --- .../java/com/android/server/am/OomAdjuster.java | 7 +++++++ .../java/com/android/server/am/ProcessList.java | 1 + .../android/server/am/ProcessStateRecord.java | 17 +++++++++++++++++ 3 files changed, 25 insertions(+) diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java index 661e0b886c254..b1bb108e7f832 100644 --- a/services/core/java/com/android/server/am/OomAdjuster.java +++ b/services/core/java/com/android/server/am/OomAdjuster.java @@ -1573,6 +1573,7 @@ public class OomAdjuster { state.setAdjTarget(null); state.setEmpty(false); state.setCached(false); + state.setNoKillOnForcedAppStandbyAndIdle(false); state.resetAllowStartFgsState(); app.mOptRecord.setShouldNotFreeze(false); @@ -2061,6 +2062,9 @@ public class OomAdjuster { // Similar to BIND_WAIVE_PRIORITY, keep it unfrozen. if (clientAdj < ProcessList.CACHED_APP_MIN_ADJ) { app.mOptRecord.setShouldNotFreeze(true); + // Similarly, we shouldn't kill it when it's in forced-app-standby + // mode and cached & idle state. + app.mState.setNoKillOnForcedAppStandbyAndIdle(true); } // Not doing bind OOM management, so treat // this guy more like a started service. @@ -2265,6 +2269,9 @@ public class OomAdjuster { // unfrozen. if (clientAdj < ProcessList.CACHED_APP_MIN_ADJ) { app.mOptRecord.setShouldNotFreeze(true); + // Similarly, we shouldn't kill it when it's in forced-app-standby + // mode and cached & idle state. + app.mState.setNoKillOnForcedAppStandbyAndIdle(true); } } if ((cr.flags&Context.BIND_TREAT_LIKE_ACTIVITY) != 0) { diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java index 9098e68392fd3..3bfd62b60c895 100644 --- a/services/core/java/com/android/server/am/ProcessList.java +++ b/services/core/java/com/android/server/am/ProcessList.java @@ -5043,6 +5043,7 @@ public final class ProcessList { final UidRecord uidRec = app.getUidRecord(); if (mService.mConstants.mKillForceAppStandByAndCachedIdle && uidRec != null && uidRec.isIdle() + && !app.mState.shouldNotKillOnForcedAppStandbyAndIdle() && app.isCached() && app.mState.isForcedAppStandby()) { app.killLocked("cached idle & forced-app-standby", ApplicationExitInfo.REASON_OTHER, diff --git a/services/core/java/com/android/server/am/ProcessStateRecord.java b/services/core/java/com/android/server/am/ProcessStateRecord.java index 1fb5572cc5fe9..efcc502380a60 100644 --- a/services/core/java/com/android/server/am/ProcessStateRecord.java +++ b/services/core/java/com/android/server/am/ProcessStateRecord.java @@ -363,6 +363,13 @@ final class ProcessStateRecord { @ElapsedRealtimeLong private long mLastInvisibleTime; + /** + * Whether or not this process could be killed when it's in forced-app-standby mode + * and cached & idle state. + */ + @GuardedBy("mService") + private boolean mNoKillOnForcedAppStandbyAndIdle; + // Below are the cached task info for OomAdjuster only private static final int VALUE_INVALID = -1; private static final int VALUE_FALSE = 0; @@ -1143,6 +1150,16 @@ final class ProcessStateRecord { return mLastInvisibleTime; } + @GuardedBy("mService") + void setNoKillOnForcedAppStandbyAndIdle(boolean shouldNotKill) { + mNoKillOnForcedAppStandbyAndIdle = shouldNotKill; + } + + @GuardedBy("mService") + boolean shouldNotKillOnForcedAppStandbyAndIdle() { + return mNoKillOnForcedAppStandbyAndIdle; + } + @GuardedBy({"mService", "mProcLock"}) void dump(PrintWriter pw, String prefix, long nowUptime) { if (mReportedInteraction || mFgInteractionTime != 0) {