diff options
| author | 2019-04-17 15:43:01 +0000 | |
|---|---|---|
| committer | 2019-04-17 15:43:01 +0000 | |
| commit | 0ba84f8f24dc14850ff7fc7e512b52ff1d6d1ac1 (patch) | |
| tree | aff5ef17ed7d4ace007af2a234dc0efb01745df5 | |
| parent | 00202de30e4691421835e979f8e285eb7f7a93c3 (diff) | |
| parent | d2775cd459e01da4204540154b65b3d678932495 (diff) | |
Merge "Include oom_adjust reason in trace" into qt-dev
6 files changed, 77 insertions, 51 deletions
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index 4ec90ba5b803..0271354b3fff 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -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 @@ -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); @@ -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 { @@ -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) { @@ -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, @@ -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 " @@ -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. @@ -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) { diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 3b6b404170c5..cdcd9e1ad58c 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -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( @@ -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); @@ -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); @@ -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"); } @@ -5485,7 +5485,7 @@ public class ActivityManagerService extends IActivityManager.Stub synchronized (this) { mConstants.setOverrideMaxCachedProcesses(max); } - trimApplications(); + trimApplications(OomAdjuster.OOM_ADJ_REASON_PROCESS_END); } @Override @@ -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); } } @@ -5557,7 +5557,7 @@ public class ActivityManagerService extends IActivityManager.Stub } if (changed) { - updateOomAdjLocked(); + updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_UI_VISIBILITY); } } } @@ -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 @@ -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 { @@ -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: " @@ -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); } @@ -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. @@ -7740,7 +7741,7 @@ public class ActivityManagerService extends IActivityManager.Stub mActivityTaskManager.onScreenAwakeChanged(isAwake); mOomAdjProfiler.onWakefulnessChanged(wakefulness); } - updateOomAdjLocked(); + updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_UI_VISIBILITY); } } @@ -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 { @@ -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); } } @@ -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. @@ -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; @@ -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; } @@ -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 { @@ -16448,7 +16449,7 @@ public class ActivityManagerService extends IActivityManager.Stub item.foregroundServiceTypes = fgServiceTypes; if (oomAdj) { - updateOomAdjLocked(); + updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_UI_VISIBILITY); } } } @@ -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 { @@ -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 @@ -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--) { @@ -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 */ @@ -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); } } @@ -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) { @@ -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); } } diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java index 3c57c3bcb7d6..ee9b5614584f 100644 --- a/services/core/java/com/android/server/am/BroadcastQueue.java +++ b/services/core/java/com/android/server/am/BroadcastQueue.java @@ -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. @@ -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 { @@ -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 diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java index 44d435f2b539..8ae7c7d3e0c8 100644 --- a/services/core/java/com/android/server/am/OomAdjuster.java +++ b/services/core/java/com/android/server/am/OomAdjuster.java @@ -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. */ @@ -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; @@ -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; } @@ -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(); @@ -2009,7 +2026,7 @@ public final class OomAdjuster { } } if (changed) { - updateOomAdjLocked(); + updateOomAdjLocked(OOM_ADJ_REASON_WHITELIST); } } @@ -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); } } diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java index 0a926f9a801a..316368a52ce2 100644 --- a/services/core/java/com/android/server/am/ProcessList.java +++ b/services/core/java/com/android/server/am/ProcessList.java @@ -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) { diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java index 933f41c47167..49930c1f4d62 100644 --- a/services/core/java/com/android/server/am/ProcessRecord.java +++ b/services/core/java/com/android/server/am/ProcessRecord.java @@ -1301,7 +1301,7 @@ class ProcessRecord implements WindowProcessListener { } mService.mProcessList.updateLruProcessLocked(this, activityChange, null /* client */); if (updateOomAdj) { - mService.updateOomAdjLocked(); + mService.updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_ACTIVITY); } } } |