Loading services/core/java/com/android/server/am/ActiveServices.java +13 −9 Original line number Diff line number Diff line Loading @@ -1806,7 +1806,7 @@ public final class ActiveServices { || (callerApp.getCurProcState() <= ActivityManager.PROCESS_STATE_TOP && (flags & Context.BIND_TREAT_LIKE_ACTIVITY) != 0), b.client); mAm.updateOomAdjLocked(); mAm.updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_BIND_SERVICE); } if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "Bind " + s + " with " + b Loading Loading @@ -1957,11 +1957,12 @@ public final class ActiveServices { r.binding.service.app.hasClientActivities() || r.binding.service.app.treatLikeActivity, null); } mAm.updateOomAdjLocked(r.binding.service.app, false); mAm.updateOomAdjLocked(r.binding.service.app, false, OomAdjuster.OOM_ADJ_REASON_UNBIND_SERVICE); } } mAm.updateOomAdjLocked(); mAm.updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_UNBIND_SERVICE); } finally { Binder.restoreCallingIdentity(origId); Loading Loading @@ -2676,7 +2677,7 @@ public final class ActiveServices { bumpServiceExecutingLocked(r, execInFg, "create"); mAm.updateLruProcessLocked(app, false, null); updateServiceForegroundLocked(r.app, /* oomAdj= */ false); mAm.updateOomAdjLocked(); mAm.updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_START_SERVICE); boolean created = false; try { Loading Loading @@ -2797,7 +2798,7 @@ public final class ActiveServices { bumpServiceExecutingLocked(r, execInFg, "start"); if (!oomAdjusted) { oomAdjusted = true; mAm.updateOomAdjLocked(r.app, true); mAm.updateOomAdjLocked(r.app, true, OomAdjuster.OOM_ADJ_REASON_START_SERVICE); } if (r.fgRequired && !r.fgWaiting) { if (!r.isForeground) { Loading Loading @@ -2923,7 +2924,8 @@ public final class ActiveServices { if (ibr.hasBound) { try { bumpServiceExecutingLocked(r, false, "bring down unbind"); mAm.updateOomAdjLocked(r.app, true); mAm.updateOomAdjLocked(r.app, true, OomAdjuster.OOM_ADJ_REASON_UNBIND_SERVICE); ibr.hasBound = false; ibr.requested = false; r.app.thread.scheduleUnbindService(r, Loading Loading @@ -3038,7 +3040,8 @@ public final class ActiveServices { bumpServiceExecutingLocked(r, false, "destroy"); mDestroyingServices.add(r); r.destroying = true; mAm.updateOomAdjLocked(r.app, true); mAm.updateOomAdjLocked(r.app, true, OomAdjuster.OOM_ADJ_REASON_UNBIND_SERVICE); r.app.thread.scheduleStopService(r); } catch (Exception e) { Slog.w(TAG, "Exception when destroying service " Loading Loading @@ -3143,7 +3146,8 @@ 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, true); mAm.updateOomAdjLocked(s.app, true, OomAdjuster.OOM_ADJ_REASON_UNBIND_SERVICE); 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. Loading Loading @@ -3296,7 +3300,7 @@ public final class ActiveServices { mDestroyingServices.remove(r); r.bindings.clear(); } mAm.updateOomAdjLocked(r.app, true); mAm.updateOomAdjLocked(r.app, true, OomAdjuster.OOM_ADJ_REASON_UNBIND_SERVICE); } r.executeFg = false; if (r.tracker != null) { Loading services/core/java/com/android/server/am/ActivityManagerService.java +34 −31 Original line number Diff line number Diff line Loading @@ -1972,7 +1972,7 @@ public class ActivityManagerService extends IActivityManager.Stub app.makeActive(mSystemThread.getApplicationThread(), mProcessStats); mPidsSelfLocked.put(app.pid, app); mProcessList.updateLruProcessLocked(app, false, null); updateOomAdjLocked(); updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_NONE); } } catch (PackageManager.NameNotFoundException e) { throw new RuntimeException( Loading Loading @@ -2456,7 +2456,7 @@ public class ActivityManagerService extends IActivityManager.Stub // bind background threads to little cores // this is expected to fail inside of framework tests because apps can't touch cpusets directly // make sure we've already adjusted system_server's internal view of itself first updateOomAdjLocked(); updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_NONE); try { Process.setThreadGroupAndCpuset(BackgroundThread.get().getThreadId(), Process.THREAD_GROUP_SYSTEM); Loading Loading @@ -3634,7 +3634,7 @@ public class ActivityManagerService extends IActivityManager.Stub handleAppDiedLocked(app, false, true); if (doOomAdj) { updateOomAdjLocked(); updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_PROCESS_END); } if (doLowMem) { doLowMemReportIfNeededLocked(app); Loading Loading @@ -5002,7 +5002,7 @@ public class ActivityManagerService extends IActivityManager.Stub } if (!didSomething) { updateOomAdjLocked(); updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_PROCESS_BEGIN); checkTime(startTime, "attachApplicationLocked: after updateOomAdjLocked"); } Loading Loading @@ -5485,7 +5485,7 @@ public class ActivityManagerService extends IActivityManager.Stub synchronized (this) { mConstants.setOverrideMaxCachedProcesses(max); } trimApplications(); trimApplications(OomAdjuster.OOM_ADJ_REASON_PROCESS_END); } @Override Loading @@ -5511,7 +5511,7 @@ public class ActivityManagerService extends IActivityManager.Stub pr.forcingToImportant = null; updateProcessForegroundLocked(pr, false, 0, false); } updateOomAdjLocked(); updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_UI_VISIBILITY); } } Loading Loading @@ -5557,7 +5557,7 @@ public class ActivityManagerService extends IActivityManager.Stub } if (changed) { updateOomAdjLocked(); updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_UI_VISIBILITY); } } } Loading Loading @@ -6714,7 +6714,8 @@ public class ActivityManagerService extends IActivityManager.Stub checkTime(startTime, "getContentProviderImpl: before updateOomAdj"); final int verifiedAdj = cpr.proc.verifiedAdj; boolean success = updateOomAdjLocked(cpr.proc, true); boolean success = updateOomAdjLocked(cpr.proc, true, OomAdjuster.OOM_ADJ_REASON_GET_PROVIDER); // 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 Loading Loading @@ -7147,7 +7148,7 @@ public class ActivityManagerService extends IActivityManager.Stub throw new NullPointerException("connection is null"); } if (decProviderCountLocked(conn, null, null, stable)) { updateOomAdjLocked(); updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_REMOVE_PROVIDER); } } } finally { Loading Loading @@ -7188,7 +7189,7 @@ public class ActivityManagerService extends IActivityManager.Stub ContentProviderRecord localCpr = mProviderMap.getProviderByClass(comp, userId); if (localCpr.hasExternalProcessHandles()) { if (localCpr.removeExternalProcessHandleLocked(token)) { updateOomAdjLocked(); updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_REMOVE_PROVIDER); } else { Slog.e(TAG, "Attmpt to remove content provider " + localCpr + " with no external reference for token: " Loading Loading @@ -7255,7 +7256,7 @@ public class ActivityManagerService extends IActivityManager.Stub dst.setProcess(r); dst.notifyAll(); } updateOomAdjLocked(r, true); updateOomAdjLocked(r, true, OomAdjuster.OOM_ADJ_REASON_GET_PROVIDER); maybeUpdateProviderUsageStatsLocked(r, src.info.packageName, src.info.authority); } Loading Loading @@ -7645,7 +7646,7 @@ public class ActivityManagerService extends IActivityManager.Stub new HostingRecord("added application", customProcess != null ? customProcess : info.processName)); mProcessList.updateLruProcessLocked(app, false, null); updateOomAdjLocked(); updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_PROCESS_BEGIN); } // This package really, really can not be stopped. Loading Loading @@ -7740,7 +7741,7 @@ public class ActivityManagerService extends IActivityManager.Stub mActivityTaskManager.onScreenAwakeChanged(isAwake); mOomAdjProfiler.onWakefulnessChanged(wakefulness); } updateOomAdjLocked(); updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_UI_VISIBILITY); } } Loading Loading @@ -8320,7 +8321,7 @@ public class ActivityManagerService extends IActivityManager.Stub } } if (changed) { updateOomAdjLocked(pr, true); updateOomAdjLocked(pr, true, OomAdjuster.OOM_ADJ_REASON_UI_VISIBILITY); } } } finally { Loading Loading @@ -8350,7 +8351,7 @@ public class ActivityManagerService extends IActivityManager.Stub Slog.i(TAG, "Setting runningRemoteAnimation=" + pr.runningRemoteAnimation + " for pid=" + pid); } updateOomAdjLocked(pr, true); updateOomAdjLocked(pr, true, OomAdjuster.OOM_ADJ_REASON_UI_VISIBILITY); } } Loading Loading @@ -13984,7 +13985,7 @@ public class ActivityManagerService extends IActivityManager.Stub mBackupTargets.put(targetUserId, r); // Try not to kill the process during backup updateOomAdjLocked(proc, true); updateOomAdjLocked(proc, true, OomAdjuster.OOM_ADJ_REASON_NONE); // 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. Loading Loading @@ -14099,7 +14100,7 @@ public class ActivityManagerService extends IActivityManager.Stub // Not backing this app up any more; reset its OOM adjustment final ProcessRecord proc = backupTarget.app; updateOomAdjLocked(proc, true); updateOomAdjLocked(proc, true, OomAdjuster.OOM_ADJ_REASON_NONE); proc.inFullBackup = false; oldBackupUid = backupTarget != null ? backupTarget.appInfo.uid : -1; Loading Loading @@ -14388,7 +14389,7 @@ public class ActivityManagerService extends IActivityManager.Stub // If we actually concluded any broadcasts, we might now be able // to trim the recipients' apps from our working set if (doTrim) { trimApplications(); trimApplications(OomAdjuster.OOM_ADJ_REASON_FINISH_RECEIVER); return; } Loading Loading @@ -15463,7 +15464,7 @@ public class ActivityManagerService extends IActivityManager.Stub r.queue.processNextBroadcastLocked(/*fromMsg=*/ false, /*skipOomAdj=*/ true); } // updateOomAdjLocked() will be done here trimApplicationsLocked(); trimApplicationsLocked(OomAdjuster.OOM_ADJ_REASON_FINISH_RECEIVER); } } finally { Loading Loading @@ -16448,7 +16449,7 @@ public class ActivityManagerService extends IActivityManager.Stub item.foregroundServiceTypes = fgServiceTypes; if (oomAdj) { updateOomAdjLocked(); updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_UI_VISIBILITY); } } } Loading Loading @@ -16496,11 +16497,13 @@ public class ActivityManagerService extends IActivityManager.Stub * @param app The process to update * @param oomAdjAll If it's ok to call updateOomAdjLocked() for all running apps * if necessary, or skip. * @param oomAdjReason * @return whether updateOomAdjLocked(app) was successful. */ @GuardedBy("this") final boolean updateOomAdjLocked(ProcessRecord app, boolean oomAdjAll) { return mOomAdjuster.updateOomAdjLocked(app, oomAdjAll); final boolean updateOomAdjLocked(ProcessRecord app, boolean oomAdjAll, String oomAdjReason) { return mOomAdjuster.updateOomAdjLocked(app, oomAdjAll, oomAdjReason); } static final class ProcStatsRunnable implements Runnable { Loading Loading @@ -16693,8 +16696,8 @@ public class ActivityManagerService extends IActivityManager.Stub } @GuardedBy("this") final void updateOomAdjLocked() { mOomAdjuster.updateOomAdjLocked(); final void updateOomAdjLocked(String oomAdjReason) { mOomAdjuster.updateOomAdjLocked(oomAdjReason); } @Override Loading Loading @@ -16979,14 +16982,14 @@ public class ActivityManagerService extends IActivityManager.Stub mOomAdjuster.setUidTempWhitelistStateLocked(uid, onWhitelist); } final void trimApplications() { final void trimApplications(String oomAdjReason) { synchronized (this) { trimApplicationsLocked(); trimApplicationsLocked(oomAdjReason); } } @GuardedBy("this") final void trimApplicationsLocked() { final void trimApplicationsLocked(String oomAdjReason) { // First remove any unused application processes whose package // has been removed. for (int i = mProcessList.mRemovedProcesses.size() - 1; i >= 0; i--) { Loading Loading @@ -17018,7 +17021,7 @@ public class ActivityManagerService extends IActivityManager.Stub // Now update the oom adj for all processes. Don't skip this, since other callers // might be depending on it. updateOomAdjLocked(); updateOomAdjLocked(oomAdjReason); } /** This method sends the specified signal to each of the persistent apps */ Loading Loading @@ -17627,7 +17630,7 @@ public class ActivityManagerService extends IActivityManager.Stub } pr.setHasOverlayUi(hasOverlayUi); //Slog.i(TAG, "Setting hasOverlayUi=" + pr.hasOverlayUi + " for pid=" + pid); updateOomAdjLocked(pr, true); updateOomAdjLocked(pr, true, OomAdjuster.OOM_ADJ_REASON_UI_VISIBILITY); } } Loading Loading @@ -17784,7 +17787,7 @@ public class ActivityManagerService extends IActivityManager.Stub @Override public void trimApplications() { ActivityManagerService.this.trimApplications(); ActivityManagerService.this.trimApplications(OomAdjuster.OOM_ADJ_REASON_ACTIVITY); } public void killProcessesForRemovedTask(ArrayList<Object> procsToKill) { Loading Loading @@ -17836,7 +17839,7 @@ public class ActivityManagerService extends IActivityManager.Stub @Override public void updateOomAdj() { synchronized (ActivityManagerService.this) { ActivityManagerService.this.updateOomAdjLocked(); ActivityManagerService.this.updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_NONE); } } services/core/java/com/android/server/am/BroadcastQueue.java +4 −3 Original line number Diff line number Diff line Loading @@ -309,7 +309,7 @@ public final class BroadcastQueue { app.forceProcessStateUpTo(ActivityManager.PROCESS_STATE_RECEIVER); mService.mProcessList.updateLruProcessLocked(app, false, null); if (!skipOomAdj) { mService.updateOomAdjLocked(); mService.updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_NONE); } // Tell the application to launch this receiver. Loading Loading @@ -791,7 +791,8 @@ 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, true); mService.updateOomAdjLocked(r.curApp, true, OomAdjuster.OOM_ADJ_REASON_START_RECEIVER); } } try { Loading Loading @@ -1028,7 +1029,7 @@ public final class BroadcastQueue { // If we had finished the last ordered broadcast, then // make sure all processes have correct oom and sched // adjustments. mService.updateOomAdjLocked(); mService.updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_START_RECEIVER); } // when we have no more ordered broadcast on this queue, stop logging Loading services/core/java/com/android/server/am/OomAdjuster.java +23 −6 Original line number Diff line number Diff line Loading @@ -90,6 +90,21 @@ import java.util.Arrays; public final class OomAdjuster { private static final String TAG = "OomAdjuster"; static final String OOM_ADJ_REASON_METHOD = "updateOomAdj"; static final String OOM_ADJ_REASON_NONE = OOM_ADJ_REASON_METHOD + "_meh"; static final String OOM_ADJ_REASON_ACTIVITY = OOM_ADJ_REASON_METHOD + "_activityChange"; static final String OOM_ADJ_REASON_FINISH_RECEIVER = OOM_ADJ_REASON_METHOD + "_finishReceiver"; static final String OOM_ADJ_REASON_START_RECEIVER = OOM_ADJ_REASON_METHOD + "_startReceiver"; static final String OOM_ADJ_REASON_BIND_SERVICE = OOM_ADJ_REASON_METHOD + "_bindService"; static final String OOM_ADJ_REASON_UNBIND_SERVICE = OOM_ADJ_REASON_METHOD + "_unbindService"; static final String OOM_ADJ_REASON_START_SERVICE = OOM_ADJ_REASON_METHOD + "_startService"; static final String OOM_ADJ_REASON_GET_PROVIDER = OOM_ADJ_REASON_METHOD + "_getProvider"; static final String OOM_ADJ_REASON_REMOVE_PROVIDER = OOM_ADJ_REASON_METHOD + "_removeProvider"; static final String OOM_ADJ_REASON_UI_VISIBILITY = OOM_ADJ_REASON_METHOD + "_uiVisibility"; static final String OOM_ADJ_REASON_WHITELIST = OOM_ADJ_REASON_METHOD + "_whitelistChange"; static final String OOM_ADJ_REASON_PROCESS_BEGIN = OOM_ADJ_REASON_METHOD + "_processBegin"; static final String OOM_ADJ_REASON_PROCESS_END = OOM_ADJ_REASON_METHOD + "_processEnd"; /** * For some direct access we need to power manager. */ Loading Loading @@ -156,10 +171,12 @@ public final class OomAdjuster { * @param app The process to update * @param oomAdjAll If it's ok to call updateOomAdjLocked() for all running apps * if necessary, or skip. * @param oomAdjReason * @return whether updateOomAdjLocked(app) was successful. */ @GuardedBy("mService") final boolean updateOomAdjLocked(ProcessRecord app, boolean oomAdjAll) { boolean updateOomAdjLocked(ProcessRecord app, boolean oomAdjAll, String oomAdjReason) { final ProcessRecord TOP_APP = mService.getTopAppLocked(); final boolean wasCached = app.cached; Loading @@ -177,7 +194,7 @@ public final class OomAdjuster { && (wasCached != app.cached || app.getCurRawAdj() == ProcessList.UNKNOWN_ADJ)) { // Changed to/from cached state, so apps after it in the LRU // list may also be changed. updateOomAdjLocked(); updateOomAdjLocked(oomAdjReason); } return success; } Loading @@ -195,8 +212,8 @@ public final class OomAdjuster { } @GuardedBy("mService") final void updateOomAdjLocked() { Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "updateOomAdj"); void updateOomAdjLocked(String oomAdjReason) { Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, oomAdjReason); mService.mOomAdjProfiler.oomAdjStarted(); final ProcessRecord TOP_APP = mService.getTopAppLocked(); final long now = SystemClock.uptimeMillis(); Loading Loading @@ -2009,7 +2026,7 @@ public final class OomAdjuster { } } if (changed) { updateOomAdjLocked(); updateOomAdjLocked(OOM_ADJ_REASON_WHITELIST); } } Loading @@ -2019,7 +2036,7 @@ public final class OomAdjuster { final UidRecord uidRec = mActiveUids.get(uid); if (uidRec != null && uidRec.curWhitelist != onWhitelist) { uidRec.curWhitelist = onWhitelist; updateOomAdjLocked(); updateOomAdjLocked(OOM_ADJ_REASON_WHITELIST); } } Loading services/core/java/com/android/server/am/ProcessList.java +2 −1 Original line number Diff line number Diff line Loading @@ -2227,9 +2227,10 @@ public final class ProcessList { for (AppZygote appZygote : zygotesToKill) { killAppZygoteIfNeededLocked(appZygote); } mService.updateOomAdjLocked(); mService.updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_PROCESS_END); return N > 0; } @GuardedBy("mService") boolean removeProcessLocked(ProcessRecord app, boolean callerWillRestart, boolean allowRestart, String reason) { Loading Loading
services/core/java/com/android/server/am/ActiveServices.java +13 −9 Original line number Diff line number Diff line Loading @@ -1806,7 +1806,7 @@ public final class ActiveServices { || (callerApp.getCurProcState() <= ActivityManager.PROCESS_STATE_TOP && (flags & Context.BIND_TREAT_LIKE_ACTIVITY) != 0), b.client); mAm.updateOomAdjLocked(); mAm.updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_BIND_SERVICE); } if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "Bind " + s + " with " + b Loading Loading @@ -1957,11 +1957,12 @@ public final class ActiveServices { r.binding.service.app.hasClientActivities() || r.binding.service.app.treatLikeActivity, null); } mAm.updateOomAdjLocked(r.binding.service.app, false); mAm.updateOomAdjLocked(r.binding.service.app, false, OomAdjuster.OOM_ADJ_REASON_UNBIND_SERVICE); } } mAm.updateOomAdjLocked(); mAm.updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_UNBIND_SERVICE); } finally { Binder.restoreCallingIdentity(origId); Loading Loading @@ -2676,7 +2677,7 @@ public final class ActiveServices { bumpServiceExecutingLocked(r, execInFg, "create"); mAm.updateLruProcessLocked(app, false, null); updateServiceForegroundLocked(r.app, /* oomAdj= */ false); mAm.updateOomAdjLocked(); mAm.updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_START_SERVICE); boolean created = false; try { Loading Loading @@ -2797,7 +2798,7 @@ public final class ActiveServices { bumpServiceExecutingLocked(r, execInFg, "start"); if (!oomAdjusted) { oomAdjusted = true; mAm.updateOomAdjLocked(r.app, true); mAm.updateOomAdjLocked(r.app, true, OomAdjuster.OOM_ADJ_REASON_START_SERVICE); } if (r.fgRequired && !r.fgWaiting) { if (!r.isForeground) { Loading Loading @@ -2923,7 +2924,8 @@ public final class ActiveServices { if (ibr.hasBound) { try { bumpServiceExecutingLocked(r, false, "bring down unbind"); mAm.updateOomAdjLocked(r.app, true); mAm.updateOomAdjLocked(r.app, true, OomAdjuster.OOM_ADJ_REASON_UNBIND_SERVICE); ibr.hasBound = false; ibr.requested = false; r.app.thread.scheduleUnbindService(r, Loading Loading @@ -3038,7 +3040,8 @@ public final class ActiveServices { bumpServiceExecutingLocked(r, false, "destroy"); mDestroyingServices.add(r); r.destroying = true; mAm.updateOomAdjLocked(r.app, true); mAm.updateOomAdjLocked(r.app, true, OomAdjuster.OOM_ADJ_REASON_UNBIND_SERVICE); r.app.thread.scheduleStopService(r); } catch (Exception e) { Slog.w(TAG, "Exception when destroying service " Loading Loading @@ -3143,7 +3146,8 @@ 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, true); mAm.updateOomAdjLocked(s.app, true, OomAdjuster.OOM_ADJ_REASON_UNBIND_SERVICE); 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. Loading Loading @@ -3296,7 +3300,7 @@ public final class ActiveServices { mDestroyingServices.remove(r); r.bindings.clear(); } mAm.updateOomAdjLocked(r.app, true); mAm.updateOomAdjLocked(r.app, true, OomAdjuster.OOM_ADJ_REASON_UNBIND_SERVICE); } r.executeFg = false; if (r.tracker != null) { Loading
services/core/java/com/android/server/am/ActivityManagerService.java +34 −31 Original line number Diff line number Diff line Loading @@ -1972,7 +1972,7 @@ public class ActivityManagerService extends IActivityManager.Stub app.makeActive(mSystemThread.getApplicationThread(), mProcessStats); mPidsSelfLocked.put(app.pid, app); mProcessList.updateLruProcessLocked(app, false, null); updateOomAdjLocked(); updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_NONE); } } catch (PackageManager.NameNotFoundException e) { throw new RuntimeException( Loading Loading @@ -2456,7 +2456,7 @@ public class ActivityManagerService extends IActivityManager.Stub // bind background threads to little cores // this is expected to fail inside of framework tests because apps can't touch cpusets directly // make sure we've already adjusted system_server's internal view of itself first updateOomAdjLocked(); updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_NONE); try { Process.setThreadGroupAndCpuset(BackgroundThread.get().getThreadId(), Process.THREAD_GROUP_SYSTEM); Loading Loading @@ -3634,7 +3634,7 @@ public class ActivityManagerService extends IActivityManager.Stub handleAppDiedLocked(app, false, true); if (doOomAdj) { updateOomAdjLocked(); updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_PROCESS_END); } if (doLowMem) { doLowMemReportIfNeededLocked(app); Loading Loading @@ -5002,7 +5002,7 @@ public class ActivityManagerService extends IActivityManager.Stub } if (!didSomething) { updateOomAdjLocked(); updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_PROCESS_BEGIN); checkTime(startTime, "attachApplicationLocked: after updateOomAdjLocked"); } Loading Loading @@ -5485,7 +5485,7 @@ public class ActivityManagerService extends IActivityManager.Stub synchronized (this) { mConstants.setOverrideMaxCachedProcesses(max); } trimApplications(); trimApplications(OomAdjuster.OOM_ADJ_REASON_PROCESS_END); } @Override Loading @@ -5511,7 +5511,7 @@ public class ActivityManagerService extends IActivityManager.Stub pr.forcingToImportant = null; updateProcessForegroundLocked(pr, false, 0, false); } updateOomAdjLocked(); updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_UI_VISIBILITY); } } Loading Loading @@ -5557,7 +5557,7 @@ public class ActivityManagerService extends IActivityManager.Stub } if (changed) { updateOomAdjLocked(); updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_UI_VISIBILITY); } } } Loading Loading @@ -6714,7 +6714,8 @@ public class ActivityManagerService extends IActivityManager.Stub checkTime(startTime, "getContentProviderImpl: before updateOomAdj"); final int verifiedAdj = cpr.proc.verifiedAdj; boolean success = updateOomAdjLocked(cpr.proc, true); boolean success = updateOomAdjLocked(cpr.proc, true, OomAdjuster.OOM_ADJ_REASON_GET_PROVIDER); // 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 Loading Loading @@ -7147,7 +7148,7 @@ public class ActivityManagerService extends IActivityManager.Stub throw new NullPointerException("connection is null"); } if (decProviderCountLocked(conn, null, null, stable)) { updateOomAdjLocked(); updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_REMOVE_PROVIDER); } } } finally { Loading Loading @@ -7188,7 +7189,7 @@ public class ActivityManagerService extends IActivityManager.Stub ContentProviderRecord localCpr = mProviderMap.getProviderByClass(comp, userId); if (localCpr.hasExternalProcessHandles()) { if (localCpr.removeExternalProcessHandleLocked(token)) { updateOomAdjLocked(); updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_REMOVE_PROVIDER); } else { Slog.e(TAG, "Attmpt to remove content provider " + localCpr + " with no external reference for token: " Loading Loading @@ -7255,7 +7256,7 @@ public class ActivityManagerService extends IActivityManager.Stub dst.setProcess(r); dst.notifyAll(); } updateOomAdjLocked(r, true); updateOomAdjLocked(r, true, OomAdjuster.OOM_ADJ_REASON_GET_PROVIDER); maybeUpdateProviderUsageStatsLocked(r, src.info.packageName, src.info.authority); } Loading Loading @@ -7645,7 +7646,7 @@ public class ActivityManagerService extends IActivityManager.Stub new HostingRecord("added application", customProcess != null ? customProcess : info.processName)); mProcessList.updateLruProcessLocked(app, false, null); updateOomAdjLocked(); updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_PROCESS_BEGIN); } // This package really, really can not be stopped. Loading Loading @@ -7740,7 +7741,7 @@ public class ActivityManagerService extends IActivityManager.Stub mActivityTaskManager.onScreenAwakeChanged(isAwake); mOomAdjProfiler.onWakefulnessChanged(wakefulness); } updateOomAdjLocked(); updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_UI_VISIBILITY); } } Loading Loading @@ -8320,7 +8321,7 @@ public class ActivityManagerService extends IActivityManager.Stub } } if (changed) { updateOomAdjLocked(pr, true); updateOomAdjLocked(pr, true, OomAdjuster.OOM_ADJ_REASON_UI_VISIBILITY); } } } finally { Loading Loading @@ -8350,7 +8351,7 @@ public class ActivityManagerService extends IActivityManager.Stub Slog.i(TAG, "Setting runningRemoteAnimation=" + pr.runningRemoteAnimation + " for pid=" + pid); } updateOomAdjLocked(pr, true); updateOomAdjLocked(pr, true, OomAdjuster.OOM_ADJ_REASON_UI_VISIBILITY); } } Loading Loading @@ -13984,7 +13985,7 @@ public class ActivityManagerService extends IActivityManager.Stub mBackupTargets.put(targetUserId, r); // Try not to kill the process during backup updateOomAdjLocked(proc, true); updateOomAdjLocked(proc, true, OomAdjuster.OOM_ADJ_REASON_NONE); // 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. Loading Loading @@ -14099,7 +14100,7 @@ public class ActivityManagerService extends IActivityManager.Stub // Not backing this app up any more; reset its OOM adjustment final ProcessRecord proc = backupTarget.app; updateOomAdjLocked(proc, true); updateOomAdjLocked(proc, true, OomAdjuster.OOM_ADJ_REASON_NONE); proc.inFullBackup = false; oldBackupUid = backupTarget != null ? backupTarget.appInfo.uid : -1; Loading Loading @@ -14388,7 +14389,7 @@ public class ActivityManagerService extends IActivityManager.Stub // If we actually concluded any broadcasts, we might now be able // to trim the recipients' apps from our working set if (doTrim) { trimApplications(); trimApplications(OomAdjuster.OOM_ADJ_REASON_FINISH_RECEIVER); return; } Loading Loading @@ -15463,7 +15464,7 @@ public class ActivityManagerService extends IActivityManager.Stub r.queue.processNextBroadcastLocked(/*fromMsg=*/ false, /*skipOomAdj=*/ true); } // updateOomAdjLocked() will be done here trimApplicationsLocked(); trimApplicationsLocked(OomAdjuster.OOM_ADJ_REASON_FINISH_RECEIVER); } } finally { Loading Loading @@ -16448,7 +16449,7 @@ public class ActivityManagerService extends IActivityManager.Stub item.foregroundServiceTypes = fgServiceTypes; if (oomAdj) { updateOomAdjLocked(); updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_UI_VISIBILITY); } } } Loading Loading @@ -16496,11 +16497,13 @@ public class ActivityManagerService extends IActivityManager.Stub * @param app The process to update * @param oomAdjAll If it's ok to call updateOomAdjLocked() for all running apps * if necessary, or skip. * @param oomAdjReason * @return whether updateOomAdjLocked(app) was successful. */ @GuardedBy("this") final boolean updateOomAdjLocked(ProcessRecord app, boolean oomAdjAll) { return mOomAdjuster.updateOomAdjLocked(app, oomAdjAll); final boolean updateOomAdjLocked(ProcessRecord app, boolean oomAdjAll, String oomAdjReason) { return mOomAdjuster.updateOomAdjLocked(app, oomAdjAll, oomAdjReason); } static final class ProcStatsRunnable implements Runnable { Loading Loading @@ -16693,8 +16696,8 @@ public class ActivityManagerService extends IActivityManager.Stub } @GuardedBy("this") final void updateOomAdjLocked() { mOomAdjuster.updateOomAdjLocked(); final void updateOomAdjLocked(String oomAdjReason) { mOomAdjuster.updateOomAdjLocked(oomAdjReason); } @Override Loading Loading @@ -16979,14 +16982,14 @@ public class ActivityManagerService extends IActivityManager.Stub mOomAdjuster.setUidTempWhitelistStateLocked(uid, onWhitelist); } final void trimApplications() { final void trimApplications(String oomAdjReason) { synchronized (this) { trimApplicationsLocked(); trimApplicationsLocked(oomAdjReason); } } @GuardedBy("this") final void trimApplicationsLocked() { final void trimApplicationsLocked(String oomAdjReason) { // First remove any unused application processes whose package // has been removed. for (int i = mProcessList.mRemovedProcesses.size() - 1; i >= 0; i--) { Loading Loading @@ -17018,7 +17021,7 @@ public class ActivityManagerService extends IActivityManager.Stub // Now update the oom adj for all processes. Don't skip this, since other callers // might be depending on it. updateOomAdjLocked(); updateOomAdjLocked(oomAdjReason); } /** This method sends the specified signal to each of the persistent apps */ Loading Loading @@ -17627,7 +17630,7 @@ public class ActivityManagerService extends IActivityManager.Stub } pr.setHasOverlayUi(hasOverlayUi); //Slog.i(TAG, "Setting hasOverlayUi=" + pr.hasOverlayUi + " for pid=" + pid); updateOomAdjLocked(pr, true); updateOomAdjLocked(pr, true, OomAdjuster.OOM_ADJ_REASON_UI_VISIBILITY); } } Loading Loading @@ -17784,7 +17787,7 @@ public class ActivityManagerService extends IActivityManager.Stub @Override public void trimApplications() { ActivityManagerService.this.trimApplications(); ActivityManagerService.this.trimApplications(OomAdjuster.OOM_ADJ_REASON_ACTIVITY); } public void killProcessesForRemovedTask(ArrayList<Object> procsToKill) { Loading Loading @@ -17836,7 +17839,7 @@ public class ActivityManagerService extends IActivityManager.Stub @Override public void updateOomAdj() { synchronized (ActivityManagerService.this) { ActivityManagerService.this.updateOomAdjLocked(); ActivityManagerService.this.updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_NONE); } }
services/core/java/com/android/server/am/BroadcastQueue.java +4 −3 Original line number Diff line number Diff line Loading @@ -309,7 +309,7 @@ public final class BroadcastQueue { app.forceProcessStateUpTo(ActivityManager.PROCESS_STATE_RECEIVER); mService.mProcessList.updateLruProcessLocked(app, false, null); if (!skipOomAdj) { mService.updateOomAdjLocked(); mService.updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_NONE); } // Tell the application to launch this receiver. Loading Loading @@ -791,7 +791,8 @@ 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, true); mService.updateOomAdjLocked(r.curApp, true, OomAdjuster.OOM_ADJ_REASON_START_RECEIVER); } } try { Loading Loading @@ -1028,7 +1029,7 @@ public final class BroadcastQueue { // If we had finished the last ordered broadcast, then // make sure all processes have correct oom and sched // adjustments. mService.updateOomAdjLocked(); mService.updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_START_RECEIVER); } // when we have no more ordered broadcast on this queue, stop logging Loading
services/core/java/com/android/server/am/OomAdjuster.java +23 −6 Original line number Diff line number Diff line Loading @@ -90,6 +90,21 @@ import java.util.Arrays; public final class OomAdjuster { private static final String TAG = "OomAdjuster"; static final String OOM_ADJ_REASON_METHOD = "updateOomAdj"; static final String OOM_ADJ_REASON_NONE = OOM_ADJ_REASON_METHOD + "_meh"; static final String OOM_ADJ_REASON_ACTIVITY = OOM_ADJ_REASON_METHOD + "_activityChange"; static final String OOM_ADJ_REASON_FINISH_RECEIVER = OOM_ADJ_REASON_METHOD + "_finishReceiver"; static final String OOM_ADJ_REASON_START_RECEIVER = OOM_ADJ_REASON_METHOD + "_startReceiver"; static final String OOM_ADJ_REASON_BIND_SERVICE = OOM_ADJ_REASON_METHOD + "_bindService"; static final String OOM_ADJ_REASON_UNBIND_SERVICE = OOM_ADJ_REASON_METHOD + "_unbindService"; static final String OOM_ADJ_REASON_START_SERVICE = OOM_ADJ_REASON_METHOD + "_startService"; static final String OOM_ADJ_REASON_GET_PROVIDER = OOM_ADJ_REASON_METHOD + "_getProvider"; static final String OOM_ADJ_REASON_REMOVE_PROVIDER = OOM_ADJ_REASON_METHOD + "_removeProvider"; static final String OOM_ADJ_REASON_UI_VISIBILITY = OOM_ADJ_REASON_METHOD + "_uiVisibility"; static final String OOM_ADJ_REASON_WHITELIST = OOM_ADJ_REASON_METHOD + "_whitelistChange"; static final String OOM_ADJ_REASON_PROCESS_BEGIN = OOM_ADJ_REASON_METHOD + "_processBegin"; static final String OOM_ADJ_REASON_PROCESS_END = OOM_ADJ_REASON_METHOD + "_processEnd"; /** * For some direct access we need to power manager. */ Loading Loading @@ -156,10 +171,12 @@ public final class OomAdjuster { * @param app The process to update * @param oomAdjAll If it's ok to call updateOomAdjLocked() for all running apps * if necessary, or skip. * @param oomAdjReason * @return whether updateOomAdjLocked(app) was successful. */ @GuardedBy("mService") final boolean updateOomAdjLocked(ProcessRecord app, boolean oomAdjAll) { boolean updateOomAdjLocked(ProcessRecord app, boolean oomAdjAll, String oomAdjReason) { final ProcessRecord TOP_APP = mService.getTopAppLocked(); final boolean wasCached = app.cached; Loading @@ -177,7 +194,7 @@ public final class OomAdjuster { && (wasCached != app.cached || app.getCurRawAdj() == ProcessList.UNKNOWN_ADJ)) { // Changed to/from cached state, so apps after it in the LRU // list may also be changed. updateOomAdjLocked(); updateOomAdjLocked(oomAdjReason); } return success; } Loading @@ -195,8 +212,8 @@ public final class OomAdjuster { } @GuardedBy("mService") final void updateOomAdjLocked() { Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "updateOomAdj"); void updateOomAdjLocked(String oomAdjReason) { Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, oomAdjReason); mService.mOomAdjProfiler.oomAdjStarted(); final ProcessRecord TOP_APP = mService.getTopAppLocked(); final long now = SystemClock.uptimeMillis(); Loading Loading @@ -2009,7 +2026,7 @@ public final class OomAdjuster { } } if (changed) { updateOomAdjLocked(); updateOomAdjLocked(OOM_ADJ_REASON_WHITELIST); } } Loading @@ -2019,7 +2036,7 @@ public final class OomAdjuster { final UidRecord uidRec = mActiveUids.get(uid); if (uidRec != null && uidRec.curWhitelist != onWhitelist) { uidRec.curWhitelist = onWhitelist; updateOomAdjLocked(); updateOomAdjLocked(OOM_ADJ_REASON_WHITELIST); } } Loading
services/core/java/com/android/server/am/ProcessList.java +2 −1 Original line number Diff line number Diff line Loading @@ -2227,9 +2227,10 @@ public final class ProcessList { for (AppZygote appZygote : zygotesToKill) { killAppZygoteIfNeededLocked(appZygote); } mService.updateOomAdjLocked(); mService.updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_PROCESS_END); return N > 0; } @GuardedBy("mService") boolean removeProcessLocked(ProcessRecord app, boolean callerWillRestart, boolean allowRestart, String reason) { Loading