summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/am/ActiveServices.java22
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java65
-rw-r--r--services/core/java/com/android/server/am/BroadcastQueue.java7
-rw-r--r--services/core/java/com/android/server/am/OomAdjuster.java29
-rw-r--r--services/core/java/com/android/server/am/ProcessList.java3
-rw-r--r--services/core/java/com/android/server/am/ProcessRecord.java2
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 f0982d3aa142..d965434fb798 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);
@@ -2669,7 +2670,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 {
@@ -2790,7 +2791,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) {
@@ -2916,7 +2917,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,
@@ -3031,7 +3033,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 "
@@ -3136,7 +3139,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.
@@ -3289,7 +3293,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 0b9e3bb1b99e..7d9cf1432e91 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -1971,7 +1971,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(
@@ -2455,7 +2455,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);
@@ -3633,7 +3633,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);
@@ -5000,7 +5000,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
if (!didSomething) {
- updateOomAdjLocked();
+ updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_PROCESS_BEGIN);
checkTime(startTime, "attachApplicationLocked: after updateOomAdjLocked");
}
@@ -5483,7 +5483,7 @@ public class ActivityManagerService extends IActivityManager.Stub
synchronized (this) {
mConstants.setOverrideMaxCachedProcesses(max);
}
- trimApplications();
+ trimApplications(OomAdjuster.OOM_ADJ_REASON_PROCESS_END);
}
@Override
@@ -5509,7 +5509,7 @@ public class ActivityManagerService extends IActivityManager.Stub
pr.forcingToImportant = null;
updateProcessForegroundLocked(pr, false, 0, false);
}
- updateOomAdjLocked();
+ updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_UI_VISIBILITY);
}
}
@@ -5555,7 +5555,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
if (changed) {
- updateOomAdjLocked();
+ updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_UI_VISIBILITY);
}
}
}
@@ -6712,7 +6712,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
@@ -7144,7 +7145,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 {
@@ -7185,7 +7186,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: "
@@ -7252,7 +7253,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);
}
@@ -7640,7 +7641,7 @@ public class ActivityManagerService extends IActivityManager.Stub
if (app == null) {
app = mProcessList.newProcessRecordLocked(info, customProcess, isolated, 0, false);
mProcessList.updateLruProcessLocked(app, false, null);
- updateOomAdjLocked();
+ updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_PROCESS_BEGIN);
}
// This package really, really can not be stopped.
@@ -7735,7 +7736,7 @@ public class ActivityManagerService extends IActivityManager.Stub
mActivityTaskManager.onScreenAwakeChanged(isAwake);
mOomAdjProfiler.onWakefulnessChanged(wakefulness);
}
- updateOomAdjLocked();
+ updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_UI_VISIBILITY);
}
}
@@ -8315,7 +8316,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
if (changed) {
- updateOomAdjLocked(pr, true);
+ updateOomAdjLocked(pr, true, OomAdjuster.OOM_ADJ_REASON_UI_VISIBILITY);
}
}
} finally {
@@ -8345,7 +8346,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);
}
}
@@ -13975,7 +13976,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.
@@ -14090,7 +14091,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;
@@ -14379,7 +14380,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;
}
@@ -15454,7 +15455,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 {
@@ -16439,7 +16440,7 @@ public class ActivityManagerService extends IActivityManager.Stub
item.foregroundServiceTypes = fgServiceTypes;
if (oomAdj) {
- updateOomAdjLocked();
+ updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_UI_VISIBILITY);
}
}
}
@@ -16487,11 +16488,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 {
@@ -16684,8 +16687,8 @@ public class ActivityManagerService extends IActivityManager.Stub
}
@GuardedBy("this")
- final void updateOomAdjLocked() {
- mOomAdjuster.updateOomAdjLocked();
+ final void updateOomAdjLocked(String oomAdjReason) {
+ mOomAdjuster.updateOomAdjLocked(oomAdjReason);
}
@Override
@@ -16970,14 +16973,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--) {
@@ -17009,7 +17012,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 */
@@ -17618,7 +17621,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);
}
}
@@ -17775,7 +17778,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) {
@@ -17827,7 +17830,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 4bfbb78e4187..438a367a8280 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 f1f40d49ccd1..48186f82c5ca 100644
--- a/services/core/java/com/android/server/am/ProcessList.java
+++ b/services/core/java/com/android/server/am/ProcessList.java
@@ -2200,9 +2200,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 ce13cd88a192..1fc82abc6246 100644
--- a/services/core/java/com/android/server/am/ProcessRecord.java
+++ b/services/core/java/com/android/server/am/ProcessRecord.java
@@ -1312,7 +1312,7 @@ class ProcessRecord implements WindowProcessListener {
mService.mProcessList.updateLruProcessLocked(this, activityChange, null);
}
if (updateOomAdj) {
- mService.updateOomAdjLocked();
+ mService.updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_ACTIVITY);
}
}
}