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
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
index 661e0b8..b1bb108 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 @@
         state.setAdjTarget(null);
         state.setEmpty(false);
         state.setCached(false);
+        state.setNoKillOnForcedAppStandbyAndIdle(false);
         state.resetAllowStartFgsState();
         app.mOptRecord.setShouldNotFreeze(false);
 
@@ -2061,6 +2062,9 @@
                             // 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 @@
                         // 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 9098e68..3bfd62b 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 @@
         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 1fb5572..efcc502 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 @@
     @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 @@
         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) {