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
diff --git a/services/core/java/com/android/server/am/AppProfiler.java b/services/core/java/com/android/server/am/AppProfiler.java
index 5e59a35..cace260 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 @@
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 @@
}
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 9d49236..01d0a6d 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 @@
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 ccdd6a7..463ba6d 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 @@
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 c7d716d82..7ce8821 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 @@
/** 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 a02701f..12c677f 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 @@
}
@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);