Merge changes I3f5144ab,Iefc05dd5 into main
* changes:
Push global device state to OomAdjuster
Wrap all state changes that can affect OomAdjuster computation
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index f9197e3c..3bfbc55 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -1189,8 +1189,8 @@
if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "START SERVICE WHILE RESTART PENDING: " + r);
}
final boolean wasStartRequested = r.startRequested;
- r.lastActivity = SystemClock.uptimeMillis();
- r.startRequested = true;
+ mAm.mProcessStateController.setServiceLastActivityTime(r, SystemClock.uptimeMillis());
+ mAm.mProcessStateController.setStartRequested(r, true);
r.delayedStop = false;
r.fgRequired = fgRequired;
r.pendingStarts.add(new ServiceRecord.StartItem(r, false, r.makeNextStartId(),
@@ -1623,7 +1623,7 @@
FrameworkStatsLog.write(FrameworkStatsLog.SERVICE_STATE_CHANGED, uid, packageName,
serviceName, FrameworkStatsLog.SERVICE_STATE_CHANGED__STATE__STOP);
mAm.mBatteryStatsService.noteServiceStopRunning(uid, packageName, serviceName);
- service.startRequested = false;
+ mAm.mProcessStateController.setStartRequested(service, false);
if (service.tracker != null) {
synchronized (mAm.mProcessStats.mLock) {
service.tracker.setStarted(false, mAm.mProcessStats.getMemFactorLocked(),
@@ -1812,7 +1812,7 @@
FrameworkStatsLog.write(FrameworkStatsLog.SERVICE_STATE_CHANGED, uid, packageName,
serviceName, FrameworkStatsLog.SERVICE_STATE_CHANGED__STATE__STOP);
mAm.mBatteryStatsService.noteServiceStopRunning(uid, packageName, serviceName);
- r.startRequested = false;
+ mAm.mProcessStateController.setStartRequested(r, false);
if (r.tracker != null) {
synchronized (mAm.mProcessStats.mLock) {
r.tracker.setStarted(false, mAm.mProcessStats.getMemFactorLocked(),
@@ -2618,7 +2618,7 @@
}
notification.flags |= Notification.FLAG_FOREGROUND_SERVICE;
r.foregroundNoti = notification;
- r.foregroundServiceType = foregroundServiceType;
+ mAm.mProcessStateController.setForegroundServiceType(r, foregroundServiceType);
if (!r.isForeground) {
final ServiceMap smap = getServiceMapLocked(r.userId);
if (smap != null) {
@@ -2643,7 +2643,7 @@
}
active.mNumActive++;
}
- r.isForeground = true;
+ mAm.mProcessStateController.setIsForegroundService(r, true);
// The logging of FOREGROUND_SERVICE_STATE_CHANGED__STATE__ENTER event could
// be deferred, make a copy of mAllowStartForeground and
@@ -2772,7 +2772,7 @@
}
}
- r.isForeground = false;
+ mAm.mProcessStateController.setIsForegroundService(r, false);
r.mFgsExitTime = SystemClock.uptimeMillis();
synchronized (mAm.mProcessStats.mLock) {
final ServiceState stracker = r.getTracker();
@@ -3565,7 +3565,7 @@
private void maybeUpdateShortFgsTrackingLocked(ServiceRecord sr,
boolean extendTimeout) {
if (!sr.isShortFgs()) {
- sr.clearShortFgsInfo(); // Just in case we have it.
+ mAm.mProcessStateController.clearShortFgsInfo(sr); // Just in case we have it.
unscheduleShortFgsTimeoutLocked(sr);
return;
}
@@ -3581,7 +3581,7 @@
}
}
traceInstant("short FGS start/extend: ", sr);
- sr.setShortFgsInfo(SystemClock.uptimeMillis());
+ mAm.mProcessStateController.setShortFgsInfo(sr, SystemClock.uptimeMillis());
// We'll restart the timeout.
unscheduleShortFgsTimeoutLocked(sr);
@@ -3605,7 +3605,7 @@
* Stop the timeout for a ServiceRecord, if it's of a short-FGS.
*/
private void maybeStopShortFgsTimeoutLocked(ServiceRecord sr) {
- sr.clearShortFgsInfo(); // Always clear, just in case.
+ mAm.mProcessStateController.clearShortFgsInfo(sr); // Always clear, just in case.
if (!sr.isShortFgs()) {
return;
}
@@ -3993,7 +3993,7 @@
private void stopServiceAndUpdateAllowlistManagerLocked(ServiceRecord service) {
maybeStopShortFgsTimeoutLocked(service);
final ProcessServiceRecord psr = service.app.mServices;
- psr.stopService(service);
+ mAm.mProcessStateController.stopService(psr, service);
psr.updateBoundClientUids();
if (service.allowlistManager) {
updateAllowlistManagerLocked(psr);
@@ -4047,7 +4047,7 @@
}
}
if (anyClientActivities != psr.hasClientActivities()) {
- psr.setHasClientActivities(anyClientActivities);
+ mAm.mProcessStateController.setHasClientActivities(psr, anyClientActivities);
if (updateLru) {
mAm.updateLruProcessLocked(psr.mApp, anyClientActivities, null);
}
@@ -4216,7 +4216,8 @@
}
if ((flags&Context.BIND_AUTO_CREATE) != 0) {
- s.lastActivity = SystemClock.uptimeMillis();
+ mAm.mProcessStateController.setServiceLastActivityTime(s,
+ SystemClock.uptimeMillis());
if (!s.hasAutoCreateConnections()) {
// This is the first binding, let the tracker know.
synchronized (mAm.mProcessStats.mLock) {
@@ -4253,12 +4254,12 @@
if (activity != null) {
activity.addConnection(c);
}
- clientPsr.addConnection(c);
+ mAm.mProcessStateController.addConnection(clientPsr, c);
c.startAssociationIfNeeded();
// Don't set hasAboveClient if binding to self to prevent modifyRawOomAdj() from
// dropping the process' adjustment level.
if (b.client != s.app && c.hasFlag(Context.BIND_ABOVE_CLIENT)) {
- clientPsr.setHasAboveClient(true);
+ mAm.mProcessStateController.setHasAboveClient(clientPsr, true);
}
if (c.hasFlag(BIND_ALLOW_WHITELIST_MANAGEMENT)) {
s.allowlistManager = true;
@@ -4274,7 +4275,8 @@
if (s.app != null && s.app.mState != null
&& s.app.mState.getCurProcState() <= PROCESS_STATE_TOP
&& c.hasFlag(Context.BIND_ALMOST_PERCEPTIBLE)) {
- s.lastTopAlmostPerceptibleBindRequestUptimeMs = SystemClock.uptimeMillis();
+ mAm.mProcessStateController.setLastTopAlmostPerceptibleBindRequest(s,
+ SystemClock.uptimeMillis());
}
if (s.app != null) {
@@ -4312,7 +4314,8 @@
boolean needOomAdj = false;
if (c.hasFlag(Context.BIND_AUTO_CREATE)) {
- s.lastActivity = SystemClock.uptimeMillis();
+ mAm.mProcessStateController.setServiceLastActivityTime(s,
+ SystemClock.uptimeMillis());
needOomAdj = (serviceBindingOomAdjPolicy
& SERVICE_BIND_OOMADJ_POLICY_SKIP_OOM_UPDATE_ON_CREATE) == 0;
if (bringUpServiceLocked(s, service.getFlags(), callerFg, false,
@@ -4328,7 +4331,7 @@
if (s.app != null) {
ProcessServiceRecord servicePsr = s.app.mServices;
if (c.hasFlag(Context.BIND_TREAT_LIKE_ACTIVITY)) {
- servicePsr.setTreatLikeActivity(true);
+ mAm.mProcessStateController.setTreatLikeActivity(servicePsr, true);
}
if (s.allowlistManager) {
servicePsr.mAllowlistManager = true;
@@ -4575,7 +4578,9 @@
}
// This could have made the service less important.
if (r.hasFlag(Context.BIND_TREAT_LIKE_ACTIVITY)) {
- psr.setTreatLikeActivity(true);
+ // TODO(b/367545398): the following line is a bug. A service unbind
+ // should potentially lower a process's importance, not elevate it.
+ mAm.mProcessStateController.setTreatLikeActivity(psr, true);
mAm.updateLruProcessLocked(app, true, null);
}
// If the bindee is more important than the binder, we may skip the OomAdjuster.
@@ -5165,8 +5170,9 @@
}
if (r.app != null) {
psr = r.app.mServices;
- psr.startExecutingService(r);
- psr.setExecServicesFg(psr.shouldExecServicesFg() || fg);
+ mAm.mProcessStateController.startExecutingService(psr, r);
+ mAm.mProcessStateController.setExecServicesFg(psr,
+ psr.shouldExecServicesFg() || fg);
if (timeoutNeeded && psr.numberOfExecutingServices() == 1) {
if (!shouldSkipTimeout) {
scheduleServiceTimeoutLocked(r.app);
@@ -5178,7 +5184,7 @@
} else if (r.app != null && fg) {
psr = r.app.mServices;
if (!psr.shouldExecServicesFg()) {
- psr.setExecServicesFg(true);
+ mAm.mProcessStateController.setExecServicesFg(psr, true);
if (timeoutNeeded) {
if (!shouldSkipTimeout) {
scheduleServiceTimeoutLocked(r.app);
@@ -6023,11 +6029,13 @@
Slog.v(TAG_MU, "realStartServiceLocked, ServiceRecord.uid = " + r.appInfo.uid
+ ", ProcessRecord.uid = " + app.uid);
r.setProcess(app, thread, pid, uidRecord);
- r.restartTime = r.lastActivity = SystemClock.uptimeMillis();
+ final long now = SystemClock.uptimeMillis();
+ r.restartTime = now;
+ mAm.mProcessStateController.setServiceLastActivityTime(r, now);
final boolean skipOomAdj = (serviceBindingOomAdjPolicy
& SERVICE_BIND_OOMADJ_POLICY_SKIP_OOM_UPDATE_ON_CREATE) != 0;
final ProcessServiceRecord psr = app.mServices;
- final boolean newService = psr.startService(r);
+ final boolean newService = mAm.mProcessStateController.startService(psr, r);
bumpServiceExecutingLocked(r, execInFg, "create",
OOM_ADJ_REASON_NONE /* use "none" to avoid extra oom adj */,
skipOomAdj /* skipTimeoutIfPossible */);
@@ -6086,7 +6094,7 @@
// Cleanup.
if (newService) {
- psr.stopService(r);
+ mAm.mProcessStateController.stopService(psr, r);
r.setProcess(null, null, 0, null);
}
@@ -6431,7 +6439,7 @@
mAm.updateForegroundServiceUsageStats(r.name, r.userId, false);
}
- r.isForeground = false;
+ mAm.mProcessStateController.setIsForegroundService(r, false);
r.mFgsNotificationWasDeferred = false;
dropFgsNotificationStateLocked(r);
r.foregroundId = 0;
@@ -6582,9 +6590,9 @@
}
if (b.client != skipApp) {
final ProcessServiceRecord psr = b.client.mServices;
- psr.removeConnection(c);
+ mAm.mProcessStateController.removeConnection(psr, c);
if (c.hasFlag(Context.BIND_ABOVE_CLIENT)) {
- psr.updateHasAboveClientLocked();
+ mAm.mProcessStateController.updateHasAboveClientLocked(psr);
}
// If this connection requested allowlist management, see if we should
// now clear that state.
@@ -6600,7 +6608,7 @@
}
// And for almost perceptible exceptions.
if (c.hasFlag(Context.BIND_ALMOST_PERCEPTIBLE)) {
- psr.updateHasTopStartedAlmostPerceptibleServices();
+ mAm.mProcessStateController.updateHasTopStartedAlmostPerceptibleServices(psr);
}
if (s.app != null) {
updateServiceClientActivitiesLocked(s.app.mServices, c, true);
@@ -6799,8 +6807,8 @@
final ProcessServiceRecord psr = r.app.mServices;
if (DEBUG_SERVICE) Slog.v(TAG_SERVICE,
"Nesting at 0 of " + r.shortInstanceName);
- psr.setExecServicesFg(false);
- psr.stopExecutingService(r);
+ mAm.mProcessStateController.setExecServicesFg(psr, false);
+ mAm.mProcessStateController.stopExecutingService(psr, r);
if (psr.numberOfExecutingServices() == 0) {
if (DEBUG_SERVICE || DEBUG_SERVICE_EXECUTING) Slog.v(TAG_SERVICE_EXECUTING,
"No more executingServices of " + r.shortInstanceName);
@@ -6809,7 +6817,7 @@
// Need to re-evaluate whether the app still needs to be in the foreground.
for (int i = psr.numberOfExecutingServices() - 1; i >= 0; i--) {
if (psr.getExecutingServiceAt(i).executeFg) {
- psr.setExecServicesFg(true);
+ mAm.mProcessStateController.setExecServicesFg(psr, true);
break;
}
}
@@ -6822,9 +6830,9 @@
}
if (oomAdjReason != OOM_ADJ_REASON_NONE) {
if (enqueueOomAdj) {
- mAm.enqueueOomAdjTargetLocked(r.app);
+ mAm.mProcessStateController.enqueueUpdateTarget(r.app);
} else {
- mAm.updateOomAdjLocked(r.app, oomAdjReason);
+ mAm.mProcessStateController.runUpdate(r.app, oomAdjReason);
}
} else {
// Skip oom adj if it wasn't bumped during the bumpServiceExecutingLocked()
@@ -7209,8 +7217,7 @@
removeConnectionLocked(r, app, null, true);
}
updateServiceConnectionActivitiesLocked(psr);
- psr.removeAllConnections();
- psr.removeAllSdkSandboxConnections();
+ mAm.mProcessStateController.removeAllConnections(psr);
psr.mAllowlistManager = false;
@@ -7220,7 +7227,7 @@
mAm.mBatteryStatsService.noteServiceStopLaunch(sr.appInfo.uid, sr.name.getPackageName(),
sr.name.getClassName());
if (sr.app != app && sr.app != null && !sr.app.isPersistent()) {
- sr.app.mServices.stopService(sr);
+ mAm.mProcessStateController.stopService(psr, sr);
sr.app.mServices.updateBoundClientUids();
}
sr.setProcess(null, null, 0, null);
@@ -7290,7 +7297,7 @@
// Unless the process is persistent, this process record is going away,
// so make sure the service is cleaned out of it.
if (!app.isPersistent()) {
- psr.stopService(sr);
+ mAm.mProcessStateController.stopService(psr, sr);
psr.updateBoundClientUids();
}
@@ -7331,7 +7338,7 @@
// Update to stopped state because the explicit start is gone. The service is
// scheduled to restart for other reason (e.g. connections) so we don't bring
// down it.
- sr.startRequested = false;
+ mAm.mProcessStateController.setStartRequested(sr, false);
if (sr.tracker != null) {
synchronized (mAm.mProcessStats.mLock) {
sr.tracker.setStarted(false, mAm.mProcessStats.getMemFactorLocked(),
@@ -7345,7 +7352,7 @@
mAm.updateOomAdjPendingTargetsLocked(OOM_ADJ_REASON_STOP_SERVICE);
if (!allowRestart) {
- psr.stopAllServices();
+ mAm.mProcessStateController.stopAllServices(psr);
psr.clearBoundClientUids();
// Make sure there are no more restarting services for this process.
@@ -7387,7 +7394,7 @@
}
}
- psr.stopAllExecutingServices();
+ mAm.mProcessStateController.stopAllExecutingServices(psr);
psr.noteScheduleServiceTimeoutPending(false);
}
@@ -9213,14 +9220,14 @@
new ForegroundServiceDelegation(options, connection);
r.mFgsDelegation = delegation;
mFgsDelegations.put(delegation, r);
- r.isForeground = true;
+ mAm.mProcessStateController.setIsForegroundService(r, true);
r.mFgsEnterTime = SystemClock.uptimeMillis();
- r.foregroundServiceType = options.mForegroundServiceTypes;
+ mAm.mProcessStateController.setForegroundServiceType(r, options.mForegroundServiceTypes);
r.updateOomAdjSeq();
setFgsRestrictionLocked(callingPackage, callingPid, callingUid, intent, r, userId,
BackgroundStartPrivileges.NONE, false /* isBindService */);
final ProcessServiceRecord psr = callerApp.mServices;
- final boolean newService = psr.startService(r);
+ final boolean newService = mAm.mProcessStateController.startService(psr, r);
// updateOomAdj.
updateServiceForegroundLocked(psr, /* oomAdj= */ true);
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 74437cd..bcca20b 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -626,6 +626,8 @@
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSZ");
OomAdjuster mOomAdjuster;
+ @GuardedBy("this")
+ ProcessStateController mProcessStateController;
static final String EXTRA_TITLE = "android.intent.extra.TITLE";
static final String EXTRA_DESCRIPTION = "android.intent.extra.DESCRIPTION";
@@ -1958,7 +1960,7 @@
new HostingRecord(HostingRecord.HOSTING_TYPE_SYSTEM));
app.setPersistent(true);
app.setPid(MY_PID);
- app.mState.setMaxAdj(ProcessList.SYSTEM_ADJ);
+ mProcessStateController.setMaxAdj(app, ProcessList.SYSTEM_ADJ);
app.makeActive(new ApplicationThreadDeferred(mSystemThread.getApplicationThread()),
mProcessStats);
app.mProfile.addHostingComponentType(HOSTING_COMPONENT_TYPE_SYSTEM);
@@ -2394,9 +2396,11 @@
mProcessList.init(this, activeUids, mPlatformCompat);
mAppProfiler = new AppProfiler(this, BackgroundThread.getHandler().getLooper(), null);
mPhantomProcessList = new PhantomProcessList(this);
- mOomAdjuster = mConstants.ENABLE_NEW_OOMADJ
- ? new OomAdjusterModernImpl(this, mProcessList, activeUids, handlerThread)
- : new OomAdjuster(this, mProcessList, activeUids, handlerThread);
+ mProcessStateController = new ProcessStateController.Builder(this, mProcessList, activeUids)
+ .setHandlerThread(handlerThread)
+ .useModernOomAdjuster(mConstants.ENABLE_NEW_OOMADJ)
+ .build();
+ mOomAdjuster = mProcessStateController.getOomAdjuster();
mIntentFirewall = injector.getIntentFirewall();
mProcessStats = new ProcessStatsService(this, mContext.getCacheDir());
@@ -2459,9 +2463,10 @@
mAppProfiler = new AppProfiler(this, BackgroundThread.getHandler().getLooper(),
new LowMemDetector(this));
mPhantomProcessList = new PhantomProcessList(this);
- mOomAdjuster = mConstants.ENABLE_NEW_OOMADJ
- ? new OomAdjusterModernImpl(this, mProcessList, activeUids)
- : new OomAdjuster(this, mProcessList, activeUids);
+ mProcessStateController = new ProcessStateController.Builder(this, mProcessList, activeUids)
+ .useModernOomAdjuster(mConstants.ENABLE_NEW_OOMADJ)
+ .build();
+ mOomAdjuster = mProcessStateController.getOomAdjuster();
mBroadcastQueue = mInjector.getBroadcastQueue(this);
mBroadcastController = new BroadcastController(mContext, this, mBroadcastQueue);
@@ -4574,7 +4579,7 @@
EventLogTags.writeAmProcBound(app.userId, pid, app.processName);
synchronized (mProcLock) {
- mOomAdjuster.setAttachingProcessStatesLSP(app);
+ mProcessStateController.setAttachingProcessStatesLSP(app);
clearProcessForegroundLocked(app);
app.setDebugging(false);
app.setKilledByAm(false);
@@ -4770,7 +4775,7 @@
app.makeActive(new ApplicationThreadDeferred(thread), mProcessStats);
checkTime(startTime, "attachApplicationLocked: immediately after bindApplication");
}
- app.setPendingFinishAttach(true);
+ mProcessStateController.setPendingFinishAttach(app, true);
updateLruProcessLocked(app, false, null);
checkTime(startTime, "attachApplicationLocked: after updateLruProcessLocked");
@@ -4854,7 +4859,7 @@
synchronized (this) {
// Mark the finish attach application phase as completed
- app.setPendingFinishAttach(false);
+ mProcessStateController.setPendingFinishAttach(app, false);
final boolean normalMode = mProcessesReady || isAllowedWhileBooting(app.info);
final String processName = app.processName;
@@ -5009,7 +5014,7 @@
// If another follow up update is needed, it will be scheduled by OomAdjuster.
mHandler.removeMessages(FOLLOW_UP_OOMADJUSTER_UPDATE_MSG);
synchronized (this) {
- mOomAdjuster.updateOomAdjFollowUpTargetsLocked();
+ mProcessStateController.runFollowUpUpdate();
}
}
@@ -5804,10 +5809,10 @@
if (pr == null) {
return;
}
- pr.mState.setForcingToImportant(null);
+ mProcessStateController.setForcingToImportant(pr, null);
clearProcessForegroundLocked(pr);
}
- updateOomAdjLocked(pr, OOM_ADJ_REASON_UI_VISIBILITY);
+ mProcessStateController.runUpdate(pr, OOM_ADJ_REASON_UI_VISIBILITY);
}
}
@@ -5830,7 +5835,7 @@
oldToken.token.unlinkToDeath(oldToken, 0);
mImportantProcesses.remove(pid);
if (pr != null) {
- pr.mState.setForcingToImportant(null);
+ mProcessStateController.setForcingToImportant(pr, null);
}
changed = true;
}
@@ -5844,7 +5849,7 @@
try {
token.linkToDeath(newToken, 0);
mImportantProcesses.put(pid, newToken);
- pr.mState.setForcingToImportant(newToken);
+ mProcessStateController.setForcingToImportant(pr, newToken);
changed = true;
} catch (RemoteException e) {
// If the process died while doing this, we will later
@@ -5854,7 +5859,7 @@
}
if (changed) {
- updateOomAdjLocked(pr, OOM_ADJ_REASON_UI_VISIBILITY);
+ mProcessStateController.runUpdate(pr, OOM_ADJ_REASON_UI_VISIBILITY);
}
}
}
@@ -7274,7 +7279,7 @@
if ((info.flags & PERSISTENT_MASK) == PERSISTENT_MASK) {
app.setPersistent(true);
- app.mState.setMaxAdj(ProcessList.PERSISTENT_PROC_ADJ);
+ mProcessStateController.setMaxAdj(app, ProcessList.PERSISTENT_PROC_ADJ);
}
if (app.getThread() == null && mPersistentStartingProcesses.indexOf(app) < 0) {
mPersistentStartingProcesses.add(app);
@@ -7377,7 +7382,7 @@
mServices.updateScreenStateLocked(isAwake);
reportCurWakefulnessUsageEvent();
mActivityTaskManager.onScreenAwakeChanged(isAwake);
- mOomAdjuster.onWakefulnessChanged(wakefulness);
+ mProcessStateController.setWakefulness(wakefulness);
updateOomAdjLocked(OOM_ADJ_REASON_UI_VISIBILITY);
}
@@ -8346,16 +8351,10 @@
Slog.w(TAG, "setHasTopUi called on unknown pid: " + pid);
return;
}
- if (pr.mState.hasTopUi() != hasTopUi) {
- if (DEBUG_OOM_ADJ) {
- Slog.d(TAG, "Setting hasTopUi=" + hasTopUi + " for pid=" + pid);
- }
- pr.mState.setHasTopUi(hasTopUi);
- changed = true;
- }
+ changed = mProcessStateController.setHasTopUi(pr, hasTopUi);
}
if (changed) {
- updateOomAdjLocked(pr, OOM_ADJ_REASON_UI_VISIBILITY);
+ mProcessStateController.runUpdate(pr, OOM_ADJ_REASON_UI_VISIBILITY);
}
}
} finally {
@@ -14084,10 +14083,14 @@
proc.setInFullBackup(true);
}
r.app = proc;
+ // TODO(b/369300367): This code suggests there could be a previous backup being
+ // replaced here, but an OomAdjsuter update is not triggered on the previous app
+ // (whose state will change from being removed from mBackupTargets).
final BackupRecord backupTarget = mBackupTargets.get(targetUserId);
oldBackupUid = backupTarget != null ? backupTarget.appInfo.uid : -1;
newBackupUid = proc.isInFullBackup() ? r.appInfo.uid : -1;
mBackupTargets.put(targetUserId, r);
+ mProcessStateController.setBackupTarget(proc, targetUserId);
proc.mProfile.addHostingComponentType(HOSTING_COMPONENT_TYPE_BACKUP);
@@ -14141,6 +14144,7 @@
}
mBackupTargets.removeAt(indexOfKey);
}
+ mProcessStateController.stopBackupTarget(userId);
}
JobSchedulerInternal js = LocalServices.getService(JobSchedulerInternal.class);
@@ -14219,6 +14223,8 @@
// Not backing this app up any more; reset its OOM adjustment
final ProcessRecord proc = backupTarget.app;
+ // TODO(b/369300367): Triggering the update before the state is actually set
+ // seems wrong.
updateOomAdjLocked(proc, OOM_ADJ_REASON_BACKUP);
proc.setInFullBackup(false);
proc.mProfile.clearHostingComponentType(HOSTING_COMPONENT_TYPE_BACKUP);
@@ -14237,6 +14243,7 @@
}
} finally {
mBackupTargets.delete(userId);
+ mProcessStateController.stopBackupTarget(userId);
}
}
@@ -15309,7 +15316,8 @@
proc.info.packageName, proc.info.uid, proc.getPid(), isForeground);
}
}
- psr.setHasForegroundServices(isForeground, fgServiceTypes, hasTypeNoneFgs);
+ mProcessStateController.setHasForegroundServices(psr, isForeground, fgServiceTypes,
+ hasTypeNoneFgs);
ArrayList<ProcessRecord> curProcs = mForegroundPackages.get(proc.info.packageName,
proc.info.uid);
if (isForeground) {
@@ -15340,7 +15348,7 @@
ProcessChangeItem.CHANGE_FOREGROUND_SERVICES, fgServiceTypes);
}
if (oomAdj) {
- updateOomAdjLocked(proc, OOM_ADJ_REASON_UI_VISIBILITY);
+ mProcessStateController.runUpdate(proc, OOM_ADJ_REASON_UI_VISIBILITY);
}
}
@@ -15390,7 +15398,7 @@
*/
@GuardedBy("this")
void enqueueOomAdjTargetLocked(ProcessRecord app) {
- mOomAdjuster.enqueueOomAdjTargetLocked(app);
+ mProcessStateController.enqueueUpdateTarget(app);
}
/**
@@ -15398,7 +15406,7 @@
*/
@GuardedBy("this")
void removeOomAdjTargetLocked(ProcessRecord app, boolean procDied) {
- mOomAdjuster.removeOomAdjTargetLocked(app, procDied);
+ mProcessStateController.removeUpdateTarget(app, procDied);
}
/**
@@ -15407,7 +15415,7 @@
*/
@GuardedBy("this")
void updateOomAdjPendingTargetsLocked(@OomAdjReason int oomAdjReason) {
- mOomAdjuster.updateOomAdjPendingTargetsLocked(oomAdjReason);
+ mProcessStateController.runPendingUpdate(oomAdjReason);
}
static final class ProcStatsRunnable implements Runnable {
@@ -15426,7 +15434,7 @@
@GuardedBy("this")
final void updateOomAdjLocked(@OomAdjReason int oomAdjReason) {
- mOomAdjuster.updateOomAdjLocked(oomAdjReason);
+ mProcessStateController.runFullUpdate(oomAdjReason);
}
/**
@@ -15438,7 +15446,7 @@
*/
@GuardedBy("this")
final boolean updateOomAdjLocked(ProcessRecord app, @OomAdjReason int oomAdjReason) {
- return mOomAdjuster.updateOomAdjLocked(app, oomAdjReason);
+ return mProcessStateController.runUpdate(app, oomAdjReason);
}
@Override
@@ -15703,7 +15711,7 @@
@GuardedBy({"this", "mProcLock"})
final void setUidTempAllowlistStateLSP(int uid, boolean onAllowlist) {
- mOomAdjuster.setUidTempAllowlistStateLSP(uid, onAllowlist);
+ mProcessStateController.setUidTempAllowlistStateLSP(uid, onAllowlist);
}
private void trimApplications(boolean forceFullOomAdj, @OomAdjReason int oomAdjReason) {
@@ -16753,12 +16761,9 @@
return;
}
}
- if (pr.mState.hasOverlayUi() == hasOverlayUi) {
- return;
+ if (mProcessStateController.setHasOverlayUi(pr, hasOverlayUi)) {
+ mProcessStateController.runUpdate(pr, OOM_ADJ_REASON_UI_VISIBILITY);
}
- pr.mState.setHasOverlayUi(hasOverlayUi);
- //Slog.i(TAG, "Setting hasOverlayUi=" + pr.hasOverlayUi + " for pid=" + pid);
- updateOomAdjLocked(pr, OOM_ADJ_REASON_UI_VISIBILITY);
}
}
diff --git a/services/core/java/com/android/server/am/AppProfiler.java b/services/core/java/com/android/server/am/AppProfiler.java
index dda48ad..4f2d69e 100644
--- a/services/core/java/com/android/server/am/AppProfiler.java
+++ b/services/core/java/com/android/server/am/AppProfiler.java
@@ -1356,6 +1356,7 @@
@GuardedBy("mService")
void setMemFactorOverrideLocked(@MemFactor int factor) {
mMemFactorOverride = factor;
+ mService.mProcessStateController.setIsLastMemoryLevelNormal(isLastMemoryLevelNormal());
}
@GuardedBy({"mService", "mProcLock"})
@@ -1423,6 +1424,7 @@
}
mLastMemoryLevel = memFactor;
+ mService.mProcessStateController.setIsLastMemoryLevelNormal(isLastMemoryLevelNormal());
mLastNumProcesses = mService.mProcessList.getLruSizeLOSP();
// Dispatch UI_HIDDEN to processes that need it
diff --git a/services/core/java/com/android/server/am/ContentProviderHelper.java b/services/core/java/com/android/server/am/ContentProviderHelper.java
index da40826..221938a 100644
--- a/services/core/java/com/android/server/am/ContentProviderHelper.java
+++ b/services/core/java/com/android/server/am/ContentProviderHelper.java
@@ -325,7 +325,8 @@
final int verifiedAdj = cpr.proc.mState.getVerifiedAdj();
boolean success = !serviceBindingOomAdjPolicy()
|| mService.mOomAdjuster.evaluateProviderConnectionAdd(r, cpr.proc)
- ? mService.updateOomAdjLocked(cpr.proc, OOM_ADJ_REASON_GET_PROVIDER)
+ ? mService.mProcessStateController.runUpdate(cpr.proc,
+ OOM_ADJ_REASON_GET_PROVIDER)
: true;
// XXX things have changed so updateOomAdjLocked doesn't actually tell us
// if the process has been successfully adjusted. So to reduce races with
@@ -534,10 +535,9 @@
if (ActivityManagerDebugConfig.DEBUG_PROVIDER) {
Slog.d(TAG, "Installing in existing process " + proc);
}
- final ProcessProviderRecord pr = proc.mProviders;
- if (!pr.hasProvider(cpi.name)) {
+ if (mService.mProcessStateController.addPublishedProvider(proc,
+ cpi.name, cpr)) {
checkTime(startTime, "getContentProviderImpl: scheduling install");
- pr.installProvider(cpi.name, cpr);
mService.mOomAdjuster.unfreezeTemporarily(proc,
CachedAppOptimizer.UNFREEZE_REASON_GET_PROVIDER);
try {
@@ -881,7 +881,8 @@
ComponentName comp = new ComponentName(cpr.info.packageName, cpr.info.name);
ContentProviderRecord localCpr = mProviderMap.getProviderByClass(comp, userId);
if (localCpr.hasExternalProcessHandles()) {
- if (localCpr.removeExternalProcessHandleLocked(token)) {
+ if (mService.mProcessStateController.removeExternalProviderClient(localCpr,
+ token)) {
mService.updateOomAdjLocked(localCpr.proc, OOM_ADJ_REASON_REMOVE_PROVIDER);
} else {
Slog.e(TAG, "Attempt to remove content provider " + localCpr
@@ -1447,7 +1448,8 @@
String callingPackage, String callingTag, boolean stable, boolean updateLru,
long startTime, ProcessList processList, @UserIdInt int expectedUserId) {
if (r == null) {
- cpr.addExternalProcessHandleLocked(externalProcessToken, callingUid, callingTag);
+ mService.mProcessStateController.addExternalProviderClient(cpr, externalProcessToken,
+ callingUid, callingTag);
return null;
}
@@ -1470,7 +1472,7 @@
if (cpr.proc != null) {
cpr.proc.mProfile.addHostingComponentType(HOSTING_COMPONENT_TYPE_PROVIDER);
}
- pr.addProviderConnection(conn);
+ mService.mProcessStateController.addProviderConnection(r, conn);
mService.startAssociationLocked(r.uid, r.processName, r.mState.getCurProcState(),
cpr.uid, cpr.appInfo.longVersionCode, cpr.name, cpr.info.processName);
if (updateLru && cpr.proc != null
@@ -1493,7 +1495,8 @@
ContentProviderRecord cpr, IBinder externalProcessToken, boolean stable,
boolean enforceDelay, boolean updateOomAdj) {
if (conn == null) {
- cpr.removeExternalProcessHandleLocked(externalProcessToken);
+ mService.mProcessStateController.removeExternalProviderClient(cpr,
+ externalProcessToken);
return false;
}
@@ -1537,14 +1540,15 @@
if (cpr.proc != null && !hasProviderConnectionLocked(cpr.proc)) {
cpr.proc.mProfile.clearHostingComponentType(HOSTING_COMPONENT_TYPE_PROVIDER);
}
- conn.client.mProviders.removeProviderConnection(conn);
+ mService.mProcessStateController.removeProviderConnection(conn.client, conn);
if (conn.client.mState.getSetProcState()
< ActivityManager.PROCESS_STATE_LAST_ACTIVITY) {
// The client is more important than last activity -- note the time this
// is happening, so we keep the old provider process around a bit as last
// activity to avoid thrashing it.
if (cpr.proc != null) {
- cpr.proc.mProviders.setLastProviderTime(SystemClock.uptimeMillis());
+ mService.mProcessStateController.setLastProviderTime(cpr.proc,
+ SystemClock.uptimeMillis());
}
}
mService.stopAssociationLocked(conn.client.uid, conn.client.processName, cpr.uid,
@@ -1821,7 +1825,7 @@
}
}
if (removed && cpr.proc != null) {
- cpr.proc.mProviders.removeProvider(cpr.info.name);
+ mService.mProcessStateController.removePublishedProvider(cpr.proc, cpr.info.name);
}
}
diff --git a/services/core/java/com/android/server/am/OWNERS b/services/core/java/com/android/server/am/OWNERS
index 2a30ad0..61079fc 100644
--- a/services/core/java/com/android/server/am/OWNERS
+++ b/services/core/java/com/android/server/am/OWNERS
@@ -54,8 +54,9 @@
per-file *Permission* = patb@google.com
per-file *Package* = patb@google.com
-# OOM Adjuster
+# OOM Adjuster & ProcessStateController
per-file *Oom* = file:/OOM_ADJUSTER_OWNERS
+per-file ProcessStateController.java = file:/OOM_ADJUSTER_OWNERS
# Miscellaneous
per-file SettingsToPropertiesMapper.java = omakoto@google.com, yamasani@google.com, dzshen@google.com, zhidou@google.com, tedbauer@google.com
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
index 4073ab8..e8f7b5f 100644
--- a/services/core/java/com/android/server/am/OomAdjuster.java
+++ b/services/core/java/com/android/server/am/OomAdjuster.java
@@ -130,6 +130,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.UserIdInt;
import android.app.ActivityManager;
import android.app.ActivityManagerInternal.OomAdjReason;
import android.app.ActivityThread;
@@ -376,6 +377,7 @@
final ActivityManagerService mService;
final Injector mInjector;
+ final GlobalState mGlobalState;
final ProcessList mProcessList;
final ActivityManagerGlobalLock mProcLock;
@@ -470,15 +472,23 @@
}
+ // TODO(b/346822474): hook up global state usage.
+ interface GlobalState {
+ /** Is device's screen on. */
+ boolean isAwake();
+
+ /** What process is running a backup for a given userId. */
+ ProcessRecord getBackupTarget(@UserIdInt int userId);
+
+ /** Is memory level normal since last evaluation. */
+ boolean isLastMemoryLevelNormal();
+ }
+
boolean isChangeEnabled(@CachedCompatChangeId int cachedCompatChangeId,
ApplicationInfo app, boolean defaultValue) {
return mInjector.isChangeEnabled(cachedCompatChangeId, app, defaultValue);
}
- OomAdjuster(ActivityManagerService service, ProcessList processList, ActiveUids activeUids) {
- this(service, processList, activeUids, createAdjusterThread());
- }
-
static ServiceThread createAdjusterThread() {
// The process group is usually critical to the response time of foreground app, so the
// setter should apply it as soon as possible.
@@ -489,18 +499,9 @@
}
OomAdjuster(ActivityManagerService service, ProcessList processList, ActiveUids activeUids,
- ServiceThread adjusterThread) {
- this(service, processList, activeUids, adjusterThread, new Injector());
- }
-
- OomAdjuster(ActivityManagerService service, ProcessList processList, ActiveUids activeUids,
- Injector injector) {
- this(service, processList, activeUids, createAdjusterThread(), injector);
- }
-
- OomAdjuster(ActivityManagerService service, ProcessList processList, ActiveUids activeUids,
- ServiceThread adjusterThread, Injector injector) {
+ ServiceThread adjusterThread, GlobalState globalState, Injector injector) {
mService = service;
+ mGlobalState = globalState;
mInjector = injector;
mProcessList = processList;
mProcLock = service.mProcLock;
@@ -1816,9 +1817,36 @@
}
}
+ private boolean isDeviceFullyAwake() {
+ if (Flags.pushGlobalStateToOomadjuster()) {
+ return mGlobalState.isAwake();
+ } else {
+ return mService.mWakefulness.get() == PowerManagerInternal.WAKEFULNESS_AWAKE;
+ }
+ }
+
private boolean isScreenOnOrAnimatingLocked(ProcessStateRecord state) {
- return mService.mWakefulness.get() == PowerManagerInternal.WAKEFULNESS_AWAKE
- || state.isRunningRemoteAnimation();
+ return isDeviceFullyAwake() || state.isRunningRemoteAnimation();
+ }
+
+ private boolean isBackupProcess(ProcessRecord app) {
+ if (Flags.pushGlobalStateToOomadjuster()) {
+ return app == mGlobalState.getBackupTarget(app.userId);
+ } else {
+ final BackupRecord backupTarget = mService.mBackupTargets.get(app.userId);
+ if (backupTarget == null) {
+ return false;
+ }
+ return app == backupTarget.app;
+ }
+ }
+
+ private boolean isLastMemoryLevelNormal() {
+ if (Flags.pushGlobalStateToOomadjuster()) {
+ return mGlobalState.isLastMemoryLevelNormal();
+ } else {
+ return mService.mAppProfiler.isLastMemoryLevelNormal();
+ }
}
@GuardedBy({"mService", "mProcLock"})
@@ -2259,8 +2287,7 @@
state.setHasStartedServices(false);
state.setAdjSeq(mAdjSeq);
- final BackupRecord backupTarget = mService.mBackupTargets.get(app.userId);
- if (backupTarget != null && app == backupTarget.app) {
+ if (isBackupProcess(app)) {
// If possible we want to avoid killing apps while they're being backed up
if (adj > BACKUP_APP_ADJ) {
if (DEBUG_BACKUP) Slog.v(TAG_BACKUP, "oom BACKUP_APP_ADJ for " + app);
@@ -2526,8 +2553,7 @@
double cachedRestoreThreshold =
mProcessList.getCachedRestoreThresholdKb() * thresholdModifier;
- if (!mService.mAppProfiler.isLastMemoryLevelNormal()
- && lastPssOrRss >= cachedRestoreThreshold) {
+ if (isLastMemoryLevelNormal() && lastPssOrRss >= cachedRestoreThreshold) {
state.setServiceHighRam(true);
state.setServiceB(true);
//Slog.i(TAG, "ADJ " + app + " high ram!");
@@ -2621,7 +2647,7 @@
// Put bound foreground services in a special sched group for additional
// restrictions on screen off
if (state.getCurProcState() >= PROCESS_STATE_BOUND_FOREGROUND_SERVICE
- && mService.mWakefulness.get() != PowerManagerInternal.WAKEFULNESS_AWAKE
+ && !isDeviceFullyAwake()
&& !state.shouldScheduleLikeTopApp()) {
if (schedGroup > SCHED_GROUP_RESTRICTED) {
schedGroup = SCHED_GROUP_RESTRICTED;
@@ -2910,8 +2936,7 @@
clientProcState = PROCESS_STATE_FOREGROUND_SERVICE;
} else if (cr.hasFlag(Context.BIND_FOREGROUND_SERVICE)) {
clientProcState = PROCESS_STATE_BOUND_FOREGROUND_SERVICE;
- } else if (mService.mWakefulness.get()
- == PowerManagerInternal.WAKEFULNESS_AWAKE
+ } else if (isDeviceFullyAwake()
&& cr.hasFlag(Context.BIND_FOREGROUND_SERVICE_WHILE_AWAKE)) {
clientProcState = PROCESS_STATE_BOUND_FOREGROUND_SERVICE;
} else {
diff --git a/services/core/java/com/android/server/am/OomAdjusterModernImpl.java b/services/core/java/com/android/server/am/OomAdjusterModernImpl.java
index fb1c2e9..e452c45 100644
--- a/services/core/java/com/android/server/am/OomAdjusterModernImpl.java
+++ b/services/core/java/com/android/server/am/OomAdjusterModernImpl.java
@@ -756,18 +756,9 @@
new ComputeConnectionsConsumer();
OomAdjusterModernImpl(ActivityManagerService service, ProcessList processList,
- ActiveUids activeUids) {
- this(service, processList, activeUids, createAdjusterThread());
- }
-
- OomAdjusterModernImpl(ActivityManagerService service, ProcessList processList,
- ActiveUids activeUids, ServiceThread adjusterThread) {
- super(service, processList, activeUids, adjusterThread);
- }
-
- OomAdjusterModernImpl(ActivityManagerService service, ProcessList processList,
- ActiveUids activeUids, Injector injector) {
- super(service, processList, activeUids, injector);
+ ActiveUids activeUids, ServiceThread adjusterThread, GlobalState globalState,
+ Injector injector) {
+ super(service, processList, activeUids, adjusterThread, globalState, injector);
}
private final ProcessRecordNodes mProcessRecordProcStateNodes = new ProcessRecordNodes(
diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java
index 57922d5..2485626 100644
--- a/services/core/java/com/android/server/am/ProcessList.java
+++ b/services/core/java/com/android/server/am/ProcessList.java
@@ -3439,12 +3439,12 @@
state.setCurrentSchedulingGroup(ProcessList.SCHED_GROUP_DEFAULT);
state.setSetSchedGroup(ProcessList.SCHED_GROUP_DEFAULT);
r.setPersistent(true);
- state.setMaxAdj(ProcessList.PERSISTENT_PROC_ADJ);
+ mService.mProcessStateController.setMaxAdj(r, ProcessList.PERSISTENT_PROC_ADJ);
}
if (isolated && isolatedUid != 0) {
// Special case for startIsolatedProcess (internal only) - assume the process
// is required by the system server to prevent it being killed.
- state.setMaxAdj(ProcessList.PERSISTENT_SERVICE_ADJ);
+ mService.mProcessStateController.setMaxAdj(r, ProcessList.PERSISTENT_SERVICE_ADJ);
}
addProcessNameLocked(r);
return r;
diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java
index 3e71d00..b51db13 100644
--- a/services/core/java/com/android/server/am/ProcessRecord.java
+++ b/services/core/java/com/android/server/am/ProcessRecord.java
@@ -17,6 +17,7 @@
package com.android.server.am;
import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_ACTIVITY;
+import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_UI_VISIBILITY;
import static com.android.internal.util.Preconditions.checkArgument;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
@@ -1192,7 +1193,7 @@
setWaitingToKill(null);
mState.onCleanupApplicationRecordLSP();
- mServices.onCleanupApplicationRecordLocked();
+ mService.mProcessStateController.onCleanupApplicationRecord(mServices);
mReceivers.onCleanupApplicationRecordLocked();
mService.mOomAdjuster.onProcessEndLocked(this);
@@ -1638,7 +1639,7 @@
updateProcessInfo(false /* updateServiceConnectionActivities */,
true /* activityChange */, true /* updateOomAdj */);
setPendingUiClean(true);
- mState.setHasShownUi(true);
+ mService.mProcessStateController.setHasShownUi(this, true);
mState.forceProcessStateUpTo(topProcessState);
}
}
@@ -1657,7 +1658,10 @@
return;
}
synchronized (mService) {
- mState.setRunningRemoteAnimation(runningRemoteAnimation);
+ if (mService.mProcessStateController.setRunningRemoteAnimation(this,
+ runningRemoteAnimation)) {
+ mService.mProcessStateController.runUpdate(this, OOM_ADJ_REASON_UI_VISIBILITY);
+ }
}
}
diff --git a/services/core/java/com/android/server/am/ProcessStateController.java b/services/core/java/com/android/server/am/ProcessStateController.java
new file mode 100644
index 0000000..428df23
--- /dev/null
+++ b/services/core/java/com/android/server/am/ProcessStateController.java
@@ -0,0 +1,645 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.server.am;
+
+import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_OOM_ADJ;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.UserIdInt;
+import android.app.ActivityManager;
+import android.app.ActivityManagerInternal;
+import android.content.pm.ServiceInfo;
+import android.os.IBinder;
+import android.os.PowerManagerInternal;
+import android.util.Slog;
+import android.util.SparseArray;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.server.ServiceThread;
+
+/**
+ * ProcessStateController is responsible for maintaining state that can affect the OomAdjuster
+ * computations of a process. Any state that can affect a process's importance must be set by
+ * only ProcessStateController.
+ */
+public class ProcessStateController {
+ public static String TAG = "ProcessStateController";
+
+ private final OomAdjuster mOomAdjuster;
+
+ private final GlobalState mGlobalState = new GlobalState();
+
+ private ProcessStateController(ActivityManagerService ams, ProcessList processList,
+ ActiveUids activeUids, ServiceThread handlerThread, OomAdjuster.Injector oomAdjInjector,
+ boolean useOomAdjusterModernImpl) {
+ mOomAdjuster = useOomAdjusterModernImpl
+ ? new OomAdjusterModernImpl(ams, processList, activeUids, handlerThread,
+ mGlobalState, oomAdjInjector)
+ : new OomAdjuster(ams, processList, activeUids, handlerThread, mGlobalState,
+ oomAdjInjector);
+ }
+
+ /**
+ * Get the instance of OomAdjuster that ProcessStateController is using.
+ * Must only be interacted with while holding the ActivityManagerService lock.
+ */
+ public OomAdjuster getOomAdjuster() {
+ return mOomAdjuster;
+ }
+
+ /**
+ * Add a process to evaluated the next time an update is run.
+ */
+ public void enqueueUpdateTarget(@NonNull ProcessRecord proc) {
+ mOomAdjuster.enqueueOomAdjTargetLocked(proc);
+ }
+
+ /**
+ * Remove a process that was added by {@link #enqueueUpdateTarget}.
+ */
+ public void removeUpdateTarget(@NonNull ProcessRecord proc, boolean procDied) {
+ mOomAdjuster.removeOomAdjTargetLocked(proc, procDied);
+ }
+
+ /**
+ * Trigger an update on a single process (and any processes that have been enqueued with
+ * {@link #enqueueUpdateTarget}).
+ */
+ public boolean runUpdate(@NonNull ProcessRecord proc,
+ @ActivityManagerInternal.OomAdjReason int oomAdjReason) {
+ return mOomAdjuster.updateOomAdjLocked(proc, oomAdjReason);
+ }
+
+ /**
+ * Trigger an update on all processes that have been enqueued with {@link #enqueueUpdateTarget}.
+ */
+ public void runPendingUpdate(@ActivityManagerInternal.OomAdjReason int oomAdjReason) {
+ mOomAdjuster.updateOomAdjPendingTargetsLocked(oomAdjReason);
+ }
+
+ /**
+ * Trigger an update on all processes.
+ */
+ public void runFullUpdate(@ActivityManagerInternal.OomAdjReason int oomAdjReason) {
+ mOomAdjuster.updateOomAdjLocked(oomAdjReason);
+ }
+
+ /**
+ * Trigger an update on any processes that have been marked for follow up during a previous
+ * update.
+ */
+ public void runFollowUpUpdate() {
+ mOomAdjuster.updateOomAdjFollowUpTargetsLocked();
+ }
+
+ private static class GlobalState implements OomAdjuster.GlobalState {
+ public boolean isAwake = true;
+ // TODO(b/369300367): Maintaining global state for backup processes is a bit convoluted.
+ // ideally the state gets migrated to ProcessStateRecord.
+ public final SparseArray<ProcessRecord> backupTargets = new SparseArray<>();
+ public boolean isLastMemoryLevelNormal = true;
+
+ public boolean isAwake() {
+ return isAwake;
+ }
+
+ public ProcessRecord getBackupTarget(@UserIdInt int userId) {
+ return backupTargets.get(userId);
+ }
+
+ public boolean isLastMemoryLevelNormal() {
+ return isLastMemoryLevelNormal;
+ }
+ }
+
+ /*************************** Global State Events ***************************/
+ /**
+ * Set which process state Top processes should get.
+ */
+ public void setTopProcessState(@ActivityManager.ProcessState int procState) {
+ // TODO(b/302575389): Migrate state pulled from ATMS to a pushed model
+ throw new UnsupportedOperationException("Not implemented yet");
+ }
+
+ /**
+ * Set whether to give Top processes the Top sched group.
+ */
+ public void setUseTopSchedGroupForTopProcess(boolean useTopSchedGroup) {
+ // TODO(b/302575389): Migrate state pulled from ATMS to a pushed model
+ throw new UnsupportedOperationException("Not implemented yet");
+ }
+
+ /**
+ * Set the Top process.
+ */
+ public void setTopApp(@Nullable ProcessRecord proc) {
+ // TODO(b/302575389): Migrate state pulled from ATMS to a pushed model
+ throw new UnsupportedOperationException("Not implemented yet");
+ }
+
+ /**
+ * Set which process is considered the Home process, if any.
+ */
+ public void setHomeProcess(@Nullable ProcessRecord proc) {
+ // TODO(b/302575389): Migrate state pulled from ATMS to a pushed model
+ throw new UnsupportedOperationException("Not implemented yet");
+ }
+
+ /**
+ * Set which process is considered the Heavy Weight process, if any.
+ */
+ public void setHeavyWeightProcess(@Nullable ProcessRecord proc) {
+ // TODO(b/302575389): Migrate state pulled from ATMS to a pushed model
+ throw new UnsupportedOperationException("Not implemented yet");
+ }
+
+ /**
+ * Set which process is showing UI while the screen is off, if any.
+ */
+ public void setVisibleDozeUiProcess(@Nullable ProcessRecord proc) {
+ // TODO(b/302575389): Migrate state pulled from ATMS to a pushed model
+ throw new UnsupportedOperationException("Not implemented yet");
+ }
+
+ /**
+ * Set which process is considered the Previous process, if any.
+ */
+ public void setPreviousProcess(@Nullable ProcessRecord proc) {
+ // TODO(b/302575389): Migrate state pulled from ATMS to a pushed model
+ throw new UnsupportedOperationException("Not implemented yet");
+ }
+
+ /**
+ * Set what wakefulness state the screen is in.
+ */
+ public void setWakefulness(int wakefulness) {
+ mGlobalState.isAwake = (wakefulness == PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mOomAdjuster.onWakefulnessChanged(wakefulness);
+ }
+
+ /**
+ * Set for a given user what process is currently running a backup, if any.
+ */
+ public void setBackupTarget(@NonNull ProcessRecord proc, @UserIdInt int userId) {
+ mGlobalState.backupTargets.put(userId, proc);
+ }
+
+ /**
+ * No longer consider any process running a backup for a given user.
+ */
+ public void stopBackupTarget(@UserIdInt int userId) {
+ mGlobalState.backupTargets.delete(userId);
+ }
+
+ /**
+ * Set whether the last known memory level is normal.
+ */
+ public void setIsLastMemoryLevelNormal(boolean isMemoryNormal) {
+ mGlobalState.isLastMemoryLevelNormal = isMemoryNormal;
+ }
+
+ /***************************** UID State Events ****************************/
+ /**
+ * Set a UID as temp allowlisted.
+ */
+ public void setUidTempAllowlistStateLSP(int uid, boolean allowList) {
+ mOomAdjuster.setUidTempAllowlistStateLSP(uid, allowList);
+ }
+
+ /*********************** Process Miscellaneous Events **********************/
+ /**
+ * Set the maximum adj score a process can be assigned.
+ */
+ public void setMaxAdj(@NonNull ProcessRecord proc, int adj) {
+ proc.mState.setMaxAdj(adj);
+ }
+
+ /**
+ * Initialize a process that is being attached.
+ */
+ @GuardedBy({"mService", "mProcLock"})
+ public void setAttachingProcessStatesLSP(@NonNull ProcessRecord proc) {
+ mOomAdjuster.setAttachingProcessStatesLSP(proc);
+ }
+
+ /**
+ * Note whether a process is pending attach or not.
+ */
+ public void setPendingFinishAttach(@NonNull ProcessRecord proc, boolean pendingFinishAttach) {
+ proc.setPendingFinishAttach(pendingFinishAttach);
+ }
+
+ /**
+ * Set what sched group to grant a process due to running a broadcast.
+ * {@link ProcessList.SCHED_GROUP_UNDEFINED} means the process is not running a broadcast.
+ */
+ public void setBroadcastSchedGroup(@NonNull ProcessRecord proc, int schedGroup) {
+ // TODO(b/302575389): Migrate state pulled from BroadcastQueue to a pushed model
+ throw new UnsupportedOperationException("Not implemented yet");
+ }
+
+ /********************* Process Visibility State Events *********************/
+ /**
+ * Note whether a process has Top UI or not.
+ *
+ * @return true if the state changed, otherwise returns false.
+ */
+ public boolean setHasTopUi(@NonNull ProcessRecord proc, boolean hasTopUi) {
+ if (proc.mState.hasTopUi() == hasTopUi) return false;
+ if (DEBUG_OOM_ADJ) {
+ Slog.d(TAG, "Setting hasTopUi=" + hasTopUi + " for pid=" + proc.getPid());
+ }
+ proc.mState.setHasTopUi(hasTopUi);
+ return true;
+ }
+
+ /**
+ * Note whether a process is displaying Overlay UI or not.
+ *
+ * @return true if the state changed, otherwise returns false.
+ */
+ public boolean setHasOverlayUi(@NonNull ProcessRecord proc, boolean hasOverlayUi) {
+ if (proc.mState.hasOverlayUi() == hasOverlayUi) return false;
+ proc.mState.setHasOverlayUi(hasOverlayUi);
+ return true;
+ }
+
+
+ /**
+ * Note whether a process is running a remote animation.
+ *
+ * @return true if the state changed, otherwise returns false.
+ */
+ public boolean setRunningRemoteAnimation(@NonNull ProcessRecord proc,
+ boolean runningRemoteAnimation) {
+ if (proc.mState.isRunningRemoteAnimation() == runningRemoteAnimation) return false;
+ if (DEBUG_OOM_ADJ) {
+ Slog.i(TAG, "Setting runningRemoteAnimation=" + runningRemoteAnimation
+ + " for pid=" + proc.getPid());
+ }
+ proc.mState.setRunningRemoteAnimation(runningRemoteAnimation);
+ return true;
+ }
+
+ /**
+ * Note that the process is showing a toast.
+ */
+ public void setForcingToImportant(@NonNull ProcessRecord proc,
+ @Nullable Object forcingToImportant) {
+ if (proc.mState.getForcingToImportant() == forcingToImportant) return;
+ proc.mState.setForcingToImportant(forcingToImportant);
+ }
+
+ /**
+ * Note that the process has shown UI at some point in its life.
+ */
+ public void setHasShownUi(@NonNull ProcessRecord proc, boolean hasShownUi) {
+ // This arguably should be turned into an internal state of OomAdjuster.
+ if (proc.mState.hasShownUi() == hasShownUi) return;
+ proc.mState.setHasShownUi(hasShownUi);
+ }
+
+ /**
+ * Note whether the process has an activity or not.
+ */
+ public void setHasActivity(@NonNull ProcessRecord proc, boolean hasActivity) {
+ // TODO(b/302575389): Migrate state pulled from ATMS to a pushed model
+ // Possibly not needed, maybe can use ActivityStateFlags.
+ throw new UnsupportedOperationException("Not implemented yet");
+ }
+
+ /**
+ * Note whether the process has a visibly activity or not.
+ */
+ public void setHasVisibleActivity(@NonNull ProcessRecord proc, boolean hasVisibleActivity) {
+ // TODO(b/302575389): Migrate state pulled from ATMS to a pushed model
+ // maybe used ActivityStateFlags instead.
+ throw new UnsupportedOperationException("Not implemented yet");
+ }
+
+ /**
+ * Set the Activity State Flags for a process.
+ */
+ public void setActivityStateFlags(@NonNull ProcessRecord proc, int flags) {
+ // TODO(b/302575389): Migrate state pulled from ATMS to a pushed model
+ throw new UnsupportedOperationException("Not implemented yet");
+ }
+
+ /********************** Content Provider State Events **********************/
+ /**
+ * Note that a process is hosting a content provider.
+ */
+ public boolean addPublishedProvider(@NonNull ProcessRecord proc, String name,
+ ContentProviderRecord cpr) {
+ final ProcessProviderRecord providers = proc.mProviders;
+ if (providers.hasProvider(name)) return false;
+ providers.installProvider(name, cpr);
+ return true;
+ }
+
+ /**
+ * Remove a published content provider from a process.
+ */
+ public void removePublishedProvider(@NonNull ProcessRecord proc, String name) {
+ final ProcessProviderRecord providers = proc.mProviders;
+ providers.removeProvider(name);
+ }
+
+ /**
+ * Note that a content provider has an external client.
+ */
+ public void addExternalProviderClient(@NonNull ContentProviderRecord cpr,
+ IBinder externalProcessToken, int callingUid, String callingTag) {
+ cpr.addExternalProcessHandleLocked(externalProcessToken, callingUid, callingTag);
+ }
+
+ /**
+ * Remove an external client from a conetnt provider.
+ */
+ public boolean removeExternalProviderClient(@NonNull ContentProviderRecord cpr,
+ IBinder externalProcessToken) {
+ return cpr.removeExternalProcessHandleLocked(externalProcessToken);
+ }
+
+ /**
+ * Note the time a process is no longer hosting any content providers.
+ */
+ public void setLastProviderTime(@NonNull ProcessRecord proc, long uptimeMs) {
+ proc.mProviders.setLastProviderTime(uptimeMs);
+ }
+
+ /**
+ * Note that a process has connected to a content provider.
+ */
+ public void addProviderConnection(@NonNull ProcessRecord client,
+ ContentProviderConnection cpc) {
+ client.mProviders.addProviderConnection(cpc);
+ }
+
+ /**
+ * Note that a process is no longer connected to a content provider.
+ */
+ public void removeProviderConnection(@NonNull ProcessRecord client,
+ ContentProviderConnection cpc) {
+ client.mProviders.addProviderConnection(cpc);
+ }
+
+ /********************** Content Provider State Events **********************/
+ /*************************** Service State Events **************************/
+ /**
+ * Note that a process has started hosting a service.
+ */
+ public boolean startService(@NonNull ProcessServiceRecord psr, ServiceRecord sr) {
+ return psr.startService(sr);
+ }
+
+ /**
+ * Note that a process has stopped hosting a service.
+ */
+ public boolean stopService(@NonNull ProcessServiceRecord psr, ServiceRecord sr) {
+ return psr.stopService(sr);
+ }
+
+ /**
+ * Remove all services that the process is hosting.
+ */
+ public void stopAllServices(@NonNull ProcessServiceRecord psr) {
+ psr.stopAllServices();
+ }
+
+ /**
+ * Note that a process's service has started executing.
+ */
+ public void startExecutingService(@NonNull ProcessServiceRecord psr, ServiceRecord sr) {
+ psr.startExecutingService(sr);
+ }
+
+ /**
+ * Note that a process's service has stopped executing.
+ */
+ public void stopExecutingService(@NonNull ProcessServiceRecord psr, ServiceRecord sr) {
+ psr.stopExecutingService(sr);
+ }
+
+ /**
+ * Note all executing services a process has has stopped.
+ */
+ public void stopAllExecutingServices(@NonNull ProcessServiceRecord psr) {
+ psr.stopAllExecutingServices();
+ }
+
+ /**
+ * Note that process has bound to a service.
+ */
+ public void addConnection(@NonNull ProcessServiceRecord psr, ConnectionRecord cr) {
+ psr.addConnection(cr);
+ }
+
+ /**
+ * Note that process has unbound from a service.
+ */
+ public void removeConnection(@NonNull ProcessServiceRecord psr, ConnectionRecord cr) {
+ psr.removeConnection(cr);
+ }
+
+ /**
+ * Remove all bindings a process has to services.
+ */
+ public void removeAllConnections(@NonNull ProcessServiceRecord psr) {
+ psr.removeAllConnections();
+ psr.removeAllSdkSandboxConnections();
+ }
+
+ /**
+ * Note whether an executing service should be considered in the foreground or not.
+ */
+ public void setExecServicesFg(@NonNull ProcessServiceRecord psr, boolean execServicesFg) {
+ psr.setExecServicesFg(execServicesFg);
+ }
+
+ /**
+ * Note whether a service is in the foreground or not and what type of FGS, if so.
+ */
+ public void setHasForegroundServices(@NonNull ProcessServiceRecord psr,
+ boolean hasForegroundServices,
+ int fgServiceTypes, boolean hasTypeNoneFgs) {
+ psr.setHasForegroundServices(hasForegroundServices, fgServiceTypes, hasTypeNoneFgs);
+ }
+
+ /**
+ * Note whether a service has a client activity or not.
+ */
+ public void setHasClientActivities(@NonNull ProcessServiceRecord psr,
+ boolean hasClientActivities) {
+ psr.setHasClientActivities(hasClientActivities);
+ }
+
+ /**
+ * Note whether a service should be treated like an activity or not.
+ */
+ public void setTreatLikeActivity(@NonNull ProcessServiceRecord psr, boolean treatLikeActivity) {
+ psr.setTreatLikeActivity(treatLikeActivity);
+ }
+
+ /**
+ * Note whether a process has bound to a service with
+ * {@link android.content.Context.BIND_ABOVE_CLIENT} or not.
+ */
+ public void setHasAboveClient(@NonNull ProcessServiceRecord psr, boolean hasAboveClient) {
+ psr.setHasAboveClient(hasAboveClient);
+ }
+
+ /**
+ * Recompute whether a process has bound to a service with
+ * {@link android.content.Context.BIND_ABOVE_CLIENT} or not.
+ */
+ public void updateHasAboveClientLocked(@NonNull ProcessServiceRecord psr) {
+ psr.updateHasAboveClientLocked();
+ }
+
+ /**
+ * Cleanup a process's state.
+ */
+ public void onCleanupApplicationRecord(@NonNull ProcessServiceRecord psr) {
+ psr.onCleanupApplicationRecordLocked();
+ }
+
+ /**
+ * Set which process is hosting a service.
+ */
+ public void setHostProcess(@NonNull ServiceRecord sr, @Nullable ProcessRecord host) {
+ sr.app = host;
+ }
+
+ /**
+ * Note whether a service is a Foreground Service or not
+ */
+ public void setIsForegroundService(@NonNull ServiceRecord sr, boolean isFgs) {
+ sr.isForeground = isFgs;
+ }
+
+ /**
+ * Note the Foreground Service type of a service.
+ */
+ public void setForegroundServiceType(@NonNull ServiceRecord sr,
+ @ServiceInfo.ForegroundServiceType int fgsType) {
+ sr.foregroundServiceType = fgsType;
+ }
+
+ /**
+ * Note the start time of a short foreground service.
+ */
+ public void setShortFgsInfo(@NonNull ServiceRecord sr, long uptimeNow) {
+ sr.setShortFgsInfo(uptimeNow);
+ }
+
+ /**
+ * Note that a short foreground service has stopped.
+ */
+ public void clearShortFgsInfo(@NonNull ServiceRecord sr) {
+ sr.clearShortFgsInfo();
+ }
+
+ /**
+ * Note the last time a service was active.
+ */
+ public void setServiceLastActivityTime(@NonNull ServiceRecord sr, long lastActivityUpdateMs) {
+ sr.lastActivity = lastActivityUpdateMs;
+ }
+
+ /**
+ * Note that a service start was requested.
+ */
+ public void setStartRequested(@NonNull ServiceRecord sr, boolean startRequested) {
+ sr.startRequested = startRequested;
+ }
+
+ /**
+ * Note the last time the service was bound by a Top process with
+ * {@link android.content.Context.BIND_ALMOST_PERCEPTIBLE}
+ */
+ public void setLastTopAlmostPerceptibleBindRequest(@NonNull ServiceRecord sr,
+ long lastTopAlmostPerceptibleBindRequestUptimeMs) {
+ sr.lastTopAlmostPerceptibleBindRequestUptimeMs =
+ lastTopAlmostPerceptibleBindRequestUptimeMs;
+ }
+
+ /**
+ * Recompute whether a process has bound to a service with
+ * {@link android.content.Context.BIND_ALMOST_PERCEPTIBLE} or not.
+ */
+ public void updateHasTopStartedAlmostPerceptibleServices(@NonNull ProcessServiceRecord psr) {
+ psr.updateHasTopStartedAlmostPerceptibleServices();
+ }
+
+ /**
+ * Builder for ProcessStateController.
+ */
+ public static class Builder {
+ private final ActivityManagerService mAms;
+ private final ProcessList mProcessList;
+ private final ActiveUids mActiveUids;
+
+ private ServiceThread mHandlerThread = null;
+ private OomAdjuster.Injector mOomAdjInjector = null;
+ private boolean mUseOomAdjusterModernImpl = false;
+
+ public Builder(ActivityManagerService ams, ProcessList processList, ActiveUids activeUids) {
+ mAms = ams;
+ mProcessList = processList;
+ mActiveUids = activeUids;
+ }
+
+ /**
+ * Build the ProcessStateController object.
+ */
+ public ProcessStateController build() {
+ if (mHandlerThread == null) {
+ mHandlerThread = OomAdjuster.createAdjusterThread();
+ }
+ if (mOomAdjInjector == null) {
+ mOomAdjInjector = new OomAdjuster.Injector();
+ }
+ return new ProcessStateController(mAms, mProcessList, mActiveUids, mHandlerThread,
+ mOomAdjInjector, mUseOomAdjusterModernImpl);
+ }
+
+ /**
+ * For Testing Purposes. Set what thread OomAdjuster will offload tasks on to.
+ */
+ public Builder setHandlerThread(ServiceThread handlerThread) {
+ mHandlerThread = handlerThread;
+ return this;
+ }
+
+ /**
+ * For Testing Purposes. Set an injector for OomAdjuster.
+ */
+ public Builder setOomAdjusterInjector(OomAdjuster.Injector injector) {
+ mOomAdjInjector = injector;
+ return this;
+ }
+
+ /**
+ * Set which implementation of OomAdjuster to use.
+ */
+ public Builder useModernOomAdjuster(boolean use) {
+ mUseOomAdjusterModernImpl = use;
+ return this;
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/am/ProcessStateRecord.java b/services/core/java/com/android/server/am/ProcessStateRecord.java
index bc990d9..b0f808b 100644
--- a/services/core/java/com/android/server/am/ProcessStateRecord.java
+++ b/services/core/java/com/android/server/am/ProcessStateRecord.java
@@ -19,14 +19,11 @@
import static android.app.ActivityManager.PROCESS_CAPABILITY_NONE;
import static android.app.ActivityManager.PROCESS_STATE_CACHED_EMPTY;
import static android.app.ActivityManager.PROCESS_STATE_NONEXISTENT;
-import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_UI_VISIBILITY;
import static android.app.ProcessMemoryState.HOSTING_COMPONENT_TYPE_ACTIVITY;
import static android.app.ProcessMemoryState.HOSTING_COMPONENT_TYPE_BROADCAST_RECEIVER;
import static android.app.ProcessMemoryState.HOSTING_COMPONENT_TYPE_STARTED_SERVICE;
-import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_OOM_ADJ;
import static com.android.server.am.ProcessList.CACHED_APP_MIN_ADJ;
-import static com.android.server.am.ProcessRecord.TAG;
import static com.android.server.wm.WindowProcessController.ACTIVITY_STATE_FLAG_IS_PAUSING_OR_PAUSED;
import static com.android.server.wm.WindowProcessController.ACTIVITY_STATE_FLAG_IS_STOPPING;
import static com.android.server.wm.WindowProcessController.ACTIVITY_STATE_FLAG_IS_STOPPING_FINISHING;
@@ -38,7 +35,6 @@
import android.content.ComponentName;
import android.os.SystemClock;
import android.os.Trace;
-import android.util.Slog;
import android.util.TimeUtils;
import com.android.internal.annotations.CompositeRWLock;
@@ -790,15 +786,7 @@
@GuardedBy("mService")
void setRunningRemoteAnimation(boolean runningRemoteAnimation) {
- if (mRunningRemoteAnimation == runningRemoteAnimation) {
- return;
- }
mRunningRemoteAnimation = runningRemoteAnimation;
- if (DEBUG_OOM_ADJ) {
- Slog.i(TAG, "Setting runningRemoteAnimation=" + runningRemoteAnimation
- + " for pid=" + mApp.getPid());
- }
- mService.updateOomAdjLocked(mApp, OOM_ADJ_REASON_UI_VISIBILITY);
}
@GuardedBy({"mService", "mProcLock"})
diff --git a/services/core/java/com/android/server/am/ServiceRecord.java b/services/core/java/com/android/server/am/ServiceRecord.java
index b9cdf27..92d33c9 100644
--- a/services/core/java/com/android/server/am/ServiceRecord.java
+++ b/services/core/java/com/android/server/am/ServiceRecord.java
@@ -1248,7 +1248,7 @@
app.mServices.updateBoundClientUids();
app.mServices.updateHostingComonentTypeForBindingsLocked();
}
- app = proc;
+ ams.mProcessStateController.setHostProcess(this, proc);
updateProcessStateOnRequest();
if (pendingConnectionGroup > 0 && proc != null) {
final ProcessServiceRecord psr = proc.mServices;
diff --git a/services/core/java/com/android/server/am/flags.aconfig b/services/core/java/com/android/server/am/flags.aconfig
index 7873d34..adf0e64 100644
--- a/services/core/java/com/android/server/am/flags.aconfig
+++ b/services/core/java/com/android/server/am/flags.aconfig
@@ -218,3 +218,10 @@
description: "Set reset_on_fork flag."
bug: "370988407"
}
+
+flag {
+ name: "push_global_state_to_oomadjuster"
+ namespace: "backstage_power"
+ description: "Migrate OomAdjuster pulled device state to a push model"
+ bug: "302575389"
+}
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 2107406..412599d 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java
@@ -171,6 +171,8 @@
private static int sUiTierSize = 5;
private Context mContext;
+ private ProcessStateController mProcessStateController;
+ private ActiveUids mActiveUids;
private PackageManagerInternal mPackageManagerInternal;
private ActivityManagerService mService;
private OomAdjusterInjector mInjector = new OomAdjusterInjector();
@@ -229,15 +231,19 @@
doCallRealMethod().when(mService).enqueueOomAdjTargetLocked(any(ProcessRecord.class));
doCallRealMethod().when(mService).updateOomAdjPendingTargetsLocked(OOM_ADJ_REASON_ACTIVITY);
setFieldValue(AppProfiler.class, profiler, "mProfilerLock", new Object());
+
doNothing().when(pr).enqueueProcessChangeItemLocked(anyInt(), anyInt(), anyInt(),
anyInt());
doNothing().when(pr).enqueueProcessChangeItemLocked(anyInt(), anyInt(), anyInt(),
anyBoolean());
- mService.mOomAdjuster = mService.mConstants.ENABLE_NEW_OOMADJ
- ? new OomAdjusterModernImpl(mService, mService.mProcessList,
- new ActiveUids(mService, false), mInjector)
- : new OomAdjuster(mService, mService.mProcessList, new ActiveUids(mService, false),
- mInjector);
+ mActiveUids = new ActiveUids(mService, false);
+ mProcessStateController = new ProcessStateController.Builder(mService,
+ mService.mProcessList, mActiveUids)
+ .useModernOomAdjuster(mService.mConstants.ENABLE_NEW_OOMADJ)
+ .setOomAdjusterInjector(mInjector)
+ .build();
+ mService.mProcessStateController = mProcessStateController;
+ mService.mOomAdjuster = mService.mProcessStateController.getOomAdjuster();
mService.mOomAdjuster.mAdjSeq = 10000;
mService.mWakefulness = new AtomicInteger(PowerManagerInternal.WAKEFULNESS_AWAKE);
mSetFlagsRule.enableFlags(Flags.FLAG_NEW_FGS_RESTRICTION_LOGIC);
@@ -246,8 +252,8 @@
@SuppressWarnings("GuardedBy")
@After
public void tearDown() {
- mService.mOomAdjuster.resetInternal();
- mService.mOomAdjuster.mActiveUids.clear();
+ mProcessStateController.getOomAdjuster().resetInternal();
+ mActiveUids.clear();
LocalServices.removeServiceForTest(PackageManagerInternal.class);
mInjector.reset();
}
@@ -293,7 +299,7 @@
private void updateOomAdj(ProcessRecord... apps) {
if (apps.length == 0) {
updateProcessRecordNodes(mService.mProcessList.getLruProcessesLOSP());
- mService.mOomAdjuster.updateOomAdjLocked(OOM_ADJ_REASON_NONE);
+ mProcessStateController.runFullUpdate(OOM_ADJ_REASON_NONE);
} else {
updateProcessRecordNodes(Arrays.asList(apps));
if (apps.length == 1) {
@@ -301,10 +307,10 @@
if (!mService.mProcessList.getLruProcessesLOSP().contains(app)) {
mService.mProcessList.getLruProcessesLOSP().add(app);
}
- mService.mOomAdjuster.updateOomAdjLocked(apps[0], OOM_ADJ_REASON_NONE);
+ mProcessStateController.runUpdate(apps[0], OOM_ADJ_REASON_NONE);
} else {
setProcessesToLru(apps);
- mService.mOomAdjuster.updateOomAdjLocked(OOM_ADJ_REASON_NONE);
+ mProcessStateController.runFullUpdate(OOM_ADJ_REASON_NONE);
mService.mProcessList.getLruProcessesLOSP().clear();
}
}
@@ -318,9 +324,9 @@
private void updateOomAdjPending(ProcessRecord... apps) {
setProcessesToLru(apps);
for (ProcessRecord app : apps) {
- mService.mOomAdjuster.enqueueOomAdjTargetLocked(app);
+ mProcessStateController.enqueueUpdateTarget(app);
}
- mService.mOomAdjuster.updateOomAdjPendingTargetsLocked(OOM_ADJ_REASON_NONE);
+ mProcessStateController.runPendingUpdate(OOM_ADJ_REASON_NONE);
mService.mProcessList.getLruProcessesLOSP().clear();
}
@@ -341,11 +347,10 @@
public void testUpdateOomAdj_DoOne_Persistent_TopUi_Sleeping() {
ProcessRecord app = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID,
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, true));
- app.mState.setMaxAdj(PERSISTENT_PROC_ADJ);
- app.mState.setHasTopUi(true);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_ASLEEP);
+ mProcessStateController.setMaxAdj(app, PERSISTENT_PROC_ADJ);
+ mProcessStateController.setHasTopUi(app, true);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_ASLEEP);
updateOomAdj(app);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
assertProcStates(app, PROCESS_STATE_BOUND_FOREGROUND_SERVICE, PERSISTENT_PROC_ADJ,
SCHED_GROUP_RESTRICTED);
@@ -357,9 +362,9 @@
public void testUpdateOomAdj_DoOne_Persistent_TopUi_Awake() {
ProcessRecord app = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID,
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, true));
- app.mState.setMaxAdj(PERSISTENT_PROC_ADJ);
- app.mState.setHasTopUi(true);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setMaxAdj(app, PERSISTENT_PROC_ADJ);
+ mProcessStateController.setHasTopUi(app, true);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app);
assertProcStates(app, PROCESS_STATE_PERSISTENT_UI, PERSISTENT_PROC_ADJ,
@@ -371,9 +376,9 @@
public void testUpdateOomAdj_DoOne_Persistent_TopApp() {
ProcessRecord app = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID,
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, true));
- app.mState.setMaxAdj(PERSISTENT_PROC_ADJ);
+ mProcessStateController.setMaxAdj(app, PERSISTENT_PROC_ADJ);
doReturn(app).when(mService).getTopApp();
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app);
doReturn(null).when(mService).getTopApp();
@@ -388,7 +393,7 @@
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, true));
doReturn(PROCESS_STATE_TOP).when(mService.mAtmInternal).getTopProcessState();
doReturn(app).when(mService).getTopApp();
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app);
doReturn(null).when(mService).getTopApp();
@@ -401,8 +406,8 @@
ProcessRecord app = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID,
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, true));
doReturn(PROCESS_STATE_TOP_SLEEPING).when(mService.mAtmInternal).getTopProcessState();
- app.mState.setRunningRemoteAnimation(true);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setRunningRemoteAnimation(app, true);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app);
doReturn(PROCESS_STATE_TOP).when(mService.mAtmInternal).getTopProcessState();
@@ -415,7 +420,7 @@
ProcessRecord app = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID,
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, true));
doReturn(mock(ActiveInstrumentation.class)).when(app).getActiveInstrumentation();
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app);
doCallRealMethod().when(app).getActiveInstrumentation();
@@ -431,7 +436,7 @@
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, true));
doReturn(true).when(mService).isReceivingBroadcastLocked(any(ProcessRecord.class),
any(int[].class));
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app);
doReturn(false).when(mService).isReceivingBroadcastLocked(any(ProcessRecord.class),
any(int[].class));
@@ -466,8 +471,8 @@
public void testUpdateOomAdj_DoOne_ExecutingService() {
ProcessRecord app = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID,
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, true));
- app.mServices.startExecutingService(mock(ServiceRecord.class));
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.startExecutingService(app.mServices, mock(ServiceRecord.class));
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app);
assertProcStates(app, PROCESS_STATE_SERVICE, FOREGROUND_APP_ADJ, SCHED_GROUP_BACKGROUND);
@@ -480,11 +485,11 @@
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, true));
doReturn(PROCESS_STATE_TOP_SLEEPING).when(mService.mAtmInternal).getTopProcessState();
doReturn(app).when(mService).getTopApp();
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_ASLEEP);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_ASLEEP);
updateOomAdj(app);
doReturn(null).when(mService).getTopApp();
doReturn(PROCESS_STATE_TOP).when(mService.mAtmInternal).getTopProcessState();
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
assertProcStates(app, PROCESS_STATE_TOP_SLEEPING, FOREGROUND_APP_ADJ,
SCHED_GROUP_BACKGROUND);
@@ -498,7 +503,7 @@
app.mState.setCurRawAdj(CACHED_APP_MIN_ADJ);
app.mState.setCurAdj(CACHED_APP_MIN_ADJ);
doReturn(null).when(mService).getTopApp();
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app);
final int expectedAdj = mService.mConstants.USE_TIERED_CACHED_ADJ
@@ -516,7 +521,7 @@
doReturn(true).when(wpc).hasActivities();
doReturn(WindowProcessController.ACTIVITY_STATE_FLAG_IS_VISIBLE)
.when(wpc).getActivityStateFlags();
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app);
assertProcStates(app, PROCESS_STATE_TOP, VISIBLE_APP_ADJ, SCHED_GROUP_DEFAULT);
@@ -555,7 +560,7 @@
WindowProcessController wpc = app.getWindowProcessController();
doReturn(true).when(wpc).hasRecentTasks();
app.mState.setLastTopTime(SystemClock.uptimeMillis());
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app);
doCallRealMethod().when(wpc).hasRecentTasks();
@@ -567,9 +572,9 @@
public void testUpdateOomAdj_DoOne_FgServiceLocation() {
ProcessRecord app = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID,
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, true));
- app.mServices.setHasForegroundServices(true, ServiceInfo.FOREGROUND_SERVICE_TYPE_LOCATION,
- /* hasNoneType=*/false);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setHasForegroundServices(app.mServices, true,
+ ServiceInfo.FOREGROUND_SERVICE_TYPE_LOCATION, /* hasNoneType=*/false);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app);
assertProcStates(app, PROCESS_STATE_FOREGROUND_SERVICE, PERCEPTIBLE_APP_ADJ,
@@ -582,8 +587,9 @@
public void testUpdateOomAdj_DoOne_FgService() {
ProcessRecord app = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID,
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, true));
- app.mServices.setHasForegroundServices(true, 0, /* hasNoneType=*/true);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setHasForegroundServices(app.mServices, true, 0, /* hasNoneType=*/
+ true);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app);
assertProcStates(app, PROCESS_STATE_FOREGROUND_SERVICE, PERCEPTIBLE_APP_ADJ,
@@ -599,20 +605,20 @@
ServiceRecord s = ServiceRecord.newEmptyInstanceForTest(mService);
s.appInfo = new ApplicationInfo();
- s.startRequested = true;
+ mProcessStateController.setStartRequested(s, true);
s.isForeground = true;
s.foregroundServiceType = FOREGROUND_SERVICE_TYPE_SHORT_SERVICE;
- s.setShortFgsInfo(SystemClock.uptimeMillis());
+ mProcessStateController.setShortFgsInfo(s, SystemClock.uptimeMillis());
// SHORT_SERVICE FGS will get IMP_FG and a slightly different recent-adjustment.
{
ProcessRecord app = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID,
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, true));
- app.mServices.startService(s);
- app.mServices.setHasForegroundServices(true,
+ mProcessStateController.startService(app.mServices, s);
+ mProcessStateController.setHasForegroundServices(app.mServices, true,
FOREGROUND_SERVICE_TYPE_SHORT_SERVICE, /* hasNoneType=*/false);
app.mState.setLastTopTime(SystemClock.uptimeMillis());
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app);
@@ -625,9 +631,9 @@
{
ProcessRecord app = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID,
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, true));
- app.mServices.setHasForegroundServices(true,
+ mProcessStateController.setHasForegroundServices(app.mServices, true,
FOREGROUND_SERVICE_TYPE_SHORT_SERVICE, /* hasNoneType=*/false);
- app.mServices.startService(s);
+ mProcessStateController.startService(app.mServices, s);
app.mState.setLastTopTime(SystemClock.uptimeMillis()
- mService.mConstants.TOP_TO_FGS_GRACE_DURATION);
mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
@@ -642,21 +648,21 @@
// SHORT_SERVICE, timed out already.
s = ServiceRecord.newEmptyInstanceForTest(mService);
s.appInfo = new ApplicationInfo();
- s.startRequested = true;
+ mProcessStateController.setStartRequested(s, true);
s.isForeground = true;
s.foregroundServiceType = FOREGROUND_SERVICE_TYPE_SHORT_SERVICE;
- s.setShortFgsInfo(SystemClock.uptimeMillis()
+ mProcessStateController.setShortFgsInfo(s, SystemClock.uptimeMillis()
- mService.mConstants.mShortFgsTimeoutDuration
- mService.mConstants.mShortFgsProcStateExtraWaitDuration);
{
ProcessRecord app = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID,
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, true));
- app.mServices.setHasForegroundServices(true,
+ mProcessStateController.setHasForegroundServices(app.mServices, true,
FOREGROUND_SERVICE_TYPE_SHORT_SERVICE, /* hasNoneType=*/false);
- app.mServices.startService(s);
+ mProcessStateController.startService(app.mServices, s);
app.mState.setLastTopTime(SystemClock.uptimeMillis()
- mService.mConstants.TOP_TO_FGS_GRACE_DURATION);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app);
@@ -671,8 +677,8 @@
public void testUpdateOomAdj_DoOne_OverlayUi() {
ProcessRecord app = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID,
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, true));
- app.mState.setHasOverlayUi(true);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setHasOverlayUi(app, true);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app);
assertProcStates(app, PROCESS_STATE_IMPORTANT_FOREGROUND, PERCEPTIBLE_APP_ADJ,
@@ -684,9 +690,10 @@
public void testUpdateOomAdj_DoOne_PerceptibleRecent_FgService() {
ProcessRecord app = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID,
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, true));
- app.mServices.setHasForegroundServices(true, 0, /* hasNoneType=*/true);
+ mProcessStateController.setHasForegroundServices(app.mServices, true, 0, /* hasNoneType=*/
+ true);
app.mState.setLastTopTime(SystemClock.uptimeMillis());
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app);
assertProcStates(app, PROCESS_STATE_FOREGROUND_SERVICE,
@@ -699,7 +706,7 @@
verify(mService.mHandler).sendEmptyMessageAtTime(
eq(FOLLOW_UP_OOMADJUSTER_UPDATE_MSG), followUpTimeCaptor.capture());
mInjector.jumpUptimeAheadTo(followUpTimeCaptor.getValue());
- mService.mOomAdjuster.updateOomAdjFollowUpTargetsLocked();
+ mProcessStateController.runFollowUpUpdate();
assertProcStates(app, PROCESS_STATE_FOREGROUND_SERVICE, PERCEPTIBLE_APP_ADJ,
SCHED_GROUP_DEFAULT, "fg-service");
@@ -722,9 +729,9 @@
// Simulate the system starting and binding to a service in the app.
ServiceRecord s = bindService(app, system,
null, null, Context.BIND_ALMOST_PERCEPTIBLE, mock(IBinder.class));
- s.lastTopAlmostPerceptibleBindRequestUptimeMs = nowUptime;
+ mProcessStateController.setLastTopAlmostPerceptibleBindRequest(s, nowUptime);
s.getConnections().clear();
- app.mServices.updateHasTopStartedAlmostPerceptibleServices();
+ mProcessStateController.updateHasTopStartedAlmostPerceptibleServices(app.mServices);
mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app);
@@ -736,7 +743,7 @@
verify(mService.mHandler).sendEmptyMessageAtTime(
eq(FOLLOW_UP_OOMADJUSTER_UPDATE_MSG), followUpTimeCaptor.capture());
mInjector.jumpUptimeAheadTo(followUpTimeCaptor.getValue());
- mService.mOomAdjuster.updateOomAdjFollowUpTargetsLocked();
+ mProcessStateController.runFollowUpUpdate();
final int expectedAdj = mService.mConstants.USE_TIERED_CACHED_ADJ
? sFirstUiCachedAdj : sFirstCachedAdj;
@@ -758,15 +765,15 @@
// Simulate the system starting and binding to a service in the app.
ServiceRecord s = bindService(app, system,
null, null, Context.BIND_ALMOST_PERCEPTIBLE + 2, mock(IBinder.class));
- s.lastTopAlmostPerceptibleBindRequestUptimeMs =
- nowUptime - 2 * mService.mConstants.mServiceBindAlmostPerceptibleTimeoutMs;
- app.mServices.updateHasTopStartedAlmostPerceptibleServices();
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setLastTopAlmostPerceptibleBindRequest(s,
+ nowUptime - 2 * mService.mConstants.mServiceBindAlmostPerceptibleTimeoutMs);
+ mProcessStateController.updateHasTopStartedAlmostPerceptibleServices(app.mServices);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app);
assertEquals(PERCEPTIBLE_RECENT_FOREGROUND_APP_ADJ + 2, app.mState.getSetAdj());
- mService.mOomAdjuster.resetInternal();
+ mProcessStateController.getOomAdjuster().resetInternal();
}
// Out of grace period and no valid binding so no adjustment.
@@ -780,16 +787,16 @@
// Simulate the system starting and binding to a service in the app.
ServiceRecord s = bindService(app, system,
null, null, Context.BIND_ALMOST_PERCEPTIBLE, mock(IBinder.class));
- s.lastTopAlmostPerceptibleBindRequestUptimeMs =
- nowUptime - 2 * mService.mConstants.mServiceBindAlmostPerceptibleTimeoutMs;
+ mProcessStateController.setLastTopAlmostPerceptibleBindRequest(s,
+ nowUptime - 2 * mService.mConstants.mServiceBindAlmostPerceptibleTimeoutMs);
s.getConnections().clear();
- app.mServices.updateHasTopStartedAlmostPerceptibleServices();
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.updateHasTopStartedAlmostPerceptibleServices(app.mServices);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app);
assertNotEquals(PERCEPTIBLE_RECENT_FOREGROUND_APP_ADJ + 2, app.mState.getSetAdj());
- mService.mOomAdjuster.resetInternal();
+ mProcessStateController.getOomAdjuster().resetInternal();
}
}
@@ -800,12 +807,12 @@
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, true));
ProcessRecord app = spy(makeDefaultProcessRecord(MOCKAPP2_PID, MOCKAPP2_UID,
MOCKAPP2_PROCESSNAME, MOCKAPP2_PACKAGENAME, true));
- system.mState.setMaxAdj(PERSISTENT_PROC_ADJ);
- system.mState.setHasTopUi(true);
+ mProcessStateController.setMaxAdj(system, PERSISTENT_PROC_ADJ);
+ mProcessStateController.setHasTopUi(system, true);
// Simulate the system starting and binding to a service in the app.
ServiceRecord s = bindService(app, system,
null, null, Context.BIND_ALMOST_PERCEPTIBLE, mock(IBinder.class));
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(system, app);
assertProcStates(app, PROCESS_STATE_IMPORTANT_FOREGROUND,
@@ -817,8 +824,8 @@
public void testUpdateOomAdj_DoOne_Toast() {
ProcessRecord app = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID,
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, true));
- app.mState.setForcingToImportant(new Object());
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setForcingToImportant(app, new Object());
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app);
assertProcStates(app, PROCESS_STATE_TRANSIENT_BACKGROUND, PERCEPTIBLE_APP_ADJ,
@@ -832,7 +839,7 @@
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, true));
WindowProcessController wpc = app.getWindowProcessController();
doReturn(true).when(wpc).isHeavyWeightProcess();
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app);
doReturn(false).when(wpc).isHeavyWeightProcess();
@@ -847,7 +854,7 @@
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, true));
WindowProcessController wpc = app.getWindowProcessController();
doReturn(true).when(wpc).isHomeProcess();
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app);
assertProcStates(app, PROCESS_STATE_HOME, HOME_APP_ADJ, SCHED_GROUP_BACKGROUND);
@@ -861,7 +868,7 @@
WindowProcessController wpc = app.getWindowProcessController();
doReturn(true).when(wpc).isPreviousProcess();
doReturn(true).when(wpc).hasActivities();
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app);
assertProcStates(app, PROCESS_STATE_LAST_ACTIVITY, PREVIOUS_APP_ADJ,
@@ -873,7 +880,7 @@
verify(mService.mHandler).sendEmptyMessageAtTime(eq(FOLLOW_UP_OOMADJUSTER_UPDATE_MSG),
followUpTimeCaptor.capture());
mInjector.jumpUptimeAheadTo(followUpTimeCaptor.getValue());
- mService.mOomAdjuster.updateOomAdjFollowUpTargetsLocked();
+ mProcessStateController.runFollowUpUpdate();
int expectedAdj = mService.mConstants.USE_TIERED_CACHED_ADJ
? sFirstUiCachedAdj : CACHED_APP_MIN_ADJ;
@@ -896,9 +903,9 @@
doReturn(true).when(wpc).isPreviousProcess();
doReturn(true).when(wpc).hasActivities();
}
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
setProcessesToLru(apps);
- mService.mOomAdjuster.updateOomAdjLocked(OOM_ADJ_REASON_NONE);
+ mProcessStateController.runFullUpdate(OOM_ADJ_REASON_NONE);
for (int i = 0; i < numberOfApps; i++) {
assertProcStates(apps[i], PROCESS_STATE_LAST_ACTIVITY, PREVIOUS_APP_ADJ,
@@ -914,7 +921,7 @@
mInjector.jumpUptimeAheadTo(followUpTimeCaptor.getValue());
}
- mService.mOomAdjuster.updateOomAdjFollowUpTargetsLocked();
+ mProcessStateController.runFollowUpUpdate();
for (int i = 0; i < numberOfApps; i++) {
final int mruIndex = numberOfApps - i - 1;
@@ -938,10 +945,8 @@
public void testUpdateOomAdj_DoOne_Backup() {
ProcessRecord app = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID,
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, true));
- BackupRecord backupTarget = new BackupRecord(null, 0, 0, 0);
- backupTarget.app = app;
- doReturn(backupTarget).when(mService.mBackupTargets).get(anyInt());
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setBackupTarget(app);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app);
doReturn(null).when(mService.mBackupTargets).get(anyInt());
@@ -954,8 +959,8 @@
public void testUpdateOomAdj_DoOne_ClientActivities() {
ProcessRecord app = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID,
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, true));
- app.mServices.setHasClientActivities(true);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setHasClientActivities(app.mServices, true);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app);
assertEquals(PROCESS_STATE_CACHED_ACTIVITY_CLIENT, app.mState.getSetProcState());
@@ -966,8 +971,8 @@
public void testUpdateOomAdj_DoOne_TreatLikeActivity() {
ProcessRecord app = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID,
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, true));
- app.mServices.setTreatLikeActivity(true);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setTreatLikeActivity(app.mServices, true);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app);
assertEquals(PROCESS_STATE_CACHED_ACTIVITY, app.mState.getSetProcState());
@@ -981,10 +986,10 @@
app.mState.setServiceB(true);
ServiceRecord s = mock(ServiceRecord.class);
doReturn(new ArrayMap<IBinder, ArrayList<ConnectionRecord>>()).when(s).getConnections();
- s.startRequested = true;
- s.lastActivity = SystemClock.uptimeMillis();
- app.mServices.startService(s);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setStartRequested(s, true);
+ mProcessStateController.setServiceLastActivityTime(s, SystemClock.uptimeMillis());
+ mProcessStateController.startService(app.mServices, s);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app);
assertProcStates(app, PROCESS_STATE_SERVICE, SERVICE_B_ADJ, SCHED_GROUP_BACKGROUND);
@@ -995,8 +1000,8 @@
public void testUpdateOomAdj_DoOne_MaxAdj() {
ProcessRecord app = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID,
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, false));
- app.mState.setMaxAdj(PERCEPTIBLE_LOW_APP_ADJ);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setMaxAdj(app, PERCEPTIBLE_LOW_APP_ADJ);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app);
assertProcStates(app, PROCESS_STATE_CACHED_EMPTY, PERCEPTIBLE_LOW_APP_ADJ,
@@ -1011,7 +1016,7 @@
app.mState.setCurRawAdj(SERVICE_ADJ);
app.mState.setCurAdj(SERVICE_ADJ);
doReturn(null).when(mService).getTopApp();
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app);
assertTrue(ProcessList.CACHED_APP_MIN_ADJ <= app.mState.getSetAdj());
@@ -1025,10 +1030,10 @@
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, false));
ServiceRecord s = mock(ServiceRecord.class);
doReturn(new ArrayMap<IBinder, ArrayList<ConnectionRecord>>()).when(s).getConnections();
- s.startRequested = true;
- s.lastActivity = SystemClock.uptimeMillis();
- app.mServices.startService(s);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setStartRequested(s, true);
+ mProcessStateController.setServiceLastActivityTime(s, SystemClock.uptimeMillis());
+ mProcessStateController.startService(app.mServices, s);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app);
assertProcStates(app, PROCESS_STATE_SERVICE, SERVICE_ADJ, SCHED_GROUP_BACKGROUND);
@@ -1043,8 +1048,8 @@
MOCKAPP2_PROCESSNAME, MOCKAPP2_PACKAGENAME, false));
ServiceRecord s = bindService(app, client, null, null, Context.BIND_WAIVE_PRIORITY,
mock(IBinder.class));
- s.startRequested = true;
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setStartRequested(s, true);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
doReturn(PROCESS_STATE_TOP).when(mService.mAtmInternal).getTopProcessState();
doReturn(client).when(mService).getTopApp();
updateOomAdj(client, app);
@@ -1062,10 +1067,10 @@
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, false));
ProcessRecord client = spy(makeDefaultProcessRecord(MOCKAPP2_PID, MOCKAPP2_UID,
MOCKAPP2_PROCESSNAME, MOCKAPP2_PACKAGENAME, false));
- client.mServices.setTreatLikeActivity(true);
+ mProcessStateController.setTreatLikeActivity(client.mServices, true);
bindService(app, client, null, null, Context.BIND_WAIVE_PRIORITY
| Context.BIND_TREAT_LIKE_ACTIVITY, mock(IBinder.class));
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(client, app);
assertEquals(PROCESS_STATE_CACHED_ACTIVITY, app.mState.getSetProcState());
@@ -1086,7 +1091,7 @@
mock(ActivityServiceConnectionsHolder.class));
doReturn(client).when(mService).getTopApp();
doReturn(true).when(cr.activity).isActivityVisible();
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(client, app);
assertEquals(FOREGROUND_APP_ADJ, app.mState.getSetAdj());
@@ -1099,7 +1104,7 @@
ProcessRecord app = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID,
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, false));
bindService(app, app, null, null, 0, mock(IBinder.class));
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app);
final int expectedAdj = mService.mConstants.USE_TIERED_CACHED_ADJ
@@ -1114,9 +1119,9 @@
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, false));
ProcessRecord client = spy(makeDefaultProcessRecord(MOCKAPP2_PID, MOCKAPP2_UID,
MOCKAPP2_PROCESSNAME, MOCKAPP2_PACKAGENAME, false));
- client.mServices.setTreatLikeActivity(true);
+ mProcessStateController.setTreatLikeActivity(client.mServices, true);
bindService(app, client, null, null, 0, mock(IBinder.class));
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(client, app);
assertEquals(PROCESS_STATE_CACHED_EMPTY, app.mState.getSetProcState());
@@ -1137,7 +1142,7 @@
mock(IBinder.class));
doReturn(PROCESS_STATE_TOP).when(mService.mAtmInternal).getTopProcessState();
doReturn(client).when(mService).getTopApp();
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(client, app);
doReturn(null).when(mService).getTopApp();
@@ -1152,9 +1157,9 @@
ProcessRecord client = spy(makeDefaultProcessRecord(MOCKAPP2_PID, MOCKAPP2_UID,
MOCKAPP2_PROCESSNAME, MOCKAPP2_PACKAGENAME, false));
bindService(app, client, null, null, Context.BIND_FOREGROUND_SERVICE, mock(IBinder.class));
- client.mState.setMaxAdj(PERSISTENT_PROC_ADJ);
- client.mState.setHasTopUi(true);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setMaxAdj(client, PERSISTENT_PROC_ADJ);
+ mProcessStateController.setHasTopUi(client, true);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(client, app);
assertProcStates(app, PROCESS_STATE_BOUND_FOREGROUND_SERVICE, VISIBLE_APP_ADJ,
@@ -1170,8 +1175,8 @@
ProcessRecord client = spy(makeDefaultProcessRecord(MOCKAPP2_PID, MOCKAPP2_UID,
MOCKAPP2_PROCESSNAME, MOCKAPP2_PACKAGENAME, false));
bindService(app, client, null, null, Context.BIND_IMPORTANT, mock(IBinder.class));
- client.mServices.startExecutingService(mock(ServiceRecord.class));
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.startExecutingService(client.mServices, mock(ServiceRecord.class));
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(client, app);
assertEquals(FOREGROUND_APP_ADJ, app.mState.getSetAdj());
@@ -1188,7 +1193,7 @@
bindService(app, client, null, null, 0, mock(IBinder.class));
doReturn(PROCESS_STATE_TOP).when(mService.mAtmInternal).getTopProcessState();
doReturn(client).when(mService).getTopApp();
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(client, app);
doReturn(null).when(mService).getTopApp();
@@ -1203,8 +1208,8 @@
ProcessRecord client = spy(makeDefaultProcessRecord(MOCKAPP2_PID, MOCKAPP2_UID,
MOCKAPP2_PROCESSNAME, MOCKAPP2_PACKAGENAME, false));
bindService(app, client, null, null, Context.BIND_FOREGROUND_SERVICE, mock(IBinder.class));
- client.mState.setMaxAdj(PERSISTENT_PROC_ADJ);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setMaxAdj(client, PERSISTENT_PROC_ADJ);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(client, app);
assertEquals(PROCESS_STATE_BOUND_FOREGROUND_SERVICE, app.mState.getSetProcState());
@@ -1222,9 +1227,9 @@
MOCKAPP2_PROCESSNAME, MOCKAPP2_PACKAGENAME, false));
bindService(app, client, null, null, Context.BIND_FOREGROUND_SERVICE, mock(IBinder.class));
client.mState.setMaxAdj(PERSISTENT_PROC_ADJ);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_ASLEEP);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_ASLEEP);
updateOomAdj(client, app);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
assertProcStates(app, PROCESS_STATE_BOUND_FOREGROUND_SERVICE, VISIBLE_APP_ADJ,
SCHED_GROUP_RESTRICTED);
@@ -1240,8 +1245,8 @@
ProcessRecord client = spy(makeDefaultProcessRecord(MOCKAPP2_PID, MOCKAPP2_UID,
MOCKAPP2_PROCESSNAME, MOCKAPP2_PACKAGENAME, false));
bindService(app, client, null, null, Context.BIND_NOT_FOREGROUND, mock(IBinder.class));
- client.mState.setMaxAdj(PERSISTENT_PROC_ADJ);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setMaxAdj(client, PERSISTENT_PROC_ADJ);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(client, app);
assertEquals(PROCESS_STATE_TRANSIENT_BACKGROUND, app.mState.getSetProcState());
@@ -1256,8 +1261,9 @@
ProcessRecord client = spy(makeDefaultProcessRecord(MOCKAPP2_PID, MOCKAPP2_UID,
MOCKAPP2_PROCESSNAME, MOCKAPP2_PACKAGENAME, false));
bindService(app, client, null, null, 0, mock(IBinder.class));
- client.mServices.setHasForegroundServices(true, 0, /* hasNoneType=*/true);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setHasForegroundServices(client.mServices, true,
+ 0, /* hasNoneType=*/true);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(client, app);
assertEquals(PROCESS_STATE_FOREGROUND_SERVICE, client.mState.getSetProcState());
@@ -1279,16 +1285,16 @@
// In order to trick OomAdjuster to think it has a short-service, we need this logic.
ServiceRecord s = ServiceRecord.newEmptyInstanceForTest(mService);
s.appInfo = new ApplicationInfo();
- s.startRequested = true;
- s.isForeground = true;
- s.foregroundServiceType = FOREGROUND_SERVICE_TYPE_SHORT_SERVICE;
- s.setShortFgsInfo(SystemClock.uptimeMillis());
- client.mServices.startService(s);
+ mProcessStateController.setStartRequested(s, true);
+ mProcessStateController.setIsForegroundService(s, true);
+ mProcessStateController.setForegroundServiceType(s, FOREGROUND_SERVICE_TYPE_SHORT_SERVICE);
+ mProcessStateController.setShortFgsInfo(s, SystemClock.uptimeMillis());
+ mProcessStateController.startService(client.mServices, s);
client.mState.setLastTopTime(SystemClock.uptimeMillis());
- client.mServices.setHasForegroundServices(true, FOREGROUND_SERVICE_TYPE_SHORT_SERVICE,
- /* hasNoneType=*/false);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setHasForegroundServices(client.mServices, true,
+ FOREGROUND_SERVICE_TYPE_SHORT_SERVICE, /* hasNoneType=*/false);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(client, app);
// Client only has a SHORT_FGS, so it doesn't have BFSL, and that's propagated.
@@ -1310,16 +1316,16 @@
// In order to trick OomAdjuster to think it has a short-service, we need this logic.
ServiceRecord s = ServiceRecord.newEmptyInstanceForTest(mService);
s.appInfo = new ApplicationInfo();
- s.startRequested = true;
- s.isForeground = true;
- s.foregroundServiceType = FOREGROUND_SERVICE_TYPE_SHORT_SERVICE;
- s.setShortFgsInfo(SystemClock.uptimeMillis());
- app2.mServices.startService(s);
+ mProcessStateController.setStartRequested(s, true);
+ mProcessStateController.setIsForegroundService(s, true);
+ mProcessStateController.setForegroundServiceType(s, FOREGROUND_SERVICE_TYPE_SHORT_SERVICE);
+ mProcessStateController.setShortFgsInfo(s, SystemClock.uptimeMillis());
+ mProcessStateController.startService(app2.mServices, s);
app2.mState.setLastTopTime(SystemClock.uptimeMillis());
- app2.mServices.setHasForegroundServices(true, FOREGROUND_SERVICE_TYPE_SHORT_SERVICE,
- /* hasNoneType=*/false);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setHasForegroundServices(app2.mServices, true,
+ FOREGROUND_SERVICE_TYPE_SHORT_SERVICE, /* hasNoneType=*/false);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app2);
// Client only has a SHORT_FGS, so it doesn't have BFSL, and that's propagated.
@@ -1331,7 +1337,7 @@
// Persistent process
ProcessRecord pers = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID,
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, false));
- pers.mState.setMaxAdj(PERSISTENT_PROC_ADJ);
+ mProcessStateController.setMaxAdj(pers, PERSISTENT_PROC_ADJ);
// app1, which is bound by pers (which makes it BFGS)
ProcessRecord app1 = spy(makeDefaultProcessRecord(MOCKAPP2_PID, MOCKAPP2_UID,
@@ -1358,18 +1364,16 @@
ProcessRecord client = spy(makeDefaultProcessRecord(MOCKAPP2_PID, MOCKAPP2_UID,
MOCKAPP2_PROCESSNAME, MOCKAPP2_PACKAGENAME, false));
bindService(app, client, null, null, Context.BIND_ABOVE_CLIENT, mock(IBinder.class));
- BackupRecord backupTarget = new BackupRecord(null, 0, 0, 0);
- backupTarget.app = client;
- doReturn(backupTarget).when(mService.mBackupTargets).get(anyInt());
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setBackupTarget(client);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(client, app);
- doReturn(null).when(mService.mBackupTargets).get(anyInt());
+ mProcessStateController.stopBackupTarget(UserHandle.getUserId(MOCKAPP2_UID));
assertEquals(BACKUP_APP_ADJ, app.mState.getSetAdj());
assertNoBfsl(app);
- client.mState.setMaxAdj(PERSISTENT_PROC_ADJ);
+ mProcessStateController.setMaxAdj(client, PERSISTENT_PROC_ADJ);
updateOomAdj(client, app);
assertEquals(PERSISTENT_SERVICE_ADJ, app.mState.getSetAdj());
@@ -1384,8 +1388,8 @@
ProcessRecord client = spy(makeDefaultProcessRecord(MOCKAPP2_PID, MOCKAPP2_UID,
MOCKAPP2_PROCESSNAME, MOCKAPP2_PACKAGENAME, false));
bindService(app, client, null, null, Context.BIND_NOT_PERCEPTIBLE, mock(IBinder.class));
- client.mState.setRunningRemoteAnimation(true);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setRunningRemoteAnimation(client, true);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(client, app);
assertEquals(PERCEPTIBLE_LOW_APP_ADJ, app.mState.getSetAdj());
@@ -1399,8 +1403,8 @@
ProcessRecord client = spy(makeDefaultProcessRecord(MOCKAPP2_PID, MOCKAPP2_UID,
MOCKAPP2_PROCESSNAME, MOCKAPP2_PACKAGENAME, false));
bindService(app, client, null, null, Context.BIND_NOT_VISIBLE, mock(IBinder.class));
- client.mState.setRunningRemoteAnimation(true);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setRunningRemoteAnimation(client, true);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(client, app);
assertEquals(PERCEPTIBLE_APP_ADJ, app.mState.getSetAdj());
@@ -1414,8 +1418,8 @@
ProcessRecord client = spy(makeDefaultProcessRecord(MOCKAPP2_PID, MOCKAPP2_UID,
MOCKAPP2_PROCESSNAME, MOCKAPP2_PACKAGENAME, false));
bindService(app, client, null, null, 0, mock(IBinder.class));
- client.mState.setHasOverlayUi(true);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setHasOverlayUi(client, true);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(client, app);
assertEquals(PERCEPTIBLE_APP_ADJ, app.mState.getSetAdj());
@@ -1432,13 +1436,13 @@
bindService(app, client, null, null,
Context.BIND_ALMOST_PERCEPTIBLE | Context.BIND_NOT_FOREGROUND,
mock(IBinder.class));
- client.mState.setMaxAdj(PERSISTENT_PROC_ADJ);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setMaxAdj(client, PERSISTENT_PROC_ADJ);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(client, app);
assertEquals(PERCEPTIBLE_MEDIUM_APP_ADJ + 2, app.mState.getSetAdj());
- mService.mOomAdjuster.resetInternal();
+ mProcessStateController.getOomAdjuster().resetInternal();
}
{
@@ -1451,14 +1455,14 @@
bindService(app, client, null, null,
Context.BIND_ALMOST_PERCEPTIBLE | Context.BIND_NOT_FOREGROUND,
mock(IBinder.class));
- client.mState.setMaxAdj(PERSISTENT_PROC_ADJ);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setMaxAdj(client, PERSISTENT_PROC_ADJ);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(client, app);
doReturn(false).when(wpc).isHeavyWeightProcess();
assertEquals(PERCEPTIBLE_MEDIUM_APP_ADJ + 2, app.mState.getSetAdj());
- mService.mOomAdjuster.resetInternal();
+ mProcessStateController.getOomAdjuster().resetInternal();
}
{
@@ -1469,13 +1473,13 @@
bindService(app, client, null, null,
Context.BIND_ALMOST_PERCEPTIBLE,
mock(IBinder.class));
- client.mState.setMaxAdj(PERSISTENT_PROC_ADJ);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setMaxAdj(client, PERSISTENT_PROC_ADJ);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(client, app);
assertEquals(PERCEPTIBLE_APP_ADJ + 1, app.mState.getSetAdj());
- mService.mOomAdjuster.resetInternal();
+ mProcessStateController.getOomAdjuster().resetInternal();
}
{
@@ -1488,14 +1492,14 @@
bindService(app, client, null, null,
Context.BIND_ALMOST_PERCEPTIBLE,
mock(IBinder.class));
- client.mState.setMaxAdj(PERSISTENT_PROC_ADJ);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setMaxAdj(client, PERSISTENT_PROC_ADJ);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(client, app);
doReturn(false).when(wpc).isHeavyWeightProcess();
assertEquals(PERCEPTIBLE_APP_ADJ + 1, app.mState.getSetAdj());
- mService.mOomAdjuster.resetInternal();
+ mProcessStateController.getOomAdjuster().resetInternal();
}
}
@@ -1507,8 +1511,8 @@
ProcessRecord client = spy(makeDefaultProcessRecord(MOCKAPP2_PID, MOCKAPP2_UID,
MOCKAPP2_PROCESSNAME, MOCKAPP2_PACKAGENAME, false));
bindService(app, client, null, null, 0, mock(IBinder.class));
- client.mState.setRunningRemoteAnimation(true);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setRunningRemoteAnimation(client, true);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(client, app);
assertEquals(VISIBLE_APP_ADJ, app.mState.getSetAdj());
@@ -1523,8 +1527,8 @@
MOCKAPP2_PROCESSNAME, MOCKAPP2_PACKAGENAME, false));
bindService(app, client, null, null, Context.BIND_IMPORTANT_BACKGROUND,
mock(IBinder.class));
- client.mState.setHasOverlayUi(true);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setHasOverlayUi(client, true);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(client, app);
assertEquals(PROCESS_STATE_IMPORTANT_BACKGROUND, app.mState.getSetProcState());
@@ -1552,8 +1556,8 @@
ProcessRecord client = spy(makeDefaultProcessRecord(MOCKAPP2_PID, MOCKAPP2_UID,
MOCKAPP2_PROCESSNAME, MOCKAPP2_PACKAGENAME, false));
bindProvider(app, client, null, null, false);
- client.mServices.setTreatLikeActivity(true);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setTreatLikeActivity(client.mServices, true);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app, client);
final int expectedAdj = mService.mConstants.USE_TIERED_CACHED_ADJ
@@ -1571,7 +1575,7 @@
bindProvider(app, client, null, null, false);
doReturn(PROCESS_STATE_TOP).when(mService.mAtmInternal).getTopProcessState();
doReturn(client).when(mService).getTopApp();
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(client, app);
doReturn(null).when(mService).getTopApp();
@@ -1585,9 +1589,9 @@
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, false));
ProcessRecord client = spy(makeDefaultProcessRecord(MOCKAPP2_PID, MOCKAPP2_UID,
MOCKAPP2_PROCESSNAME, MOCKAPP2_PACKAGENAME, false));
- client.mServices.setHasForegroundServices(true, 0, /* hasNoneType=*/true);
+ mProcessStateController.setHasForegroundServices(client.mServices, true, 0, true);
bindProvider(app, client, null, null, false);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(client, app);
assertProcStates(app, PROCESS_STATE_BOUND_FOREGROUND_SERVICE, PERCEPTIBLE_APP_ADJ,
@@ -1607,17 +1611,17 @@
// In order to trick OomAdjuster to think it has a short-service, we need this logic.
ServiceRecord s = ServiceRecord.newEmptyInstanceForTest(mService);
s.appInfo = new ApplicationInfo();
- s.startRequested = true;
+ mProcessStateController.setStartRequested(s, true);
s.isForeground = true;
s.foregroundServiceType = FOREGROUND_SERVICE_TYPE_SHORT_SERVICE;
- s.setShortFgsInfo(SystemClock.uptimeMillis());
- client.mServices.startService(s);
+ mProcessStateController.setShortFgsInfo(s, SystemClock.uptimeMillis());
+ mProcessStateController.startService(client.mServices, s);
client.mState.setLastTopTime(SystemClock.uptimeMillis());
- client.mServices.setHasForegroundServices(true, FOREGROUND_SERVICE_TYPE_SHORT_SERVICE,
- /* hasNoneType=*/false);
+ mProcessStateController.setHasForegroundServices(client.mServices, true,
+ FOREGROUND_SERVICE_TYPE_SHORT_SERVICE, false);
bindProvider(app, client, null, null, false);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(client, app);
// Client only has a SHORT_FGS, so it doesn't have BFSL, and that's propagated.
@@ -1639,7 +1643,7 @@
ProcessRecord client = spy(makeDefaultProcessRecord(MOCKAPP2_PID, MOCKAPP2_UID,
MOCKAPP2_PROCESSNAME, MOCKAPP2_PACKAGENAME, false));
bindProvider(app, client, null, null, true);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(client, app);
assertProcStates(app, PROCESS_STATE_IMPORTANT_FOREGROUND, FOREGROUND_APP_ADJ,
@@ -1652,7 +1656,7 @@
ProcessRecord app = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID,
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, false));
app.mProviders.setLastProviderTime(SystemClock.uptimeMillis());
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app);
assertProcStates(app, PROCESS_STATE_LAST_ACTIVITY, PREVIOUS_APP_ADJ,
@@ -1664,7 +1668,7 @@
verify(mService.mHandler).sendEmptyMessageAtTime(eq(FOLLOW_UP_OOMADJUSTER_UPDATE_MSG),
followUpTimeCaptor.capture());
mInjector.jumpUptimeAheadTo(followUpTimeCaptor.getValue());
- mService.mOomAdjuster.updateOomAdjFollowUpTargetsLocked();
+ mProcessStateController.runFollowUpUpdate();
final int expectedAdj = mService.mConstants.USE_TIERED_CACHED_ADJ
? sFirstNonUiCachedAdj : sFirstCachedAdj;
@@ -1688,7 +1692,7 @@
bindService(client, client2, null, null, 0, mock(IBinder.class));
doReturn(PROCESS_STATE_TOP).when(mService.mAtmInternal).getTopProcessState();
doReturn(client2).when(mService).getTopApp();
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(client, client2, app);
doReturn(null).when(mService).getTopApp();
@@ -1707,8 +1711,8 @@
ProcessRecord client2 = spy(makeDefaultProcessRecord(MOCKAPP3_PID, MOCKAPP3_UID,
MOCKAPP3_PROCESSNAME, MOCKAPP3_PACKAGENAME, false));
bindService(app, client2, null, null, 0, mock(IBinder.class));
- client2.mServices.setHasForegroundServices(true, 0, /* hasNoneType=*/true);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setHasForegroundServices(client2.mServices, true, 0, true);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(client, client2, app);
assertProcStates(app, PROCESS_STATE_FOREGROUND_SERVICE, PERCEPTIBLE_APP_ADJ,
@@ -1727,8 +1731,8 @@
ProcessRecord client2 = spy(makeDefaultProcessRecord(MOCKAPP3_PID, MOCKAPP3_UID,
MOCKAPP3_PROCESSNAME, MOCKAPP3_PACKAGENAME, false));
bindService(client, client2, null, null, 0, mock(IBinder.class));
- client2.mServices.setHasForegroundServices(true, 0, /* hasNoneType=*/true);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setHasForegroundServices(client2.mServices, true, 0, true);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(client, client2, app);
assertProcStates(app, PROCESS_STATE_FOREGROUND_SERVICE, PERCEPTIBLE_APP_ADJ,
@@ -1747,13 +1751,13 @@
ProcessRecord client2 = spy(makeDefaultProcessRecord(MOCKAPP3_PID, MOCKAPP3_UID,
MOCKAPP3_PROCESSNAME, MOCKAPP3_PACKAGENAME, false));
bindService(client, client2, null, null, 0, mock(IBinder.class));
- client2.mServices.setHasForegroundServices(true, 0, /* hasNoneType=*/true);
+ mProcessStateController.setHasForegroundServices(client2.mServices, true, 0, true);
bindService(client2, app, null, null, 0, mock(IBinder.class));
// Note: We add processes to LRU but still call updateOomAdjLocked() with a specific
// processes.
setProcessesToLru(app, client, client2);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app);
assertProcStates(app, PROCESS_STATE_FOREGROUND_SERVICE, PERCEPTIBLE_APP_ADJ,
@@ -1766,8 +1770,8 @@
assertBfsl(client);
assertBfsl(client2);
- client2.mServices.setHasForegroundServices(false, 0, /* hasNoneType=*/false);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setHasForegroundServices(client2.mServices, false, 0, false);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(client2);
assertEquals(PROCESS_STATE_CACHED_EMPTY, client2.mState.getSetProcState());
@@ -1790,8 +1794,8 @@
ProcessRecord client2 = spy(makeDefaultProcessRecord(MOCKAPP3_PID, MOCKAPP3_UID,
MOCKAPP3_PROCESSNAME, MOCKAPP3_PACKAGENAME, false));
bindService(client2, client, null, null, 0, mock(IBinder.class));
- client.mServices.setHasForegroundServices(true, 0, /* hasNoneType=*/true);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setHasForegroundServices(client.mServices, true, 0, true);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app, client, client2);
assertProcStates(app, PROCESS_STATE_FOREGROUND_SERVICE, PERCEPTIBLE_APP_ADJ,
@@ -1817,8 +1821,8 @@
MOCKAPP3_PROCESSNAME, MOCKAPP3_PACKAGENAME, false));
bindService(client, client2, null, null, 0, mock(IBinder.class));
bindService(client2, client, null, null, 0, mock(IBinder.class));
- client.mServices.setHasForegroundServices(true, 0, /* hasNoneType=*/true);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setHasForegroundServices(client.mServices, true, 0, true);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app, client, client2);
assertProcStates(app, PROCESS_STATE_FOREGROUND_SERVICE, PERCEPTIBLE_APP_ADJ,
@@ -1851,8 +1855,8 @@
MOCKAPP5_PROCESSNAME, MOCKAPP5_PACKAGENAME, false));
bindService(client3, client4, null, null, 0, mock(IBinder.class));
bindService(client4, client3, null, null, 0, mock(IBinder.class));
- client.mServices.setHasForegroundServices(true, 0, /* hasNoneType=*/true);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setHasForegroundServices(client.mServices, true, 0, true);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app, client, client2, client3, client4);
assertProcStates(app, PROCESS_STATE_FOREGROUND_SERVICE, PERCEPTIBLE_APP_ADJ,
@@ -1883,13 +1887,13 @@
ProcessRecord client2 = spy(makeDefaultProcessRecord(MOCKAPP3_PID, MOCKAPP3_UID,
MOCKAPP3_PROCESSNAME, MOCKAPP3_PACKAGENAME, false));
bindService(client, client2, null, null, 0, mock(IBinder.class));
- client2.mServices.setHasForegroundServices(true, 0, /* hasNoneType=*/true);
+ mProcessStateController.setHasForegroundServices(client2.mServices, true, 0, true);
bindService(client2, app, null, null, 0, mock(IBinder.class));
ProcessRecord client3 = spy(makeDefaultProcessRecord(MOCKAPP4_PID, MOCKAPP4_UID,
MOCKAPP4_PROCESSNAME, MOCKAPP4_PACKAGENAME, false));
- client3.mState.setForcingToImportant(new Object());
+ mProcessStateController.setForcingToImportant(client3, new Object());
bindService(app, client3, null, null, 0, mock(IBinder.class));
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app, client, client2, client3);
assertProcStates(app, PROCESS_STATE_FOREGROUND_SERVICE, PERCEPTIBLE_APP_ADJ,
@@ -1913,9 +1917,9 @@
doReturn(true).when(wpc).isHomeProcess();
ProcessRecord client3 = spy(makeDefaultProcessRecord(MOCKAPP4_PID, MOCKAPP4_UID,
MOCKAPP4_PROCESSNAME, MOCKAPP4_PACKAGENAME, false));
- client3.mState.setForcingToImportant(new Object());
+ mProcessStateController.setForcingToImportant(client3, new Object());
bindService(app, client3, null, null, 0, mock(IBinder.class));
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app, client, client2, client3);
assertProcStates(app, PROCESS_STATE_TRANSIENT_BACKGROUND, PERCEPTIBLE_APP_ADJ,
@@ -1940,9 +1944,9 @@
MOCKAPP4_PROCESSNAME, MOCKAPP4_PACKAGENAME, false));
ProcessRecord client4 = spy(makeDefaultProcessRecord(MOCKAPP5_PID, MOCKAPP5_UID,
MOCKAPP5_PROCESSNAME, MOCKAPP5_PACKAGENAME, false));
- client4.mState.setForcingToImportant(new Object());
+ mProcessStateController.setForcingToImportant(client4, new Object());
bindService(app, client4, null, null, 0, mock(IBinder.class));
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app, client, client2, client3, client4);
assertProcStates(app, PROCESS_STATE_TRANSIENT_BACKGROUND, PERCEPTIBLE_APP_ADJ,
@@ -1965,13 +1969,13 @@
doReturn(true).when(wpc).isHomeProcess();
ProcessRecord client3 = spy(makeDefaultProcessRecord(MOCKAPP4_PID, MOCKAPP4_UID,
MOCKAPP4_PROCESSNAME, MOCKAPP4_PACKAGENAME, false));
- client3.mState.setForcingToImportant(new Object());
+ mProcessStateController.setForcingToImportant(client3, new Object());
bindService(app, client3, null, null, 0, mock(IBinder.class));
ProcessRecord client4 = spy(makeDefaultProcessRecord(MOCKAPP5_PID, MOCKAPP5_UID,
MOCKAPP5_PROCESSNAME, MOCKAPP5_PACKAGENAME, false));
- client4.mServices.setHasForegroundServices(true, 0, /* hasNoneType=*/true);
+ mProcessStateController.setHasForegroundServices(client4.mServices, true, 0, true);
bindService(app, client4, null, null, 0, mock(IBinder.class));
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app, client, client2, client3, client4);
assertProcStates(app, PROCESS_STATE_FOREGROUND_SERVICE, PERCEPTIBLE_APP_ADJ,
@@ -1992,12 +1996,12 @@
ProcessRecord client2 = spy(makeDefaultProcessRecord(MOCKAPP3_PID, MOCKAPP3_UID,
MOCKAPP3_PROCESSNAME, MOCKAPP3_PACKAGENAME, false));
bindService(app, client2, null, null, 0, mock(IBinder.class));
- client2.mServices.setHasForegroundServices(true, 0, /* hasNoneType=*/true);
+ mProcessStateController.setHasForegroundServices(client2.mServices, true, 0, true);
ProcessRecord client3 = spy(makeDefaultProcessRecord(MOCKAPP4_PID, MOCKAPP4_UID,
MOCKAPP4_PROCESSNAME, MOCKAPP4_PACKAGENAME, false));
- client3.mState.setForcingToImportant(new Object());
+ mProcessStateController.setForcingToImportant(client3, new Object());
bindService(app, client3, null, null, 0, mock(IBinder.class));
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(client, client2, client3, app);
assertProcStates(app, PROCESS_STATE_FOREGROUND_SERVICE, PERCEPTIBLE_APP_ADJ,
@@ -2016,8 +2020,8 @@
ProcessRecord client2 = spy(makeDefaultProcessRecord(MOCKAPP3_PID, MOCKAPP3_UID,
MOCKAPP3_PROCESSNAME, MOCKAPP3_PACKAGENAME, false));
bindProvider(client, client2, null, null, false);
- client2.mServices.setHasForegroundServices(true, 0, /* hasNoneType=*/true);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setHasForegroundServices(client2.mServices, true, 0, true);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(client, client2, app);
assertProcStates(app, PROCESS_STATE_BOUND_FOREGROUND_SERVICE, PERCEPTIBLE_APP_ADJ,
@@ -2036,9 +2040,9 @@
ProcessRecord client2 = spy(makeDefaultProcessRecord(MOCKAPP3_PID, MOCKAPP3_UID,
MOCKAPP3_PROCESSNAME, MOCKAPP3_PACKAGENAME, false));
bindProvider(client, client2, null, null, false);
- client2.mServices.setHasForegroundServices(true, 0, /* hasNoneType=*/true);
+ mProcessStateController.setHasForegroundServices(client2.mServices, true, 0, true);
bindService(client2, app, null, null, 0, mock(IBinder.class));
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app, client, client2);
assertProcStates(app, PROCESS_STATE_BOUND_FOREGROUND_SERVICE, PERCEPTIBLE_APP_ADJ,
@@ -2057,8 +2061,8 @@
ProcessRecord client2 = spy(makeDefaultProcessRecord(MOCKAPP3_PID, MOCKAPP3_UID,
MOCKAPP3_PROCESSNAME, MOCKAPP3_PACKAGENAME, false));
bindProvider(client, client2, null, null, false);
- client2.mServices.setHasForegroundServices(true, 0, /* hasNoneType=*/true);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setHasForegroundServices(client2.mServices, true, 0, true);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(client, client2, app);
assertProcStates(app, PROCESS_STATE_BOUND_FOREGROUND_SERVICE, PERCEPTIBLE_APP_ADJ,
@@ -2077,9 +2081,9 @@
ProcessRecord client2 = spy(makeDefaultProcessRecord(MOCKAPP3_PID, MOCKAPP3_UID,
MOCKAPP3_PROCESSNAME, MOCKAPP3_PACKAGENAME, false));
bindProvider(client, client2, null, null, false);
- client2.mServices.setHasForegroundServices(true, 0, /* hasNoneType=*/true);
+ mProcessStateController.setHasForegroundServices(client2.mServices, true, 0, true);
bindProvider(client2, app, null, null, false);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app, client, client2);
assertProcStates(app, PROCESS_STATE_BOUND_FOREGROUND_SERVICE, PERCEPTIBLE_APP_ADJ,
@@ -2102,10 +2106,10 @@
mock(IBinder.class));
bindService(app2, client2, null, null, Context.BIND_FOREGROUND_SERVICE_WHILE_AWAKE,
mock(IBinder.class));
- client1.mState.setMaxAdj(PERSISTENT_PROC_ADJ);
- client2.mServices.setHasForegroundServices(true, 0, /* hasNoneType=*/true);
+ mProcessStateController.setMaxAdj(client1, PERSISTENT_PROC_ADJ);
+ mProcessStateController.setHasForegroundServices(client2.mServices, true, 0, true);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(client1, client2, app1, app2);
assertProcStates(app1, PROCESS_STATE_BOUND_FOREGROUND_SERVICE, VISIBLE_APP_ADJ,
@@ -2126,7 +2130,7 @@
assertProcStates(app2, PROCESS_STATE_FOREGROUND_SERVICE, PERCEPTIBLE_APP_ADJ,
SCHED_GROUP_DEFAULT);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_ASLEEP);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_ASLEEP);
updateOomAdj(client1, client2, app1, app2);
assertProcStates(app1, PROCESS_STATE_IMPORTANT_FOREGROUND, VISIBLE_APP_ADJ,
SCHED_GROUP_TOP_APP);
@@ -2136,7 +2140,7 @@
bindService(client2, app1, null, null, 0, mock(IBinder.class));
bindService(app1, client2, null, null, 0, mock(IBinder.class));
- client2.mServices.setHasForegroundServices(false, 0, /* hasNoneType=*/false);
+ mProcessStateController.setHasForegroundServices(client2.mServices, false, 0, false);
updateOomAdj(app1, client1, client2);
assertProcStates(app1, PROCESS_STATE_IMPORTANT_FOREGROUND, VISIBLE_APP_ADJ,
SCHED_GROUP_TOP_APP);
@@ -2153,8 +2157,8 @@
MOCKAPP3_PROCESSNAME, MOCKAPP3_PACKAGENAME, false));
final ProcessRecord client2 = spy(makeDefaultProcessRecord(MOCKAPP4_PID, MOCKAPP4_UID,
MOCKAPP4_PROCESSNAME, MOCKAPP4_PACKAGENAME, false));
- client1.mState.setMaxAdj(PERSISTENT_PROC_ADJ);
- client2.mState.setMaxAdj(PERSISTENT_PROC_ADJ);
+ mProcessStateController.setMaxAdj(client1, PERSISTENT_PROC_ADJ);
+ mProcessStateController.setMaxAdj(client2, PERSISTENT_PROC_ADJ);
final ServiceRecord s1 = bindService(app1, client1, null, null,
Context.BIND_TREAT_LIKE_VISIBLE_FOREGROUND_SERVICE, mock(IBinder.class));
@@ -2178,10 +2182,10 @@
s2.getConnections().clear();
client1.mServices.removeAllConnections();
client2.mServices.removeAllConnections();
- client1.mState.setMaxAdj(UNKNOWN_ADJ);
- client2.mState.setMaxAdj(UNKNOWN_ADJ);
- client1.mServices.setHasForegroundServices(true, 0, /* hasNoneType=*/true);
- client2.mState.setHasOverlayUi(true);
+ mProcessStateController.setMaxAdj(client1, UNKNOWN_ADJ);
+ mProcessStateController.setMaxAdj(client2, UNKNOWN_ADJ);
+ mProcessStateController.setHasForegroundServices(client1.mServices, true, 0, true);
+ mProcessStateController.setHasOverlayUi(client2, true);
bindService(app1, client1, null, s1, Context.BIND_TREAT_LIKE_VISIBLE_FOREGROUND_SERVICE,
mock(IBinder.class));
@@ -2196,10 +2200,10 @@
assertProcStates(app2, PROCESS_STATE_IMPORTANT_FOREGROUND, PERCEPTIBLE_APP_ADJ,
SCHED_GROUP_DEFAULT);
- client2.mState.setHasOverlayUi(false);
+ mProcessStateController.setHasOverlayUi(client2, false);
doReturn(PROCESS_STATE_TOP).when(mService.mAtmInternal).getTopProcessState();
doReturn(client2).when(mService).getTopApp();
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(client2, app2);
assertProcStates(app2, PROCESS_STATE_BOUND_TOP, VISIBLE_APP_ADJ,
@@ -2213,10 +2217,10 @@
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, false));
final ProcessRecord client1 = spy(makeDefaultProcessRecord(MOCKAPP3_PID, MOCKAPP3_UID,
MOCKAPP3_PROCESSNAME, MOCKAPP3_PACKAGENAME, false));
- client1.mState.setMaxAdj(PERSISTENT_PROC_ADJ);
+ mProcessStateController.setMaxAdj(client1, PERSISTENT_PROC_ADJ);
- app1.mServices.setHasForegroundServices(true, 0, /* hasNoneType=*/true);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setHasForegroundServices(app1.mServices, true, 0, true);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
bindService(app1, client1, null, null, Context.BIND_NOT_PERCEPTIBLE, mock(IBinder.class));
@@ -2234,10 +2238,10 @@
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, false));
final ProcessRecord client1 = spy(makeDefaultProcessRecord(MOCKAPP3_PID, MOCKAPP3_UID,
MOCKAPP3_PROCESSNAME, MOCKAPP3_PACKAGENAME, false));
- client1.mState.setMaxAdj(PERSISTENT_PROC_ADJ);
+ mProcessStateController.setMaxAdj(client1, PERSISTENT_PROC_ADJ);
- app1.mServices.setHasForegroundServices(true, 0, /* hasNoneType=*/true);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setHasForegroundServices(app1.mServices, true, 0, true);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
bindService(app1, client1, null, null, Context.BIND_ALMOST_PERCEPTIBLE,
mock(IBinder.class));
@@ -2254,10 +2258,10 @@
public void testUpdateOomAdj_DoOne_PendingFinishAttach() {
ProcessRecord app = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID,
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, false));
- app.setPendingFinishAttach(true);
+ mProcessStateController.setPendingFinishAttach(app, true);
app.mState.setHasForegroundActivities(false);
- mService.mOomAdjuster.setAttachingProcessStatesLSP(app);
+ mProcessStateController.setAttachingProcessStatesLSP(app);
updateOomAdj(app);
assertProcStates(app, PROCESS_STATE_CACHED_EMPTY, FOREGROUND_APP_ADJ,
@@ -2269,11 +2273,11 @@
public void testUpdateOomAdj_DoOne_TopApp_PendingFinishAttach() {
ProcessRecord app = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID,
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, false));
- app.setPendingFinishAttach(true);
+ mProcessStateController.setPendingFinishAttach(app, true);
app.mState.setHasForegroundActivities(true);
doReturn(app).when(mService).getTopApp();
- mService.mOomAdjuster.setAttachingProcessStatesLSP(app);
+ mProcessStateController.setAttachingProcessStatesLSP(app);
updateOomAdj(app);
assertProcStates(app, PROCESS_STATE_TOP, FOREGROUND_APP_ADJ,
@@ -2303,40 +2307,40 @@
client1.setUidRecord(clientUidRecord);
client2.setUidRecord(clientUidRecord);
- client1.mServices.setHasForegroundServices(true, 0, /* hasNoneType=*/true);
- client2.mState.setForcingToImportant(new Object());
+ mProcessStateController.setHasForegroundServices(client1.mServices, true, 0, true);
+ mProcessStateController.setForcingToImportant(client2, new Object());
setProcessesToLru(app1, app2, app3, client1, client2);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
final ComponentName cn1 = ComponentName.unflattenFromString(
MOCKAPP_PACKAGENAME + "/.TestService");
final ServiceRecord s1 = bindService(app1, client1, null, null, 0, mock(IBinder.class));
setFieldValue(ServiceRecord.class, s1, "name", cn1);
- s1.startRequested = true;
+ mProcessStateController.setStartRequested(s1, true);
final ComponentName cn2 = ComponentName.unflattenFromString(
MOCKAPP2_PACKAGENAME + "/.TestService");
final ServiceRecord s2 = bindService(app2, client2, null, null, 0, mock(IBinder.class));
setFieldValue(ServiceRecord.class, s2, "name", cn2);
- s2.startRequested = true;
+ mProcessStateController.setStartRequested(s2, true);
final ComponentName cn3 = ComponentName.unflattenFromString(
MOCKAPP5_PACKAGENAME + "/.TestService");
final ServiceRecord s3 = bindService(app3, client1, null, null, 0, mock(IBinder.class));
setFieldValue(ServiceRecord.class, s3, "name", cn3);
- s3.startRequested = true;
+ mProcessStateController.setStartRequested(s3, true);
final ComponentName cn4 = ComponentName.unflattenFromString(
MOCKAPP3_PACKAGENAME + "/.TestService");
final ServiceRecord c2s = makeServiceRecord(client2);
setFieldValue(ServiceRecord.class, c2s, "name", cn4);
- c2s.startRequested = true;
+ mProcessStateController.setStartRequested(c2s, true);
try {
- mService.mOomAdjuster.mActiveUids.put(MOCKAPP_UID, app1UidRecord);
- mService.mOomAdjuster.mActiveUids.put(MOCKAPP2_UID, app2UidRecord);
- mService.mOomAdjuster.mActiveUids.put(MOCKAPP5_UID, app3UidRecord);
- mService.mOomAdjuster.mActiveUids.put(MOCKAPP3_UID, clientUidRecord);
+ mActiveUids.put(MOCKAPP_UID, app1UidRecord);
+ mActiveUids.put(MOCKAPP2_UID, app2UidRecord);
+ mActiveUids.put(MOCKAPP5_UID, app3UidRecord);
+ mActiveUids.put(MOCKAPP3_UID, clientUidRecord);
setServiceMap(s1, MOCKAPP_UID, cn1);
setServiceMap(s2, MOCKAPP2_UID, cn2);
@@ -2354,8 +2358,8 @@
assertEquals(PROCESS_STATE_TRANSIENT_BACKGROUND, app2.mState.getSetProcState());
assertEquals(PROCESS_STATE_TRANSIENT_BACKGROUND, client2.mState.getSetProcState());
- client1.mServices.setHasForegroundServices(false, 0, /* hasNoneType=*/false);
- client2.mState.setForcingToImportant(null);
+ mProcessStateController.setHasForegroundServices(client1.mServices, false, 0, false);
+ mProcessStateController.setForcingToImportant(client2, null);
app1UidRecord.reset();
app2UidRecord.reset();
app3UidRecord.reset();
@@ -2379,7 +2383,7 @@
.getAppStartModeLOSP(anyInt(), any(String.class), anyInt(),
anyInt(), anyBoolean(), anyBoolean(), anyBoolean());
mService.mServices.mServiceMap.clear();
- mService.mOomAdjuster.mActiveUids.clear();
+ mActiveUids.clear();
}
}
@@ -2388,12 +2392,13 @@
public void testUpdateOomAdj_DoAll_Unbound() {
ProcessRecord app = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID,
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, false));
- app.mState.setForcingToImportant(new Object());
ProcessRecord app2 = spy(makeDefaultProcessRecord(MOCKAPP2_PID, MOCKAPP2_UID,
MOCKAPP2_PROCESSNAME, MOCKAPP2_PACKAGENAME, false));
- app2.mServices.setHasForegroundServices(true, 0, /* hasNoneType=*/true);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setForcingToImportant(app, new Object());
+ mProcessStateController.setHasForegroundServices(app2.mServices, true, 0, /* hasNoneType=*/
+ true);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app, app2);
assertProcStates(app, PROCESS_STATE_TRANSIENT_BACKGROUND, PERCEPTIBLE_APP_ADJ,
@@ -2408,12 +2413,14 @@
public void testUpdateOomAdj_DoAll_BoundFgService() {
ProcessRecord app = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID,
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, false));
- app.mState.setForcingToImportant(new Object());
ProcessRecord app2 = spy(makeDefaultProcessRecord(MOCKAPP2_PID, MOCKAPP2_UID,
MOCKAPP2_PROCESSNAME, MOCKAPP2_PACKAGENAME, false));
- app2.mServices.setHasForegroundServices(true, 0, /* hasNoneType=*/true);
+
+ mProcessStateController.setForcingToImportant(app, new Object());
+ mProcessStateController.setHasForegroundServices(app2.mServices, true, 0, /* hasNoneType=*/
+ true);
bindService(app, app2, null, null, 0, mock(IBinder.class));
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app, app2);
assertProcStates(app, PROCESS_STATE_FOREGROUND_SERVICE, PERCEPTIBLE_APP_ADJ,
@@ -2435,9 +2442,9 @@
ProcessRecord app3 = spy(makeDefaultProcessRecord(MOCKAPP3_PID, MOCKAPP3_UID,
MOCKAPP3_PROCESSNAME, MOCKAPP3_PACKAGENAME, false));
bindService(app2, app3, null, null, 0, mock(IBinder.class));
- app3.mServices.setHasForegroundServices(true, 0, /* hasNoneType=*/true);
+ mProcessStateController.setHasForegroundServices(app3.mServices, true, 0, true);
bindService(app3, app, null, null, 0, mock(IBinder.class));
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app, app2, app3);
assertProcStates(app, PROCESS_STATE_FOREGROUND_SERVICE, PERCEPTIBLE_APP_ADJ,
@@ -2476,13 +2483,13 @@
doReturn(true).when(wpc).isHomeProcess();
ProcessRecord app4 = spy(makeDefaultProcessRecord(MOCKAPP4_PID, MOCKAPP4_UID,
MOCKAPP4_PROCESSNAME, MOCKAPP4_PACKAGENAME, false));
- app4.mState.setHasOverlayUi(true);
+ mProcessStateController.setHasOverlayUi(app4, true);
bindService(app, app4, null, s, 0, mock(IBinder.class));
ProcessRecord app5 = spy(makeDefaultProcessRecord(MOCKAPP5_PID, MOCKAPP5_UID,
MOCKAPP5_PROCESSNAME, MOCKAPP5_PACKAGENAME, false));
- app5.mServices.setHasForegroundServices(true, 0, /* hasNoneType=*/true);
+ mProcessStateController.setHasForegroundServices(app5.mServices, true, 0, true);
bindService(app, app5, null, s, 0, mock(IBinder.class));
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app, app2, app3, app4, app5);
assertProcStates(app, PROCESS_STATE_FOREGROUND_SERVICE, PERCEPTIBLE_APP_ADJ,
@@ -2518,13 +2525,13 @@
doReturn(true).when(wpc).isHomeProcess();
ProcessRecord app4 = spy(makeDefaultProcessRecord(MOCKAPP4_PID, MOCKAPP4_UID,
MOCKAPP4_PROCESSNAME, MOCKAPP4_PACKAGENAME, false));
- app4.mState.setHasOverlayUi(true);
+ mProcessStateController.setHasOverlayUi(app4, true);
bindService(app, app4, null, s, 0, mock(IBinder.class));
ProcessRecord app5 = spy(makeDefaultProcessRecord(MOCKAPP5_PID, MOCKAPP5_UID,
MOCKAPP5_PROCESSNAME, MOCKAPP5_PACKAGENAME, false));
- app5.mServices.setHasForegroundServices(true, 0, /* hasNoneType=*/true);
+ mProcessStateController.setHasForegroundServices(app5.mServices, true, 0, true);
bindService(app, app5, null, s, 0, mock(IBinder.class));
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app5, app4, app3, app2, app);
assertProcStates(app, PROCESS_STATE_FOREGROUND_SERVICE, PERCEPTIBLE_APP_ADJ,
@@ -2560,13 +2567,13 @@
doReturn(true).when(wpc).isHomeProcess();
ProcessRecord app4 = spy(makeDefaultProcessRecord(MOCKAPP4_PID, MOCKAPP4_UID,
MOCKAPP4_PROCESSNAME, MOCKAPP4_PACKAGENAME, false));
- app4.mState.setHasOverlayUi(true);
+ mProcessStateController.setHasOverlayUi(app4, true);
bindService(app, app4, null, s, 0, mock(IBinder.class));
ProcessRecord app5 = spy(makeDefaultProcessRecord(MOCKAPP5_PID, MOCKAPP5_UID,
MOCKAPP5_PROCESSNAME, MOCKAPP5_PACKAGENAME, false));
- app5.mServices.setHasForegroundServices(true, 0, /* hasNoneType=*/true);
+ mProcessStateController.setHasForegroundServices(app5.mServices, true, 0, true);
bindService(app, app5, null, s, 0, mock(IBinder.class));
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app3, app4, app2, app, app5);
assertProcStates(app, PROCESS_STATE_FOREGROUND_SERVICE, PERCEPTIBLE_APP_ADJ,
@@ -2603,10 +2610,10 @@
mock(IBinder.class));
ProcessRecord client3 = spy(makeDefaultProcessRecord(MOCKAPP4_PID, MOCKAPP4_UID,
MOCKAPP4_PROCESSNAME, MOCKAPP4_PACKAGENAME, false));
- client3.mState.setMaxAdj(PERSISTENT_PROC_ADJ);
+ mProcessStateController.setMaxAdj(client3, PERSISTENT_PROC_ADJ);
bindService(app, client3, null, null, Context.BIND_INCLUDE_CAPABILITIES,
mock(IBinder.class));
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app, client, client2, client3);
final int expected = PROCESS_CAPABILITY_ALL & ~PROCESS_CAPABILITY_BFSL;
@@ -2631,13 +2638,13 @@
doReturn(true).when(wpc).isHomeProcess();
ProcessRecord app4 = spy(makeDefaultProcessRecord(MOCKAPP4_PID, MOCKAPP4_UID,
MOCKAPP4_PROCESSNAME, MOCKAPP4_PACKAGENAME, false));
- app4.mState.setHasOverlayUi(true);
+ mProcessStateController.setHasOverlayUi(app4, true);
bindProvider(app, app4, cr, null, false);
ProcessRecord app5 = spy(makeDefaultProcessRecord(MOCKAPP5_PID, MOCKAPP5_UID,
MOCKAPP5_PROCESSNAME, MOCKAPP5_PACKAGENAME, false));
- app5.mServices.setHasForegroundServices(true, 0, /* hasNoneType=*/true);
+ mProcessStateController.setHasForegroundServices(app5.mServices, true, 0, true);
bindProvider(app, app5, cr, null, false);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app, app2, app3, app4, app5);
assertProcStates(app, PROCESS_STATE_BOUND_FOREGROUND_SERVICE, PERCEPTIBLE_APP_ADJ,
@@ -2666,22 +2673,22 @@
MOCKAPP2_PROCESSNAME, MOCKAPP2_PACKAGENAME, false));
long now = SystemClock.uptimeMillis();
ServiceRecord s = bindService(app, app2, null, null, 0, mock(IBinder.class));
- s.startRequested = true;
- s.lastActivity = now;
+ mProcessStateController.setStartRequested(s, true);
+ mProcessStateController.setServiceLastActivityTime(s, now);
s = bindService(app2, app, null, null, 0, mock(IBinder.class));
- s.startRequested = true;
- s.lastActivity = now;
+ mProcessStateController.setStartRequested(s, true);
+ mProcessStateController.setServiceLastActivityTime(s, now);
ProcessRecord app3 = spy(makeDefaultProcessRecord(MOCKAPP3_PID, MOCKAPP3_UID,
MOCKAPP3_PROCESSNAME, MOCKAPP3_PACKAGENAME, false));
s = mock(ServiceRecord.class);
- s.app = app3;
+ mProcessStateController.setHostProcess(s, app3);
setFieldValue(ServiceRecord.class, s, "connections",
new ArrayMap<IBinder, ArrayList<ConnectionRecord>>());
- app3.mServices.startService(s);
+ mProcessStateController.startService(app3.mServices, s);
doCallRealMethod().when(s).getConnections();
- s.startRequested = true;
- s.lastActivity = now;
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setStartRequested(s, true);
+ mProcessStateController.setServiceLastActivityTime(s, now);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
mService.mOomAdjuster.mNumServiceProcs = 3;
updateOomAdj(app3, app2, app);
@@ -2702,8 +2709,8 @@
// cachedAdj1 and cachedAdj2 will be read if USE_TIERED_CACHED_ADJ is disabled. Otherwise,
// sFirstUiCachedAdj and sFirstNonUiCachedAdj are used instead.
- final int cachedAdj1 = CACHED_APP_MIN_ADJ + ProcessList.CACHED_APP_IMPORTANCE_LEVELS;
- final int cachedAdj2 = cachedAdj1 + ProcessList.CACHED_APP_IMPORTANCE_LEVELS * 2;
+ final int cachedAdj1 = CACHED_APP_MIN_ADJ + CACHED_APP_IMPORTANCE_LEVELS;
+ final int cachedAdj2 = cachedAdj1 + CACHED_APP_IMPORTANCE_LEVELS * 2;
doReturn(userOwner).when(mService.mUserController).getCurrentUserId();
final ArrayList<ProcessRecord> lru = mService.mProcessList.getLruProcessesLOSP();
@@ -2723,11 +2730,11 @@
ServiceRecord s = spy(new ServiceRecord(mService, cn, cn, null, 0, null,
si, false, null));
doReturn(new ArrayMap<IBinder, ArrayList<ConnectionRecord>>()).when(s).getConnections();
- s.startRequested = true;
- s.lastActivity = now;
+ mProcessStateController.setStartRequested(s, true);
+ mProcessStateController.setServiceLastActivityTime(s, now);
- app.mServices.startService(s);
- app.mState.setHasShownUi(true);
+ mProcessStateController.startService(app.mServices, s);
+ mProcessStateController.setHasShownUi(app, true);
final ServiceInfo si2 = mock(ServiceInfo.class);
si2.applicationInfo = mock(ApplicationInfo.class);
@@ -2735,13 +2742,14 @@
ServiceRecord s2 = spy(new ServiceRecord(mService, cn2, cn2, null, 0, null,
si2, false, null));
doReturn(new ArrayMap<IBinder, ArrayList<ConnectionRecord>>()).when(s2).getConnections();
- s2.startRequested = true;
- s2.lastActivity = now - mService.mConstants.MAX_SERVICE_INACTIVITY - 1;
+ mProcessStateController.setStartRequested(s2, true);
+ mProcessStateController.setServiceLastActivityTime(s2,
+ now - mService.mConstants.MAX_SERVICE_INACTIVITY - 1);
- app2.mServices.startService(s2);
- app2.mState.setHasShownUi(false);
+ mProcessStateController.startService(app2.mServices, s2);
+ mProcessStateController.setHasShownUi(app2, false);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj();
assertProcStates(app, PROCESS_STATE_SERVICE,
@@ -2754,7 +2762,7 @@
app.mState.setSetProcState(PROCESS_STATE_NONEXISTENT);
app.mState.setAdjType(null);
app.mState.setSetAdj(UNKNOWN_ADJ);
- app.mState.setHasShownUi(false);
+ mProcessStateController.setHasShownUi(app, false);
updateOomAdj();
assertProcStates(app, PROCESS_STATE_SERVICE, SERVICE_ADJ, SCHED_GROUP_BACKGROUND,
@@ -2763,27 +2771,28 @@
app.mState.setSetProcState(PROCESS_STATE_NONEXISTENT);
app.mState.setAdjType(null);
app.mState.setSetAdj(UNKNOWN_ADJ);
- s.lastActivity = now - mService.mConstants.MAX_SERVICE_INACTIVITY - 1;
+ mProcessStateController.setServiceLastActivityTime(s,
+ now - mService.mConstants.MAX_SERVICE_INACTIVITY - 1);
updateOomAdj();
assertProcStates(app, PROCESS_STATE_SERVICE,
mService.mConstants.USE_TIERED_CACHED_ADJ ? sFirstNonUiCachedAdj : cachedAdj1,
SCHED_GROUP_BACKGROUND, "cch-started-services", true);
- app.mServices.stopService(s);
+ mProcessStateController.stopService(app.mServices, s);
app.mState.setSetProcState(PROCESS_STATE_NONEXISTENT);
app.mState.setAdjType(null);
app.mState.setSetAdj(UNKNOWN_ADJ);
- app.mState.setHasShownUi(true);
+ mProcessStateController.setHasShownUi(app, true);
mService.mConstants.KEEP_WARMING_SERVICES.add(cn);
mService.mConstants.KEEP_WARMING_SERVICES.add(cn2);
s = spy(new ServiceRecord(mService, cn, cn, null, 0, null,
si, false, null));
doReturn(new ArrayMap<IBinder, ArrayList<ConnectionRecord>>()).when(s).getConnections();
- s.startRequested = true;
- s.lastActivity = now;
+ mProcessStateController.setStartRequested(s, true);
+ mProcessStateController.setServiceLastActivityTime(s, now);
- app.mServices.startService(s);
+ mProcessStateController.startService(app.mServices, s);
updateOomAdj();
assertProcStates(app, PROCESS_STATE_SERVICE, SERVICE_ADJ, SCHED_GROUP_BACKGROUND,
@@ -2795,8 +2804,9 @@
app.mState.setSetProcState(PROCESS_STATE_NONEXISTENT);
app.mState.setAdjType(null);
app.mState.setSetAdj(UNKNOWN_ADJ);
- app.mState.setHasShownUi(false);
- s.lastActivity = now - mService.mConstants.MAX_SERVICE_INACTIVITY - 1;
+ mProcessStateController.setHasShownUi(app, false);
+ mProcessStateController.setServiceLastActivityTime(s,
+ now - mService.mConstants.MAX_SERVICE_INACTIVITY - 1);
updateOomAdj();
assertProcStates(app, PROCESS_STATE_SERVICE, SERVICE_ADJ, SCHED_GROUP_BACKGROUND,
@@ -2825,7 +2835,7 @@
MOCKAPP2_PROCESSNAME, MOCKAPP2_PACKAGENAME, true));
doReturn(PROCESS_STATE_TOP).when(mService.mAtmInternal).getTopProcessState();
doReturn(app).when(mService).getTopApp();
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app);
assertEquals(FOREGROUND_APP_ADJ, app.mState.getSetAdj());
@@ -2847,7 +2857,7 @@
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, true));
doReturn(PROCESS_STATE_TOP).when(mService.mAtmInternal).getTopProcessState();
doReturn(app).when(mService).getTopApp();
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app);
assertEquals(FOREGROUND_APP_ADJ, app.mState.getSetAdj());
@@ -2873,14 +2883,14 @@
MOCKAPP3_PROCESSNAME, MOCKAPP3_PACKAGENAME, false));
long now = SystemClock.uptimeMillis();
ServiceRecord s = bindService(app, app2, null, null, 0, mock(IBinder.class));
- s.startRequested = true;
- s.lastActivity = now;
+ mProcessStateController.setStartRequested(s, true);
+ mProcessStateController.setServiceLastActivityTime(s, now);
s = bindService(app2, app3, null, null, 0, mock(IBinder.class));
- s.lastActivity = now;
+ mProcessStateController.setServiceLastActivityTime(s, now);
s = bindService(app3, app2, null, null, 0, mock(IBinder.class));
- s.lastActivity = now;
+ mProcessStateController.setServiceLastActivityTime(s, now);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
mService.mOomAdjuster.mNumServiceProcs = 3;
updateOomAdj(app, app2, app3);
@@ -2898,14 +2908,14 @@
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, true));
doReturn(PROCESS_STATE_TOP).when(mService.mAtmInternal).getTopProcessState();
doReturn(app).when(mService).getTopApp();
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj(app);
assertEquals(FOREGROUND_APP_ADJ, app.mState.getSetAdj());
// Start binding to a service that isn't running yet.
ServiceRecord sr = makeServiceRecord(app);
- sr.app = null;
+ mProcessStateController.setHostProcess(sr, null);
bindService(null, app, null, sr, Context.BIND_ABOVE_CLIENT, mock(IBinder.class));
// Since sr.app is null, this service cannot be in the same process as the
@@ -2924,13 +2934,13 @@
setProcessesToLru(app);
ServiceRecord s = makeServiceRecord(app);
- s.startRequested = true;
- s.lastActivity = SystemClock.uptimeMillis();
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setStartRequested(s, true);
+ mProcessStateController.setServiceLastActivityTime(s, SystemClock.uptimeMillis());
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj();
assertProcStates(app, PROCESS_STATE_SERVICE, SERVICE_ADJ, SCHED_GROUP_BACKGROUND);
- app.mServices.stopService(s);
+ mProcessStateController.stopService(app.mServices, s);
updateOomAdj();
// isolated process should be killed immediately after service stop.
verify(app).killLocked("isolated not needed", ApplicationExitInfo.REASON_OTHER,
@@ -2944,13 +2954,13 @@
MOCKAPP_ISOLATED_PROCESSNAME, MOCKAPP_PACKAGENAME, false));
ServiceRecord s = makeServiceRecord(app);
- s.startRequested = true;
- s.lastActivity = SystemClock.uptimeMillis();
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setStartRequested(s, true);
+ mProcessStateController.setServiceLastActivityTime(s, SystemClock.uptimeMillis());
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdjPending(app);
assertProcStates(app, PROCESS_STATE_SERVICE, SERVICE_ADJ, SCHED_GROUP_BACKGROUND);
- app.mServices.stopService(s);
+ mProcessStateController.stopService(app.mServices, s);
updateOomAdjPending(app);
// isolated process should be killed immediately after service stop.
verify(app).killLocked("isolated not needed", ApplicationExitInfo.REASON_OTHER,
@@ -2966,13 +2976,13 @@
setProcessesToLru(app);
ServiceRecord s = makeServiceRecord(app);
- s.startRequested = true;
- s.lastActivity = SystemClock.uptimeMillis();
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setStartRequested(s, true);
+ mProcessStateController.setServiceLastActivityTime(s, SystemClock.uptimeMillis());
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj();
assertProcStates(app, PROCESS_STATE_SERVICE, SERVICE_ADJ, SCHED_GROUP_BACKGROUND);
- app.mServices.stopService(s);
+ mProcessStateController.stopService(app.mServices, s);
updateOomAdj();
// isolated process with entry point should not be killed
verify(app, never()).killLocked("isolated not needed", ApplicationExitInfo.REASON_OTHER,
@@ -2987,13 +2997,13 @@
app.setIsolatedEntryPoint("test");
ServiceRecord s = makeServiceRecord(app);
- s.startRequested = true;
- s.lastActivity = SystemClock.uptimeMillis();
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setStartRequested(s, true);
+ mProcessStateController.setServiceLastActivityTime(s, SystemClock.uptimeMillis());
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdjPending(app);
assertProcStates(app, PROCESS_STATE_SERVICE, SERVICE_ADJ, SCHED_GROUP_BACKGROUND);
- app.mServices.stopService(s);
+ mProcessStateController.stopService(app.mServices, s);
updateOomAdjPending(app);
// isolated process with entry point should not be killed
verify(app, never()).killLocked("isolated not needed", ApplicationExitInfo.REASON_OTHER,
@@ -3014,10 +3024,10 @@
setProcessesToLru(sandboxService, client, attributedClient);
- client.mState.setMaxAdj(PERSISTENT_PROC_ADJ);
- attributedClient.mServices.setHasForegroundServices(true, 0, true);
+ mProcessStateController.setMaxAdj(client, PERSISTENT_PROC_ADJ);
+ mProcessStateController.setHasForegroundServices(attributedClient.mServices, true, 0, true);
bindService(sandboxService, client, attributedClient, null, 0, mock(IBinder.class));
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj();
assertProcStates(client, PROCESS_STATE_PERSISTENT, PERSISTENT_PROC_ADJ,
SCHED_GROUP_DEFAULT);
@@ -3038,13 +3048,13 @@
// App1 binds to app2 and gets temp allowlisted.
bindService(app2, app, null, null, 0, mock(IBinder.class));
- mService.mOomAdjuster.setUidTempAllowlistStateLSP(MOCKAPP_UID, true);
+ mProcessStateController.setUidTempAllowlistStateLSP(MOCKAPP_UID, true);
assertEquals(true, app.getUidRecord().isSetAllowListed());
assertEquals(true, app.mOptRecord.shouldNotFreeze());
assertEquals(true, app2.mOptRecord.shouldNotFreeze());
- mService.mOomAdjuster.setUidTempAllowlistStateLSP(MOCKAPP_UID, false);
+ mProcessStateController.setUidTempAllowlistStateLSP(MOCKAPP_UID, false);
assertEquals(false, app.getUidRecord().isSetAllowListed());
assertEquals(false, app.mOptRecord.shouldNotFreeze());
assertEquals(false, app2.mOptRecord.shouldNotFreeze());
@@ -3064,8 +3074,8 @@
// App1 and app2 both bind to app3 and get temp allowlisted.
bindService(app3, app, null, null, 0, mock(IBinder.class));
bindService(app3, app2, null, null, 0, mock(IBinder.class));
- mService.mOomAdjuster.setUidTempAllowlistStateLSP(MOCKAPP_UID, true);
- mService.mOomAdjuster.setUidTempAllowlistStateLSP(MOCKAPP2_UID, true);
+ mProcessStateController.setUidTempAllowlistStateLSP(MOCKAPP_UID, true);
+ mProcessStateController.setUidTempAllowlistStateLSP(MOCKAPP2_UID, true);
assertEquals(true, app.getUidRecord().isSetAllowListed());
assertEquals(true, app2.getUidRecord().isSetAllowListed());
@@ -3074,7 +3084,7 @@
assertEquals(true, app3.mOptRecord.shouldNotFreeze());
// Remove app1 from allowlist.
- mService.mOomAdjuster.setUidTempAllowlistStateLSP(MOCKAPP_UID, false);
+ mProcessStateController.setUidTempAllowlistStateLSP(MOCKAPP_UID, false);
assertEquals(false, app.getUidRecord().isSetAllowListed());
assertEquals(true, app2.getUidRecord().isSetAllowListed());
assertEquals(false, app.mOptRecord.shouldNotFreeze());
@@ -3082,7 +3092,7 @@
assertEquals(true, app3.mOptRecord.shouldNotFreeze());
// Now remove app2 from allowlist.
- mService.mOomAdjuster.setUidTempAllowlistStateLSP(MOCKAPP2_UID, false);
+ mProcessStateController.setUidTempAllowlistStateLSP(MOCKAPP2_UID, false);
assertEquals(false, app.getUidRecord().isSetAllowListed());
assertEquals(false, app2.getUidRecord().isSetAllowListed());
assertEquals(false, app.mOptRecord.shouldNotFreeze());
@@ -3098,9 +3108,9 @@
setProcessesToLru(app);
ServiceRecord s = makeServiceRecord(app);
- s.startRequested = true;
- s.lastActivity = SystemClock.uptimeMillis();
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ mProcessStateController.setStartRequested(s, true);
+ mProcessStateController.setServiceLastActivityTime(s, SystemClock.uptimeMillis());
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
updateOomAdj();
assertProcStates(app, PROCESS_STATE_SERVICE, SERVICE_ADJ, SCHED_GROUP_BACKGROUND,
"started-services");
@@ -3111,7 +3121,7 @@
verify(mService.mHandler).sendEmptyMessageAtTime(
eq(FOLLOW_UP_OOMADJUSTER_UPDATE_MSG), followUpTimeCaptor.capture());
mInjector.jumpUptimeAheadTo(followUpTimeCaptor.getValue());
- mService.mOomAdjuster.updateOomAdjFollowUpTargetsLocked();
+ mProcessStateController.runFollowUpUpdate();
final int expectedAdj = mService.mConstants.USE_TIERED_CACHED_ADJ
? sFirstNonUiCachedAdj : sFirstCachedAdj;
@@ -3131,9 +3141,9 @@
MOCKAPP2_PROCESSNAME, MOCKAPP2_PACKAGENAME, false));
app1.mProviders.setLastProviderTime(SystemClock.uptimeMillis());
app2.mProviders.setLastProviderTime(SystemClock.uptimeMillis() + 2000);
- mService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
setProcessesToLru(app1, app2);
- mService.mOomAdjuster.updateOomAdjLocked(OOM_ADJ_REASON_NONE);
+ mProcessStateController.runFullUpdate(OOM_ADJ_REASON_NONE);
assertProcStates(app1, PROCESS_STATE_LAST_ACTIVITY, PREVIOUS_APP_ADJ,
SCHED_GROUP_BACKGROUND, "recent-provider");
@@ -3146,7 +3156,7 @@
verify(mService.mHandler, atLeastOnce()).sendEmptyMessageAtTime(
eq(FOLLOW_UP_OOMADJUSTER_UPDATE_MSG), followUpTimeCaptor.capture());
mInjector.jumpUptimeAheadTo(followUpTimeCaptor.getValue());
- mService.mOomAdjuster.updateOomAdjFollowUpTargetsLocked();
+ mProcessStateController.runFollowUpUpdate();
final int expectedAdj = mService.mConstants.USE_TIERED_CACHED_ADJ
? sFirstNonUiCachedAdj : sFirstCachedAdj;
@@ -3156,7 +3166,7 @@
verify(mService.mHandler, atLeastOnce()).sendEmptyMessageAtTime(
eq(FOLLOW_UP_OOMADJUSTER_UPDATE_MSG), followUpTimeCaptor.capture());
mInjector.jumpUptimeAheadTo(followUpTimeCaptor.getValue());
- mService.mOomAdjuster.updateOomAdjFollowUpTargetsLocked();
+ mProcessStateController.runFollowUpUpdate();
assertProcStates(app2, PROCESS_STATE_CACHED_EMPTY, expectedAdj, SCHED_GROUP_BACKGROUND,
"cch-empty");
}
@@ -3169,12 +3179,12 @@
private ServiceRecord makeServiceRecord(ProcessRecord app) {
final ServiceRecord record = mock(ServiceRecord.class);
- record.app = app;
+ mProcessStateController.setHostProcess(record, app);
setFieldValue(ServiceRecord.class, record, "connections",
new ArrayMap<IBinder, ArrayList<ConnectionRecord>>());
doCallRealMethod().when(record).getConnections();
setFieldValue(ServiceRecord.class, record, "packageName", app.info.packageName);
- app.mServices.startService(record);
+ mProcessStateController.startService(app.mServices, record);
record.appInfo = app.info;
setFieldValue(ServiceRecord.class, record, "bindings", new ArrayMap<>());
setFieldValue(ServiceRecord.class, record, "pendingStarts", new ArrayList<>());
@@ -3213,17 +3223,36 @@
doCallRealMethod().when(record).addConnection(any(IBinder.class),
any(ConnectionRecord.class));
record.addConnection(binder, cr);
- client.mServices.addConnection(cr);
+ mProcessStateController.addConnection(client.mServices, cr);
binding.connections.add(cr);
doNothing().when(cr).trackProcState(anyInt(), anyInt());
return record;
}
+ private void setWakefulness(int state) {
+ if (Flags.pushGlobalStateToOomadjuster()) {
+ mProcessStateController.setWakefulness(state);
+ } else {
+ mService.mWakefulness.set(state);
+ }
+ }
+
+ @SuppressWarnings("GuardedBy")
+ private void setBackupTarget(ProcessRecord app) {
+ if (Flags.pushGlobalStateToOomadjuster()) {
+ mProcessStateController.setBackupTarget(app, app.userId);
+ } else {
+ BackupRecord backupTarget = new BackupRecord(null, 0, 0, 0);
+ backupTarget.app = app;
+ doReturn(backupTarget).when(mService.mBackupTargets).get(anyInt());
+ }
+ }
+
private ContentProviderRecord bindProvider(ProcessRecord publisher, ProcessRecord client,
ContentProviderRecord record, String name, boolean hasExternalProviders) {
if (record == null) {
record = mock(ContentProviderRecord.class);
- publisher.mProviders.installProvider(name, record);
+ mProcessStateController.addPublishedProvider(publisher, name, record);
record.proc = publisher;
setFieldValue(ContentProviderRecord.class, record, "connections",
new ArrayList<ContentProviderConnection>());
@@ -3232,7 +3261,7 @@
ContentProviderConnection conn = spy(new ContentProviderConnection(record, client,
client.info.packageName, UserHandle.getUserId(client.uid)));
record.connections.add(conn);
- client.mProviders.addProviderConnection(conn);
+ mProcessStateController.addProviderConnection(client, conn);
return record;
}
@@ -3405,10 +3434,10 @@
}
providers.setLastProviderTime(mLastProviderTime);
- UidRecord uidRec = mService.mOomAdjuster.mActiveUids.get(mUid);
+ UidRecord uidRec = mActiveUids.get(mUid);
if (uidRec == null) {
uidRec = new UidRecord(mUid, mService);
- mService.mOomAdjuster.mActiveUids.put(mUid, uidRec);
+ mActiveUids.put(mUid, uidRec);
}
uidRec.addProcess(app);
app.setUidRecord(uidRec);
diff --git a/services/tests/mockingservicestests/src/com/android/server/am/ServiceBindingOomAdjPolicyTest.java b/services/tests/mockingservicestests/src/com/android/server/am/ServiceBindingOomAdjPolicyTest.java
index 1ff4a27..59302ee 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/ServiceBindingOomAdjPolicyTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/ServiceBindingOomAdjPolicyTest.java
@@ -50,7 +50,6 @@
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
-import android.app.IApplicationThread;
import android.app.IServiceConnection;
import android.app.usage.UsageStatsManagerInternal;
import android.content.ComponentName;
@@ -169,6 +168,7 @@
realAtm.initialize(null, null, mContext.getMainLooper());
realAms.mActivityTaskManager = spy(realAtm);
realAms.mAtmInternal = spy(realAms.mActivityTaskManager.getAtmInternal());
+ realAms.mProcessStateController = spy(realAms.mProcessStateController);
realAms.mOomAdjuster = spy(realAms.mOomAdjuster);
realAms.mOomAdjuster.mCachedAppOptimizer = spy(realAms.mOomAdjuster.mCachedAppOptimizer);
realAms.mPackageManagerInt = mPackageManagerInt;
@@ -242,14 +242,14 @@
USER_SYSTEM // userId
));
- verify(mAms.mOomAdjuster, bindMode).updateOomAdjPendingTargetsLocked(anyInt());
- clearInvocations(mAms.mOomAdjuster);
+ verify(mAms.mProcessStateController, bindMode).runPendingUpdate(anyInt());
+ clearInvocations(mAms.mProcessStateController);
// Unbind the service.
mAms.unbindService(serviceConnection);
- verify(mAms.mOomAdjuster, unbindMode).updateOomAdjPendingTargetsLocked(anyInt());
- clearInvocations(mAms.mOomAdjuster);
+ verify(mAms.mProcessStateController, unbindMode).runPendingUpdate(anyInt());
+ clearInvocations(mAms.mProcessStateController);
removeProcessRecord(app);
}
@@ -496,8 +496,8 @@
USER_SYSTEM // userId
));
- verify(mAms.mOomAdjuster, bindMode).updateOomAdjPendingTargetsLocked(anyInt());
- clearInvocations(mAms.mOomAdjuster);
+ verify(mAms.mProcessStateController, bindMode).runPendingUpdate(anyInt());
+ clearInvocations(mAms.mProcessStateController);
if (clientApp.isFreezable()) {
verify(mAms.mOomAdjuster.mCachedAppOptimizer,
@@ -509,8 +509,8 @@
// Unbind the service.
mAms.unbindService(serviceConnection);
- verify(mAms.mOomAdjuster, unbindMode).updateOomAdjPendingTargetsLocked(anyInt());
- clearInvocations(mAms.mOomAdjuster);
+ verify(mAms.mProcessStateController, unbindMode).runPendingUpdate(anyInt());
+ clearInvocations(mAms.mProcessStateController);
removeProcessRecord(clientApp);
removeProcessRecord(serviceApp);
diff --git a/services/tests/servicestests/src/com/android/server/am/OomAdjusterTests.java b/services/tests/servicestests/src/com/android/server/am/OomAdjusterTests.java
index 31bf5f0..4981ceb 100644
--- a/services/tests/servicestests/src/com/android/server/am/OomAdjusterTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/OomAdjusterTests.java
@@ -61,6 +61,7 @@
private static final long USAGE_STATS_INTERACTION = 10 * 60 * 1000L;
private static final long SERVICE_USAGE_INTERACTION = 60 * 1000;
+ @SuppressWarnings("GuardedBy")
@BeforeClass
public static void setUpOnce() {
sContext = getInstrumentation().getTargetContext();
@@ -92,8 +93,11 @@
return true;
}
};
- sService.mOomAdjuster = new OomAdjuster(sService, sService.mProcessList, null,
- injector);
+ sService.mProcessStateController = new ProcessStateController.Builder(sService,
+ sService.mProcessList, null)
+ .setOomAdjusterInjector(injector)
+ .build();
+ sService.mOomAdjuster = sService.mProcessStateController.getOomAdjuster();
LocalServices.addService(UsageStatsManagerInternal.class,
mock(UsageStatsManagerInternal.class));
sService.mUsageStatsService = LocalServices.getService(UsageStatsManagerInternal.class);