diff options
| author | 2020-10-29 00:20:50 +0800 | |
|---|---|---|
| committer | 2020-10-30 22:36:20 +0800 | |
| commit | 1add173dda5f743a1491b1338c6313040dd3ce04 (patch) | |
| tree | 7e5d9ea12876ce69ef6e3f3d083e2af32004a841 | |
| parent | f2d1d264793831f07b689e534366fb55f12174cc (diff) | |
Store the existence of home and previous process
WindowProcessController can already know whether there is a home
or previous process. Though a refresh of the states require a
full oom-adj update, trimApplicationsLocked and appDiedLocked
should be frequently enough to update.
This removes potential lock contention when memFactor becomes
not ADJ_MEM_FACTOR_NORMAL when updating oom-adj. This also
reduces the dependency of internal interface across packages.
Bug: 159104503
Bug: 171989664
Test: Launch several apps and run memeater to trigger low mem.
Check the output of "adb shell dumpsys activity processes"
and set break point at AppProfiler to observe the values.
Change-Id: I2fe0eeccdde3ea687ce0d5d856beb3aee886c185
5 files changed, 18 insertions, 23 deletions
diff --git a/services/core/java/com/android/server/am/AppProfiler.java b/services/core/java/com/android/server/am/AppProfiler.java index 5e59a35fc4ee..cace260c3c26 100644 --- a/services/core/java/com/android/server/am/AppProfiler.java +++ b/services/core/java/com/android/server/am/AppProfiler.java @@ -247,6 +247,9 @@ public class AppProfiler { private int mMemWatchDumpUid; private boolean mMemWatchIsUserInitiated; + boolean mHasHomeProcess; + boolean mHasPreviousProcess; + /** * Used to collect per-process CPU use for ANRs, battery stats, etc. * Must acquire this object's lock when accessing it. @@ -961,8 +964,8 @@ public class AppProfiler { } int factor = numTrimming / 3; int minFactor = 2; - if (mService.mAtmInternal.getHomeProcess() != null) minFactor++; - if (mService.mAtmInternal.getPreviousProcess() != null) minFactor++; + if (mHasHomeProcess) minFactor++; + if (mHasPreviousProcess) minFactor++; if (factor < minFactor) factor = minFactor; int curLevel = ComponentCallbacks2.TRIM_MEMORY_COMPLETE; for (int i = 0; i < numOfLru; i++) { diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java index 9d49236191a9..01d0a6dec81a 100644 --- a/services/core/java/com/android/server/am/OomAdjuster.java +++ b/services/core/java/com/android/server/am/OomAdjuster.java @@ -500,6 +500,7 @@ public final class OomAdjuster { final ProcessRecord topApp = mService.getTopAppLocked(); // Clear any pending ones because we are doing a full update now. mPendingProcessSet.clear(); + mService.mAppProfiler.mHasPreviousProcess = mService.mAppProfiler.mHasHomeProcess = false; updateOomAdjLockedInner(oomAdjReason, topApp , null, null, true, true); } diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java index ccdd6a746239..463ba6d3d5ee 100644 --- a/services/core/java/com/android/server/am/ProcessRecord.java +++ b/services/core/java/com/android/server/am/ProcessRecord.java @@ -1875,16 +1875,24 @@ class ProcessRecord implements WindowProcessListener { boolean getCachedIsHomeProcess() { if (mCachedIsHomeProcess == VALUE_INVALID) { - mCachedIsHomeProcess = getWindowProcessController().isHomeProcess() - ? VALUE_TRUE : VALUE_FALSE; + if (getWindowProcessController().isHomeProcess()) { + mCachedIsHomeProcess = VALUE_TRUE; + mService.mAppProfiler.mHasHomeProcess = true; + } else { + mCachedIsHomeProcess = VALUE_FALSE; + } } return mCachedIsHomeProcess == VALUE_TRUE; } boolean getCachedIsPreviousProcess() { if (mCachedIsPreviousProcess == VALUE_INVALID) { - mCachedIsPreviousProcess = getWindowProcessController().isPreviousProcess() - ? VALUE_TRUE : VALUE_FALSE; + if (getWindowProcessController().isPreviousProcess()) { + mCachedIsPreviousProcess = VALUE_TRUE; + mService.mAppProfiler.mHasPreviousProcess = true; + } else { + mCachedIsPreviousProcess = VALUE_FALSE; + } } return mCachedIsPreviousProcess == VALUE_TRUE; } diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java index c7d716d8290a..7ce8821e90f6 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java @@ -533,9 +533,6 @@ public abstract class ActivityTaskManagerInternal { /** Flush recent tasks to disk. */ public abstract void flushRecentTasks(); - public abstract WindowProcessController getHomeProcess(); - public abstract WindowProcessController getPreviousProcess(); - public abstract void clearLockedTasks(String reason); public abstract void updateUserConfiguration(); public abstract boolean canShowErrorDialogs(); diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index a02701f8ad00..12c677f978aa 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -7362,20 +7362,6 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } @Override - public WindowProcessController getHomeProcess() { - synchronized (mGlobalLock) { - return mHomeProcess; - } - } - - @Override - public WindowProcessController getPreviousProcess() { - synchronized (mGlobalLock) { - return mPreviousProcess; - } - } - - @Override public void clearLockedTasks(String reason) { synchronized (mGlobalLock) { getLockTaskController().clearLockedTasks(reason); |