diff options
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); |