summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/am/ActiveServices.java48
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java10
-rw-r--r--services/core/java/com/android/server/am/OomAdjuster.java133
-rw-r--r--services/core/java/com/android/server/am/OomAdjusterModernImpl.java2
-rw-r--r--services/core/java/com/android/server/am/PendingStartActivityUids.java18
-rw-r--r--services/core/java/com/android/server/am/ServiceRecord.java21
-rw-r--r--services/core/java/com/android/server/wm/ActivityTaskManagerService.java3
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java10
8 files changed, 110 insertions, 135 deletions
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index 04dd2f3fa288..90a9d1beadec 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -2659,6 +2659,9 @@ public final class ActiveServices {
}
updateNumForegroundServicesLocked();
}
+
+ maybeUpdateShortFgsTrackingLocked(r,
+ extendShortServiceTimeout);
// Even if the service is already a FGS, we need to update the notification,
// so we need to call it again.
signalForegroundServiceObserversLocked(r);
@@ -2670,8 +2673,6 @@ public final class ActiveServices {
mAm.notifyPackageUse(r.serviceInfo.packageName,
PackageManager.NOTIFY_PACKAGE_USE_FOREGROUND_SERVICE);
- maybeUpdateShortFgsTrackingLocked(r,
- extendShortServiceTimeout);
maybeUpdateFgsTrackingLocked(r, extendFgsTimeout);
} else {
if (DEBUG_FOREGROUND_SERVICE) {
@@ -4158,7 +4159,7 @@ public final class ActiveServices {
|| (callerApp.mState.getCurProcState() <= PROCESS_STATE_TOP
&& c.hasFlag(Context.BIND_TREAT_LIKE_ACTIVITY)),
b.client);
- if (!s.mOomAdjBumpedInExec && (serviceBindingOomAdjPolicy
+ if (!s.wasOomAdjUpdated() && (serviceBindingOomAdjPolicy
& SERVICE_BIND_OOMADJ_POLICY_SKIP_OOM_UPDATE_ON_CONNECT) == 0) {
needOomAdj = true;
mAm.enqueueOomAdjTargetLocked(s.app);
@@ -4308,7 +4309,7 @@ public final class ActiveServices {
}
serviceDoneExecutingLocked(r, mDestroyingServices.contains(r), false, false,
- !Flags.serviceBindingOomAdjPolicy() || r.mOomAdjBumpedInExec
+ !Flags.serviceBindingOomAdjPolicy() || r.wasOomAdjUpdated()
? OOM_ADJ_REASON_EXECUTING_SERVICE : OOM_ADJ_REASON_NONE);
}
} finally {
@@ -4456,7 +4457,7 @@ public final class ActiveServices {
}
serviceDoneExecutingLocked(r, inDestroying, false, false,
- !Flags.serviceBindingOomAdjPolicy() || r.mOomAdjBumpedInExec
+ !Flags.serviceBindingOomAdjPolicy() || r.wasOomAdjUpdated()
? OOM_ADJ_REASON_UNBIND_SERVICE : OOM_ADJ_REASON_NONE);
}
} finally {
@@ -5004,13 +5005,16 @@ public final class ActiveServices {
}
}
}
- if (oomAdjReason != OOM_ADJ_REASON_NONE && r.app != null
+ if (r.app != null
&& r.app.mState.getCurProcState() > ActivityManager.PROCESS_STATE_SERVICE) {
- // Force an immediate oomAdjUpdate, so the client app could be in the correct process
- // state before doing any service related transactions
+ // Enqueue the oom adj target anyway for opportunistic oom adj updates.
mAm.enqueueOomAdjTargetLocked(r.app);
- mAm.updateOomAdjPendingTargetsLocked(oomAdjReason);
- r.mOomAdjBumpedInExec = true;
+ r.updateOomAdjSeq();
+ if (oomAdjReason != OOM_ADJ_REASON_NONE) {
+ // Force an immediate oomAdjUpdate, so the client app could be in the correct
+ // process state before doing any service related transactions
+ mAm.updateOomAdjPendingTargetsLocked(oomAdjReason);
+ }
}
r.executeFg |= fg;
r.executeNesting++;
@@ -5050,7 +5054,7 @@ public final class ActiveServices {
if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "Crashed while binding " + r, e);
final boolean inDestroying = mDestroyingServices.contains(r);
serviceDoneExecutingLocked(r, inDestroying, inDestroying, false,
- !Flags.serviceBindingOomAdjPolicy() || r.mOomAdjBumpedInExec
+ !Flags.serviceBindingOomAdjPolicy() || r.wasOomAdjUpdated()
? OOM_ADJ_REASON_UNBIND_SERVICE : OOM_ADJ_REASON_NONE);
throw e;
} catch (RemoteException e) {
@@ -5058,7 +5062,7 @@ public final class ActiveServices {
// Keep the executeNesting count accurate.
final boolean inDestroying = mDestroyingServices.contains(r);
serviceDoneExecutingLocked(r, inDestroying, inDestroying, false,
- !Flags.serviceBindingOomAdjPolicy() || r.mOomAdjBumpedInExec
+ !Flags.serviceBindingOomAdjPolicy() || r.wasOomAdjUpdated()
? OOM_ADJ_REASON_UNBIND_SERVICE : OOM_ADJ_REASON_NONE);
return false;
}
@@ -5854,8 +5858,8 @@ public final class ActiveServices {
// Force an immediate oomAdjUpdate, so the host app could be in the correct
// process state before doing any service related transactions
mAm.enqueueOomAdjTargetLocked(app);
+ r.updateOomAdjSeq();
mAm.updateOomAdjPendingTargetsLocked(OOM_ADJ_REASON_START_SERVICE);
- r.mOomAdjBumpedInExec = true;
} else {
// Since we skipped the oom adj update, the Service#onCreate() might be running in
// the cached state, if the service process drops into the cached state after the call.
@@ -5896,7 +5900,7 @@ public final class ActiveServices {
// Keep the executeNesting count accurate.
final boolean inDestroying = mDestroyingServices.contains(r);
serviceDoneExecutingLocked(r, inDestroying, inDestroying, false,
- !Flags.serviceBindingOomAdjPolicy() || r.mOomAdjBumpedInExec
+ !Flags.serviceBindingOomAdjPolicy() || r.wasOomAdjUpdated()
? OOM_ADJ_REASON_STOP_SERVICE : OOM_ADJ_REASON_NONE);
// Cleanup.
@@ -5932,7 +5936,7 @@ public final class ActiveServices {
null, null, 0, null, null, ActivityManager.PROCESS_STATE_UNKNOWN));
}
- sendServiceArgsLocked(r, execInFg, r.mOomAdjBumpedInExec);
+ sendServiceArgsLocked(r, execInFg, r.wasOomAdjUpdated());
if (r.delayed) {
if (DEBUG_DELAYED_STARTS) Slog.v(TAG_SERVICE, "REM FR DELAY LIST (new proc): " + r);
@@ -6119,7 +6123,7 @@ public final class ActiveServices {
}
}
- boolean oomAdjusted = Flags.serviceBindingOomAdjPolicy() && r.mOomAdjBumpedInExec;
+ boolean oomAdjusted = Flags.serviceBindingOomAdjPolicy() && r.wasOomAdjUpdated();
// Tell the service that it has been unbound.
if (r.app != null && r.app.isThreadReady()) {
@@ -6132,7 +6136,7 @@ public final class ActiveServices {
bumpServiceExecutingLocked(r, false, "bring down unbind",
oomAdjusted ? OOM_ADJ_REASON_NONE : OOM_ADJ_REASON_UNBIND_SERVICE,
oomAdjusted /* skipTimeoutIfPossible */);
- oomAdjusted |= r.mOomAdjBumpedInExec;
+ oomAdjusted |= r.wasOomAdjUpdated();
ibr.hasBound = false;
ibr.requested = false;
r.app.getThread().scheduleUnbindService(r,
@@ -6292,7 +6296,7 @@ public final class ActiveServices {
oomAdjusted ? OOM_ADJ_REASON_NONE : OOM_ADJ_REASON_UNBIND_SERVICE,
oomAdjusted /* skipTimeoutIfPossible */);
mDestroyingServices.add(r);
- oomAdjusted |= r.mOomAdjBumpedInExec;
+ oomAdjusted |= r.wasOomAdjUpdated();
r.destroying = true;
r.app.getThread().scheduleStopService(r);
} catch (Exception e) {
@@ -6579,7 +6583,7 @@ public final class ActiveServices {
}
final long origId = mAm.mInjector.clearCallingIdentity();
serviceDoneExecutingLocked(r, inDestroying, inDestroying, enqueueOomAdj,
- !Flags.serviceBindingOomAdjPolicy() || r.mOomAdjBumpedInExec || needOomAdj
+ !Flags.serviceBindingOomAdjPolicy() || r.wasOomAdjUpdated() || needOomAdj
? OOM_ADJ_REASON_EXECUTING_SERVICE : OOM_ADJ_REASON_NONE);
mAm.mInjector.restoreCallingIdentity(origId);
} else {
@@ -6645,7 +6649,7 @@ public final class ActiveServices {
} else {
// Skip oom adj if it wasn't bumped during the bumpServiceExecutingLocked()
}
- r.mOomAdjBumpedInExec = false;
+ r.updateOomAdjSeq();
}
r.executeFg = false;
if (r.tracker != null) {
@@ -7029,7 +7033,6 @@ public final class ActiveServices {
sr.setProcess(null, null, 0, null);
sr.isolationHostProc = null;
sr.executeNesting = 0;
- sr.mOomAdjBumpedInExec = false;
synchronized (mAm.mProcessStats.mLock) {
sr.forceClearTracker();
}
@@ -9013,6 +9016,7 @@ public final class ActiveServices {
r.isForeground = true;
r.mFgsEnterTime = SystemClock.uptimeMillis();
r.foregroundServiceType = options.mForegroundServiceTypes;
+ r.updateOomAdjSeq();
setFgsRestrictionLocked(callingPackage, callingPid, callingUid, intent, r, userId,
BackgroundStartPrivileges.NONE, false /* isBindService */);
final ProcessServiceRecord psr = callerApp.mServices;
@@ -9075,6 +9079,7 @@ public final class ActiveServices {
}
}
if (r != null) {
+ r.updateOomAdjSeq();
bringDownServiceLocked(r, false);
} else {
Slog.e(TAG, "stopForegroundServiceDelegateLocked delegate does not exist "
@@ -9100,6 +9105,7 @@ public final class ActiveServices {
}
}
if (r != null) {
+ r.updateOomAdjSeq();
bringDownServiceLocked(r, false);
} else {
Slog.e(TAG, "stopForegroundServiceDelegateLocked delegate does not exist");
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 4f1a35c3fbd4..ed1a763b1512 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -20868,4 +20868,14 @@ public class ActivityManagerService extends IActivityManager.Stub
}
mOomAdjuster.mCachedAppOptimizer.binderError(debugPid, app, code, flags, err);
}
+
+ @GuardedBy("this")
+ void enqueuePendingTopAppIfNecessaryLocked() {
+ mPendingStartActivityUids.enqueuePendingTopAppIfNecessaryLocked(this);
+ }
+
+ @GuardedBy("this")
+ void clearPendingTopAppLocked() {
+ mPendingStartActivityUids.clear();
+ }
}
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
index 5e91cd39b698..df6481dc2c74 100644
--- a/services/core/java/com/android/server/am/OomAdjuster.java
+++ b/services/core/java/com/android/server/am/OomAdjuster.java
@@ -409,6 +409,12 @@ public class OomAdjuster {
private final OomAdjusterDebugLogger mLogger;
+ /**
+ * The process state of the current TOP app.
+ */
+ @GuardedBy("mService")
+ protected int mProcessStateCurTop = PROCESS_STATE_TOP;
+
/** Overrideable by a test */
@VisibleForTesting
protected boolean isChangeEnabled(@CachedCompatChangeId int cachedCompatChangeId,
@@ -518,59 +524,6 @@ public class OomAdjuster {
}
/**
- * Perform oom adj update on the given process. It does NOT do the re-computation
- * if there is a cycle, caller should check {@link #mProcessesInCycle} and do it on its own.
- */
- @GuardedBy({"mService", "mProcLock"})
- private boolean performUpdateOomAdjLSP(ProcessRecord app, int cachedAdj,
- ProcessRecord topApp, long now, @OomAdjReason int oomAdjReason) {
- if (app.getThread() == null) {
- return false;
- }
-
- app.mState.resetCachedInfo();
- app.mState.setCurBoundByNonBgRestrictedApp(false);
- UidRecord uidRec = app.getUidRecord();
- if (uidRec != null) {
- if (DEBUG_UID_OBSERVERS) {
- Slog.i(TAG_UID_OBSERVERS, "Starting update of " + uidRec);
- }
- uidRec.reset();
- }
-
- // Check if this process is in the pending list too, remove from pending list if so.
- mPendingProcessSet.remove(app);
-
- mProcessesInCycle.clear();
- computeOomAdjLSP(app, cachedAdj, topApp, false, now, false, true, oomAdjReason, true);
- if (!mProcessesInCycle.isEmpty()) {
- // We can't use the score here if there is a cycle, abort.
- for (int i = mProcessesInCycle.size() - 1; i >= 0; i--) {
- // Reset the adj seq
- mProcessesInCycle.valueAt(i).mState.setCompletedAdjSeq(mAdjSeq - 1);
- }
- return true;
- }
-
- if (uidRec != null) {
- // After uidRec.reset() above, for UidRecord with multiple processes (ProcessRecord),
- // we need to apply all ProcessRecord into UidRecord.
- uidRec.forEachProcess(this::updateAppUidRecIfNecessaryLSP);
- if (uidRec.getCurProcState() != PROCESS_STATE_NONEXISTENT
- && (uidRec.getSetProcState() != uidRec.getCurProcState()
- || uidRec.getSetCapability() != uidRec.getCurCapability()
- || uidRec.isSetAllowListed() != uidRec.isCurAllowListed())) {
- final ActiveUids uids = mTmpUidRecords;
- uids.clear();
- uids.put(uidRec.getUid(), uidRec);
- updateUidsLSP(uids, SystemClock.elapsedRealtime());
- }
- }
-
- return applyOomAdjLSP(app, false, now, SystemClock.elapsedRealtime(), oomAdjReason);
- }
-
- /**
* Update OomAdj for all processes in LRU list
*/
@GuardedBy("mService")
@@ -599,6 +552,7 @@ public class OomAdjuster {
@GuardedBy({"mService", "mProcLock"})
protected void performUpdateOomAdjLSP(@OomAdjReason int oomAdjReason) {
final ProcessRecord topApp = mService.getTopApp();
+ mProcessStateCurTop = mService.mAtmInternal.getTopProcessState();
// Clear any pending ones because we are doing a full update now.
mPendingProcessSet.clear();
mService.mAppProfiler.mHasPreviousProcess = mService.mAppProfiler.mHasHomeProcess = false;
@@ -649,54 +603,14 @@ public class OomAdjuster {
mLastReason = oomAdjReason;
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, oomAdjReasonToString(oomAdjReason));
mService.mOomAdjProfiler.oomAdjStarted();
- mAdjSeq++;
final ProcessStateRecord state = app.mState;
- final boolean wasCached = state.isCached();
- final int oldAdj = state.getCurRawAdj();
- final int cachedAdj = oldAdj >= CACHED_APP_MIN_ADJ
- ? oldAdj : UNKNOWN_ADJ;
-
- // Firstly, try to see if the importance of itself gets changed
- final boolean wasBackground = ActivityManager.isProcStateBackground(
- state.getSetProcState());
- final int oldCap = state.getSetCapability();
- state.setContainsCycle(false);
- state.setProcStateChanged(false);
- state.resetCachedInfo();
- state.setCurBoundByNonBgRestrictedApp(false);
- // Check if this process is in the pending list too, remove from pending list if so.
- mPendingProcessSet.remove(app);
- app.mOptRecord.setLastOomAdjChangeReason(oomAdjReason);
- boolean success = performUpdateOomAdjLSP(app, cachedAdj, topApp,
- SystemClock.uptimeMillis(), oomAdjReason);
- // The 'app' here itself might or might not be in the cycle, for example,
- // the case A <=> B vs. A -> B <=> C; anyway, if we spot a cycle here, re-compute them.
- if (!success || (wasCached == state.isCached() && oldAdj != INVALID_ADJ
- && mProcessesInCycle.isEmpty() /* Force re-compute if there is a cycle */
- && oldCap == state.getCurCapability()
- && wasBackground == ActivityManager.isProcStateBackground(
- state.getSetProcState()))) {
- mProcessesInCycle.clear();
- // Okay, it's unchanged, it won't impact any service it binds to, we're done here.
- if (DEBUG_OOM_ADJ) {
- Slog.i(TAG_OOM_ADJ, "No oomadj changes for " + app);
- }
- mService.mOomAdjProfiler.oomAdjEnded();
- Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
- return success;
- }
// Next to find out all its reachable processes
ArrayList<ProcessRecord> processes = mTmpProcessList;
ActiveUids uids = mTmpUidRecords;
mPendingProcessSet.add(app);
-
- // Add all processes with cycles into the list to scan
- for (int i = mProcessesInCycle.size() - 1; i >= 0; i--) {
- mPendingProcessSet.add(mProcessesInCycle.valueAt(i));
- }
- mProcessesInCycle.clear();
+ mProcessStateCurTop = enqueuePendingTopAppIfNecessaryLSP();
boolean containsCycle = collectReachableProcessesLocked(mPendingProcessSet,
processes, uids);
@@ -704,14 +618,8 @@ public class OomAdjuster {
// Clear the pending set as they should've been included in 'processes'.
mPendingProcessSet.clear();
- if (!containsCycle) {
- // Remove this app from the return list because we've done the computation on it.
- processes.remove(app);
- }
-
int size = processes.size();
if (size > 0) {
- mAdjSeq--;
// Update these reachable processes
updateOomAdjInnerLSP(oomAdjReason, topApp, processes, uids, containsCycle, false);
} else if (state.getCurRawAdj() == UNKNOWN_ADJ) {
@@ -723,11 +631,25 @@ public class OomAdjuster {
SystemClock.elapsedRealtime(), oomAdjReason);
}
mTmpProcessList.clear();
+ mService.clearPendingTopAppLocked();
mService.mOomAdjProfiler.oomAdjEnded();
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
return true;
}
+ @GuardedBy({"mService", "mProcLock"})
+ protected int enqueuePendingTopAppIfNecessaryLSP() {
+ final int prevTopProcessState = mService.mAtmInternal.getTopProcessState();
+ mService.enqueuePendingTopAppIfNecessaryLocked();
+ final int topProcessState = mService.mAtmInternal.getTopProcessState();
+ if (prevTopProcessState != topProcessState) {
+ // Unlikely but possible: WM just updated the top process state, it may have
+ // enqueued the new top app to the pending top UID list. Enqueue that one here too.
+ mService.enqueuePendingTopAppIfNecessaryLocked();
+ }
+ return topProcessState;
+ }
+
/**
* Collect the reachable processes from the given {@code apps}, the result will be
* returned in the given {@code processes}, which will include the processes from
@@ -930,6 +852,7 @@ public class OomAdjuster {
mLastReason = oomAdjReason;
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, oomAdjReasonToString(oomAdjReason));
mService.mOomAdjProfiler.oomAdjStarted();
+ mProcessStateCurTop = enqueuePendingTopAppIfNecessaryLSP();
final ArrayList<ProcessRecord> processes = mTmpProcessList;
final ActiveUids uids = mTmpUidRecords;
@@ -939,6 +862,7 @@ public class OomAdjuster {
updateOomAdjInnerLSP(oomAdjReason, topApp, processes, uids, true, false);
}
processes.clear();
+ mService.clearPendingTopAppLocked();
mService.mOomAdjProfiler.oomAdjEnded();
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
@@ -1337,6 +1261,7 @@ public class OomAdjuster {
// Avoid trimming processes that are still initializing. If they aren't
// hosting any components yet because they may be unfairly killed.
// We however apply the oom scores set at #setAttachingProcessStatesLSP.
+ updateAppUidRecLSP(app);
continue;
}
@@ -1882,7 +1807,7 @@ public class OomAdjuster {
state.setSystemNoUi(false);
- final int PROCESS_STATE_CUR_TOP = mService.mAtmInternal.getTopProcessState();
+ final int PROCESS_STATE_CUR_TOP = mProcessStateCurTop;
// Determine the importance of the process, starting with most
// important to least, and assign an appropriate OOM adjustment.
@@ -3286,13 +3211,15 @@ public class OomAdjuster {
// If the partial values are no better, skip until the next
// attempt
if (client.getCurRawProcState() >= procState
- && client.getCurRawAdj() >= adj) {
+ && client.getCurRawAdj() >= adj
+ && (client.getCurCapability() & app.mState.getCurCapability())
+ == client.getCurCapability()) {
return true;
}
// Else use the client's partial procstate and adj to adjust the
// effect of the binding
} else {
- return true;
+ return false;
}
}
}
diff --git a/services/core/java/com/android/server/am/OomAdjusterModernImpl.java b/services/core/java/com/android/server/am/OomAdjusterModernImpl.java
index 5feac1ff92cb..00e148287b67 100644
--- a/services/core/java/com/android/server/am/OomAdjusterModernImpl.java
+++ b/services/core/java/com/android/server/am/OomAdjusterModernImpl.java
@@ -737,6 +737,7 @@ public class OomAdjusterModernImpl extends OomAdjuster {
@Override
protected void performUpdateOomAdjLSP(@OomAdjReason int oomAdjReason) {
final ProcessRecord topApp = mService.getTopApp();
+ mProcessStateCurTop = mService.mAtmInternal.getTopProcessState();
// Clear any pending ones because we are doing a full update now.
mPendingProcessSet.clear();
mService.mAppProfiler.mHasPreviousProcess = mService.mAppProfiler.mHasHomeProcess = false;
@@ -763,6 +764,7 @@ public class OomAdjusterModernImpl extends OomAdjuster {
@Override
protected void performUpdateOomAdjPendingTargetsLocked(@OomAdjReason int oomAdjReason) {
mLastReason = oomAdjReason;
+ mProcessStateCurTop = enqueuePendingTopAppIfNecessaryLSP();
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, oomAdjReasonToString(oomAdjReason));
mService.mOomAdjProfiler.oomAdjStarted();
diff --git a/services/core/java/com/android/server/am/PendingStartActivityUids.java b/services/core/java/com/android/server/am/PendingStartActivityUids.java
index da09317add90..e912d07fb42d 100644
--- a/services/core/java/com/android/server/am/PendingStartActivityUids.java
+++ b/services/core/java/com/android/server/am/PendingStartActivityUids.java
@@ -87,4 +87,22 @@ final class PendingStartActivityUids {
synchronized boolean isPendingTopUid(int uid) {
return mPendingUids.get(uid) != null;
}
+
+ // Must called with AMS locked.
+ synchronized void enqueuePendingTopAppIfNecessaryLocked(ActivityManagerService ams) {
+ for (int i = 0, size = mPendingUids.size(); i < size; i++) {
+ final Pair<Integer, Long> p = mPendingUids.valueAt(i);
+ final ProcessRecord app;
+ synchronized (ams.mPidsSelfLocked) {
+ app = ams.mPidsSelfLocked.get(p.first);
+ }
+ if (app != null) {
+ ams.enqueueOomAdjTargetLocked(app);
+ }
+ }
+ }
+
+ synchronized void clear() {
+ mPendingUids.clear();
+ }
}
diff --git a/services/core/java/com/android/server/am/ServiceRecord.java b/services/core/java/com/android/server/am/ServiceRecord.java
index e3aac0251141..5834dcd06ba9 100644
--- a/services/core/java/com/android/server/am/ServiceRecord.java
+++ b/services/core/java/com/android/server/am/ServiceRecord.java
@@ -267,9 +267,13 @@ final class ServiceRecord extends Binder implements ComponentName.WithComponentN
int mAllowStart_byBindings = REASON_DENIED;
/**
- * Whether or not we've bumped its oom adj scores during its execution.
+ * The oom adj seq number snapshot of the host process. We're taking a snapshot
+ * before executing the service. Since we may or may not bump the host process's
+ * proc state / oom adj value before that, at the end of the execution, we could
+ * compare this seq against the current seq of the host process to see if we could
+ * skip the oom adj update from there too.
*/
- boolean mOomAdjBumpedInExec;
+ int mAdjSeq;
/**
* Whether to use the new "while-in-use permission" logic for FGS start
@@ -1884,4 +1888,17 @@ final class ServiceRecord extends Binder implements ComponentName.WithComponentN
}
return true;
}
+
+ /**
+ * @return {@code true} if the host process has updated its oom adj scores.
+ */
+ boolean wasOomAdjUpdated() {
+ return app != null && app.mState.getAdjSeq() > mAdjSeq;
+ }
+
+ void updateOomAdjSeq() {
+ if (app != null) {
+ mAdjSeq = app.mState.getAdjSeq();
+ }
+ }
}
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index 6af496f4af24..38f0587adb0a 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -5060,6 +5060,9 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
FrameworkStatsLog.write(FrameworkStatsLog.ACTIVITY_MANAGER_SLEEP_STATE_CHANGED,
FrameworkStatsLog.ACTIVITY_MANAGER_SLEEP_STATE_CHANGED__STATE__AWAKE);
startTimeTrackingFocusedActivityLocked();
+ if (mTopApp != null) {
+ mTopApp.addToPendingTop();
+ }
mTopProcessState = ActivityManager.PROCESS_STATE_TOP;
Slog.d(TAG, "Top Process State changed to PROCESS_STATE_TOP");
mTaskSupervisor.comeOutOfSleepIfNeededLocked();
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 872ac40a4d76..4c7a8fef6f0b 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java
@@ -479,15 +479,7 @@ public class MockingOomAdjusterTests {
sService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app);
- final int expectedAdj;
- if (sService.mConstants.ENABLE_NEW_OOMADJ) {
- // A cached empty process can be at best a level higher than the min cached adj.
- expectedAdj = sFirstCachedAdj;
- } else {
- // This is wrong but legacy behavior is going to be removed and not worth fixing.
- expectedAdj = CACHED_APP_MIN_ADJ;
- }
-
+ final int expectedAdj = sFirstCachedAdj;
assertProcStates(app, PROCESS_STATE_CACHED_EMPTY, expectedAdj,
SCHED_GROUP_BACKGROUND);
}