diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index e0fc531eb326a..6a1959315ff0a 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -1312,7 +1312,7 @@ public final class ActiveServices { // This could have made the service more important. mAm.updateLruProcessLocked(s.app, s.app.hasClientActivities || s.app.treatLikeActivity, b.client); - mAm.updateOomAdjLocked(s.app); + mAm.updateOomAdjLocked(s.app, true); } if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "Bind " + s + " with " + b @@ -1427,13 +1427,15 @@ public final class ActiveServices { r.binding.service.app.hasClientActivities || r.binding.service.app.treatLikeActivity, null); } - mAm.updateOomAdjLocked(r.binding.service.app); + mAm.updateOomAdjLocked(r.binding.service.app, false); } } } finally { Binder.restoreCallingIdentity(origId); } + mAm.updateOomAdjLocked(); + return true; } @@ -2173,7 +2175,7 @@ public final class ActiveServices { bumpServiceExecutingLocked(r, execInFg, "start"); if (!oomAdjusted) { oomAdjusted = true; - mAm.updateOomAdjLocked(r.app); + mAm.updateOomAdjLocked(r.app, true); } if (r.fgRequired && !r.fgWaiting) { if (!r.isForeground) { @@ -2297,7 +2299,7 @@ public final class ActiveServices { if (ibr.hasBound) { try { bumpServiceExecutingLocked(r, false, "bring down unbind"); - mAm.updateOomAdjLocked(r.app); + mAm.updateOomAdjLocked(r.app, true); ibr.hasBound = false; ibr.requested = false; r.app.thread.scheduleUnbindService(r, @@ -2389,7 +2391,7 @@ public final class ActiveServices { bumpServiceExecutingLocked(r, false, "destroy"); mDestroyingServices.add(r); r.destroying = true; - mAm.updateOomAdjLocked(r.app); + mAm.updateOomAdjLocked(r.app, true); r.app.thread.scheduleStopService(r); } catch (Exception e) { Slog.w(TAG, "Exception when destroying service " @@ -2490,7 +2492,7 @@ public final class ActiveServices { // it to go down there and we want it to start out near the top. mAm.updateLruProcessLocked(s.app, false, null); } - mAm.updateOomAdjLocked(s.app); + mAm.updateOomAdjLocked(s.app, true); b.intent.hasBound = false; // Assume the client doesn't want to know about a rebind; // we will deal with that later if it asks for one. @@ -2643,7 +2645,7 @@ public final class ActiveServices { mDestroyingServices.remove(r); r.bindings.clear(); } - mAm.updateOomAdjLocked(r.app); + mAm.updateOomAdjLocked(r.app, true); } r.executeFg = false; if (r.tracker != null) { diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index d46a24bec6cb9..c9f0011be4d53 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -11262,7 +11262,7 @@ public class ActivityManagerService extends IActivityManager.Stub checkTime(startTime, "getContentProviderImpl: before updateOomAdj"); final int verifiedAdj = cpr.proc.verifiedAdj; - boolean success = updateOomAdjLocked(cpr.proc); + boolean success = updateOomAdjLocked(cpr.proc, true); // XXX things have changed so updateOomAdjLocked doesn't actually tell us // if the process has been successfully adjusted. So to reduce races with // it, we will check whether the process still exists. Note that this doesn't @@ -11724,7 +11724,7 @@ public class ActivityManagerService extends IActivityManager.Stub dst.proc = r; dst.notifyAll(); } - updateOomAdjLocked(r); + updateOomAdjLocked(r, true); maybeUpdateProviderUsageStatsLocked(r, src.info.packageName, src.info.authority); } @@ -13455,7 +13455,7 @@ public class ActivityManagerService extends IActivityManager.Stub } } if (changed) { - updateOomAdjLocked(pr); + updateOomAdjLocked(pr, true); } } } finally { @@ -18228,7 +18228,7 @@ public class ActivityManagerService extends IActivityManager.Stub mBackupAppName = app.packageName; // Try not to kill the process during backup - updateOomAdjLocked(proc); + updateOomAdjLocked(proc, true); // If the process is already attached, schedule the creation of the backup agent now. // If it is not yet live, this will be done when it attaches to the framework. @@ -18325,7 +18325,7 @@ public class ActivityManagerService extends IActivityManager.Stub // Not backing this app up any more; reset its OOM adjustment final ProcessRecord proc = mBackupTarget.app; - updateOomAdjLocked(proc); + updateOomAdjLocked(proc, true); proc.inFullBackup = false; oldBackupUid = mBackupTarget != null ? mBackupTarget.appInfo.uid : -1; @@ -22084,7 +22084,14 @@ public class ActivityManagerService extends IActivityManager.Stub return act; } - final boolean updateOomAdjLocked(ProcessRecord app) { + /** + * Update OomAdj for a specific process. + * @param app The process to update + * @param oomAdjAll If it's ok to call updateOomAdjLocked() for all running apps + * if necessary, or skip. + * @return whether updateOomAdjLocked(app) was successful. + */ + final boolean updateOomAdjLocked(ProcessRecord app, boolean oomAdjAll) { final ActivityRecord TOP_ACT = resumedAppLocked(); final ProcessRecord TOP_APP = TOP_ACT != null ? TOP_ACT.app : null; final boolean wasCached = app.cached; @@ -22099,7 +22106,8 @@ public class ActivityManagerService extends IActivityManager.Stub ? app.curRawAdj : ProcessList.UNKNOWN_ADJ; boolean success = updateOomAdjLocked(app, cachedAdj, TOP_APP, false, SystemClock.uptimeMillis()); - if (wasCached != app.cached || app.curRawAdj == ProcessList.UNKNOWN_ADJ) { + if (oomAdjAll + && (wasCached != app.cached || app.curRawAdj == ProcessList.UNKNOWN_ADJ)) { // Changed to/from cached state, so apps after it in the LRU // list may also be changed. updateOomAdjLocked(); @@ -23671,7 +23679,7 @@ public class ActivityManagerService extends IActivityManager.Stub } pr.hasOverlayUi = hasOverlayUi; //Slog.i(TAG, "Setting hasOverlayUi=" + pr.hasOverlayUi + " for pid=" + pid); - updateOomAdjLocked(pr); + updateOomAdjLocked(pr, true); } } diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java index d08298bcac058..4ce62e0f602f0 100644 --- a/services/core/java/com/android/server/am/BroadcastQueue.java +++ b/services/core/java/com/android/server/am/BroadcastQueue.java @@ -51,7 +51,6 @@ import android.os.UserHandle; import android.util.EventLog; import android.util.Slog; import android.util.TimeUtils; -import com.android.server.DeviceIdleController; import static com.android.server.am.ActivityManagerDebugConfig.*; @@ -682,7 +681,7 @@ public final class BroadcastQueue { // are already core system stuff so don't matter for this. r.curApp = filter.receiverList.app; filter.receiverList.app.curReceivers.add(r); - mService.updateOomAdjLocked(r.curApp); + mService.updateOomAdjLocked(r.curApp, true); } } try {