summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/am/OomAdjuster.java12
-rw-r--r--services/core/java/com/android/server/am/PhantomProcessList.java42
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java2
3 files changed, 43 insertions, 13 deletions
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
index 8d16eb5fc95a..42966a347aec 100644
--- a/services/core/java/com/android/server/am/OomAdjuster.java
+++ b/services/core/java/com/android/server/am/OomAdjuster.java
@@ -78,7 +78,6 @@ import static android.os.Process.THREAD_GROUP_RESTRICTED;
import static android.os.Process.THREAD_GROUP_TOP_APP;
import static android.os.Process.THREAD_PRIORITY_DISPLAY;
import static android.os.Process.THREAD_PRIORITY_TOP_APP_BOOST;
-import static android.os.Process.setProcessGroup;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_ALL;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_BACKUP;
@@ -526,7 +525,7 @@ public class OomAdjuster {
+ msg.obj + " to " + group);
}
try {
- setProcessGroup(pid, group);
+ android.os.Process.setProcessGroup(pid, group);
} catch (Exception e) {
if (DEBUG_ALL) {
Slog.w(TAG, "Failed setting process group of " + pid + " to " + group, e);
@@ -544,6 +543,11 @@ public class OomAdjuster {
/ CACHED_APP_IMPORTANCE_LEVELS;
}
+ void setProcessGroup(int pid, int group, String processName) {
+ mProcessGroupHandler.sendMessage(mProcessGroupHandler.obtainMessage(
+ 0 /* unused */, pid, group, processName));
+ }
+
void initSettings() {
mCachedAppOptimizer.init();
mCacheOomRanker.init(ActivityThread.currentApplication().getMainExecutor());
@@ -3491,8 +3495,8 @@ public class OomAdjuster {
processGroup = THREAD_GROUP_DEFAULT;
break;
}
- mProcessGroupHandler.sendMessage(mProcessGroupHandler.obtainMessage(
- 0 /* unused */, app.getPid(), processGroup, app.processName));
+ setProcessGroup(app.getPid(), processGroup, app.processName);
+ mService.mPhantomProcessList.setProcessGroupForPhantomProcessOfApp(app, processGroup);
try {
final int renderThreadTid = app.getRenderThreadTid();
if (curSchedGroup == SCHED_GROUP_TOP_APP) {
diff --git a/services/core/java/com/android/server/am/PhantomProcessList.java b/services/core/java/com/android/server/am/PhantomProcessList.java
index 2ec1aedd18f9..bfdced77a1b3 100644
--- a/services/core/java/com/android/server/am/PhantomProcessList.java
+++ b/services/core/java/com/android/server/am/PhantomProcessList.java
@@ -514,6 +514,15 @@ public final class PhantomProcessList {
app.killLocked("Caused by child process: " + msg, reasonCode, subReason, true);
}
+ @GuardedBy("mLock")
+ private SparseArray<PhantomProcessRecord> getPhantomProcessOfAppLocked(ProcessRecord app) {
+ int index = mAppPhantomProcessMap.indexOfKey(app.getPid());
+ if (index >= 0) {
+ return mAppPhantomProcessMap.valueAt(index);
+ }
+ return null;
+ }
+
/**
* Iterate all phantom process belonging to the given app, and invokve callback
* for each of them.
@@ -521,20 +530,35 @@ public final class PhantomProcessList {
void forEachPhantomProcessOfApp(final ProcessRecord app,
final Function<PhantomProcessRecord, Boolean> callback) {
synchronized (mLock) {
- int index = mAppPhantomProcessMap.indexOfKey(app.getPid());
- if (index >= 0) {
- final SparseArray<PhantomProcessRecord> array =
- mAppPhantomProcessMap.valueAt(index);
- for (int i = array.size() - 1; i >= 0; i--) {
- final PhantomProcessRecord r = array.valueAt(i);
- if (!callback.apply(r)) {
- break;
- }
+ final SparseArray<PhantomProcessRecord> array = getPhantomProcessOfAppLocked(app);
+ if (array == null) {
+ return;
+ }
+ for (int i = array.size() - 1; i >= 0; i--) {
+ final PhantomProcessRecord r = array.valueAt(i);
+ if (!callback.apply(r)) {
+ break;
}
}
}
}
+ /**
+ * Set process group of phantom process belonging to the given app.
+ */
+ void setProcessGroupForPhantomProcessOfApp(final ProcessRecord app, final int group) {
+ synchronized (mLock) {
+ final SparseArray<PhantomProcessRecord> array = getPhantomProcessOfAppLocked(app);
+ if (array == null) {
+ return;
+ }
+ for (int i = array.size() - 1; i >= 0; i--) {
+ final PhantomProcessRecord r = array.valueAt(i);
+ mService.mOomAdjuster.setProcessGroup(r.mPid, group, r.mProcessName);
+ }
+ }
+ }
+
@GuardedBy("tracker")
void updateProcessCpuStatesLocked(ProcessCpuTracker tracker) {
synchronized (mLock) {
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 6ab72cd33042..b0053581963a 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java
@@ -228,6 +228,8 @@ public class MockingOomAdjusterTests {
mock(BatteryStatsService.class));
setFieldValue(ActivityManagerService.class, mService, "mInjector",
new ActivityManagerService.Injector(mContext));
+ setFieldValue(ActivityManagerService.class, mService, "mPhantomProcessList",
+ new PhantomProcessList(mService));
doReturn(mock(AppOpsManager.class)).when(mService).getAppOpsManager();
doCallRealMethod().when(mService).enqueueOomAdjTargetLocked(any(ProcessRecord.class));
doCallRealMethod().when(mService).updateOomAdjPendingTargetsLocked(OOM_ADJ_REASON_ACTIVITY);