diff options
| author | 2024-10-09 01:03:33 +0000 | |
|---|---|---|
| committer | 2024-10-09 01:03:33 +0000 | |
| commit | 750e82fedd565be69d2e40743a1d7f82078f4ada (patch) | |
| tree | 706985c8435e4f82fe966d9de1df8897fbdb5bcf | |
| parent | f67b570ea9d809592d0a50721fb97afe7436ae1a (diff) | |
| parent | 13c2ddfc57205a60c4a11c6bdf8aadd2371c3e0a (diff) | |
Merge changes I3f5144ab,Iefc05dd5 into main
* changes:
Push global device state to OomAdjuster
Wrap all state changes that can affect OomAdjuster computation
16 files changed, 1226 insertions, 514 deletions
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index f9197e3c5c42..3bfbc5557024 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 @@ public final class ActiveServices { 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 @@ public final class ActiveServices { 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 @@ public final class ActiveServices { 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 @@ public final class ActiveServices { } 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 @@ public final class ActiveServices { } 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 @@ public final class ActiveServices { } } - 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 @@ public final class ActiveServices { 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 @@ public final class ActiveServices { } } 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 @@ public final class ActiveServices { * 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 @@ public final class ActiveServices { 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 @@ public final class ActiveServices { } } if (anyClientActivities != psr.hasClientActivities()) { - psr.setHasClientActivities(anyClientActivities); + mAm.mProcessStateController.setHasClientActivities(psr, anyClientActivities); if (updateLru) { mAm.updateLruProcessLocked(psr.mApp, anyClientActivities, null); } @@ -4216,7 +4216,8 @@ public final class ActiveServices { } 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 @@ public final class ActiveServices { 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 @@ public final class ActiveServices { 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 @@ public final class ActiveServices { 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 @@ public final class ActiveServices { 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 @@ public final class ActiveServices { } // 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 @@ public final class ActiveServices { } 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 @@ public final class ActiveServices { } 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 @@ public final class ActiveServices { 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 @@ public final class ActiveServices { // Cleanup. if (newService) { - psr.stopService(r); + mAm.mProcessStateController.stopService(psr, r); r.setProcess(null, null, 0, null); } @@ -6431,7 +6439,7 @@ public final class ActiveServices { 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 @@ public final class ActiveServices { } 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 @@ public final class ActiveServices { } // 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 @@ public final class ActiveServices { 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 @@ public final class ActiveServices { // 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 @@ public final class ActiveServices { } 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 @@ public final class ActiveServices { removeConnectionLocked(r, app, null, true); } updateServiceConnectionActivitiesLocked(psr); - psr.removeAllConnections(); - psr.removeAllSdkSandboxConnections(); + mAm.mProcessStateController.removeAllConnections(psr); psr.mAllowlistManager = false; @@ -7220,7 +7227,7 @@ public final class ActiveServices { 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 @@ public final class ActiveServices { // 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 @@ public final class ActiveServices { // 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 @@ public final class ActiveServices { 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 @@ public final class ActiveServices { } } - psr.stopAllExecutingServices(); + mAm.mProcessStateController.stopAllExecutingServices(psr); psr.noteScheduleServiceTimeoutPending(false); } @@ -9213,14 +9220,14 @@ public final class ActiveServices { 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 74437cd3c2ef..bcca20b83060 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 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub // 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 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub } if (changed) { - updateOomAdjLocked(pr, OOM_ADJ_REASON_UI_VISIBILITY); + mProcessStateController.runUpdate(pr, OOM_ADJ_REASON_UI_VISIBILITY); } } } @@ -7274,7 +7279,7 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub mServices.updateScreenStateLocked(isAwake); reportCurWakefulnessUsageEvent(); mActivityTaskManager.onScreenAwakeChanged(isAwake); - mOomAdjuster.onWakefulnessChanged(wakefulness); + mProcessStateController.setWakefulness(wakefulness); updateOomAdjLocked(OOM_ADJ_REASON_UI_VISIBILITY); } @@ -8346,16 +8351,10 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub } mBackupTargets.removeAt(indexOfKey); } + mProcessStateController.stopBackupTarget(userId); } JobSchedulerInternal js = LocalServices.getService(JobSchedulerInternal.class); @@ -14219,6 +14223,8 @@ public class ActivityManagerService extends IActivityManager.Stub // 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 @@ public class ActivityManagerService extends IActivityManager.Stub } } finally { mBackupTargets.delete(userId); + mProcessStateController.stopBackupTarget(userId); } } @@ -15309,7 +15316,8 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub */ @GuardedBy("this") void enqueueOomAdjTargetLocked(ProcessRecord app) { - mOomAdjuster.enqueueOomAdjTargetLocked(app); + mProcessStateController.enqueueUpdateTarget(app); } /** @@ -15398,7 +15406,7 @@ public class ActivityManagerService extends IActivityManager.Stub */ @GuardedBy("this") void removeOomAdjTargetLocked(ProcessRecord app, boolean procDied) { - mOomAdjuster.removeOomAdjTargetLocked(app, procDied); + mProcessStateController.removeUpdateTarget(app, procDied); } /** @@ -15407,7 +15415,7 @@ public class ActivityManagerService extends IActivityManager.Stub */ @GuardedBy("this") void updateOomAdjPendingTargetsLocked(@OomAdjReason int oomAdjReason) { - mOomAdjuster.updateOomAdjPendingTargetsLocked(oomAdjReason); + mProcessStateController.runPendingUpdate(oomAdjReason); } static final class ProcStatsRunnable implements Runnable { @@ -15426,7 +15434,7 @@ public class ActivityManagerService extends IActivityManager.Stub @GuardedBy("this") final void updateOomAdjLocked(@OomAdjReason int oomAdjReason) { - mOomAdjuster.updateOomAdjLocked(oomAdjReason); + mProcessStateController.runFullUpdate(oomAdjReason); } /** @@ -15438,7 +15446,7 @@ public class ActivityManagerService extends IActivityManager.Stub */ @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 @@ public class ActivityManagerService extends IActivityManager.Stub @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 @@ public class ActivityManagerService extends IActivityManager.Stub 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 dda48adbf732..4f2d69e4bb72 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 @@ public class AppProfiler { @GuardedBy("mService") void setMemFactorOverrideLocked(@MemFactor int factor) { mMemFactorOverride = factor; + mService.mProcessStateController.setIsLastMemoryLevelNormal(isLastMemoryLevelNormal()); } @GuardedBy({"mService", "mProcLock"}) @@ -1423,6 +1424,7 @@ public class AppProfiler { } 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 da408266bfac..221938a3ff26 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 @@ public class ContentProviderHelper { 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 @@ public class ContentProviderHelper { 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 @@ public class ContentProviderHelper { 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 @@ public class ContentProviderHelper { 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 @@ public class ContentProviderHelper { 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 @@ public class ContentProviderHelper { 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 @@ public class ContentProviderHelper { 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 @@ public class ContentProviderHelper { } } 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 2a30ad0e0f3f..61079fc78f8a 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 Broadcast* = file:/BROADCASTS_OWNERS 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 4073ab848f81..e8f7b5f00152 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 static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_SWITCH; 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 @@ public class OomAdjuster { final ActivityManagerService mService; final Injector mInjector; + final GlobalState mGlobalState; final ProcessList mProcessList; final ActivityManagerGlobalLock mProcLock; @@ -470,15 +472,23 @@ public class OomAdjuster { } + // 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 @@ public class OomAdjuster { } 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 @@ public class OomAdjuster { } } + 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 @@ public class OomAdjuster { 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 @@ public class OomAdjuster { 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 @@ public class OomAdjuster { // 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 @@ public class OomAdjuster { 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 fb1c2e9a1f9d..e452c45156c9 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 @@ public class OomAdjusterModernImpl extends OomAdjuster { 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 57922d5eb05e..2485626a8f42 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 @@ public final class ProcessList { 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 3e71d003f455..b51db137f293 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 @@ class ProcessRecord implements WindowProcessListener { setWaitingToKill(null); mState.onCleanupApplicationRecordLSP(); - mServices.onCleanupApplicationRecordLocked(); + mService.mProcessStateController.onCleanupApplicationRecord(mServices); mReceivers.onCleanupApplicationRecordLocked(); mService.mOomAdjuster.onProcessEndLocked(this); @@ -1638,7 +1639,7 @@ class ProcessRecord implements WindowProcessListener { updateProcessInfo(false /* updateServiceConnectionActivities */, true /* activityChange */, true /* updateOomAdj */); setPendingUiClean(true); - mState.setHasShownUi(true); + mService.mProcessStateController.setHasShownUi(this, true); mState.forceProcessStateUpTo(topProcessState); } } @@ -1657,7 +1658,10 @@ class ProcessRecord implements WindowProcessListener { 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 000000000000..428df2361f0d --- /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 bc990d9c5ef9..b0f808b39053 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 @@ package com.android.server.am; 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.app.ActivityManager; 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 @@ final class ProcessStateRecord { @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 b9cdf27a7415..92d33c9eae56 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 @@ final class ServiceRecord extends Binder implements ComponentName.WithComponentN 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 7873d34e9047..adf0e640f6bf 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 @@ flag { 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 2107406f9b13..412599d463c5 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { @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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 class MockingOomAdjusterTests { 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 class MockingOomAdjusterTests { 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 class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 class MockingOomAdjusterTests { 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 class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { { 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 @@ public class MockingOomAdjusterTests { // 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 class MockingOomAdjusterTests { 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 class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { // 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { // 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 @@ public class MockingOomAdjusterTests { // 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 @@ public class MockingOomAdjusterTests { 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 class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 class MockingOomAdjusterTests { 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 class MockingOomAdjusterTests { 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 class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { // 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 @@ public class MockingOomAdjusterTests { // 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 @@ public class MockingOomAdjusterTests { // 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { // 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 class MockingOomAdjusterTests { 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 class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { .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 class MockingOomAdjusterTests { 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 class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { // 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { // 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 @@ public class MockingOomAdjusterTests { // 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { 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 @@ public class MockingOomAdjusterTests { } 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 1ff4a27cb787..59302ee408eb 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.spy; 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 @@ public final class ServiceBindingOomAdjPolicyTest { 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 @@ public final class ServiceBindingOomAdjPolicyTest { 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 @@ public final class ServiceBindingOomAdjPolicyTest { 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 @@ public final class ServiceBindingOomAdjPolicyTest { // 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 31bf5f046cff..4981ceb944c2 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 @@ public class OomAdjusterTests { 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 @@ public class OomAdjusterTests { 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); |