summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jing Ji <jji@google.com> 2021-05-29 02:57:59 -0700
committer Jing Ji <jji@google.com> 2021-06-01 15:11:54 -0700
commit766e7d730b517875a0c3790b1ae823bf6373f960 (patch)
treefa18f002d4a1994662f2083b857c1c4339b1510a
parentdf773665d02ab79a38908e180f436127f8085f98 (diff)
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
-rw-r--r--services/core/java/com/android/server/am/OomAdjuster.java7
-rw-r--r--services/core/java/com/android/server/am/ProcessList.java1
-rw-r--r--services/core/java/com/android/server/am/ProcessStateRecord.java17
3 files changed, 25 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
index 661e0b886c25..b1bb108e7f83 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 9098e68392fd..3bfd62b60c89 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 1fb5572cc5fe..efcc502380a6 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 &amp; 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) {