Merge changes I49d02362,I8cdf96ed

* changes:
  Change CacheOomRanker's "uses" feature.
  Fix race condition when using mPreserveTopNApps.
This commit is contained in:
Misha Wagner
2021-08-27 11:18:49 +00:00
committed by Android (Google) Code Review
4 changed files with 22 additions and 15 deletions

View File

@@ -771,6 +771,11 @@ public class ActivityManager {
return procState >= PROCESS_STATE_TRANSIENT_BACKGROUND;
}
/** @hide Should this process state be considered in the cache? */
public static final boolean isProcStateCached(int procState) {
return procState >= PROCESS_STATE_CACHED_ACTIVITY;
}
/** @hide Is this a foreground service type? */
public static boolean isForegroundService(int procState) {
return procState == PROCESS_STATE_FOREGROUND_SERVICE;

View File

@@ -243,6 +243,7 @@ public class CacheOomRanker {
float lruWeight;
float usesWeight;
float rssWeight;
int preserveTopNApps;
int[] lruPositions;
RankedProcessRecord[] scoredProcessRecords;
@@ -250,6 +251,7 @@ public class CacheOomRanker {
lruWeight = mLruWeight;
usesWeight = mUsesWeight;
rssWeight = mRssWeight;
preserveTopNApps = mPreserveTopNApps;
lruPositions = mLruPositions;
scoredProcessRecords = mScoredProcessRecords;
}
@@ -276,19 +278,19 @@ public class CacheOomRanker {
++numProcessesEvaluated;
}
// Count how many apps we're not re-ranking (up to mPreserveTopNApps).
// Count how many apps we're not re-ranking (up to preserveTopNApps).
int numProcessesNotReRanked = 0;
while (numProcessesEvaluated < lruProcessServiceStart
&& numProcessesNotReRanked < mPreserveTopNApps) {
&& numProcessesNotReRanked < preserveTopNApps) {
ProcessRecord process = lruList.get(numProcessesEvaluated);
if (appCanBeReRanked(process)) {
numProcessesNotReRanked++;
}
numProcessesEvaluated++;
}
// Exclude the top `mPreserveTopNApps` apps from re-ranking.
if (numProcessesNotReRanked < mPreserveTopNApps) {
numProcessesReRanked -= mPreserveTopNApps - numProcessesNotReRanked;
// Exclude the top `preserveTopNApps` apps from re-ranking.
if (numProcessesNotReRanked < preserveTopNApps) {
numProcessesReRanked -= preserveTopNApps - numProcessesNotReRanked;
if (numProcessesReRanked < 0) {
numProcessesReRanked = 0;
}

View File

@@ -622,6 +622,10 @@ final class ProcessStateRecord {
@GuardedBy({"mService", "mProcLock"})
void setSetProcState(int setProcState) {
if (ActivityManager.isProcStateCached(mSetProcState)
&& !ActivityManager.isProcStateCached(setProcState)) {
mCacheOomRankerUseCount++;
}
mSetProcState = setProcState;
}
@@ -885,12 +889,7 @@ final class ProcessStateRecord {
@GuardedBy("mService")
void setCached(boolean cached) {
if (mCached != cached) {
mCached = cached;
if (cached) {
++mCacheOomRankerUseCount;
}
}
mCached = cached;
}
@GuardedBy("mService")

View File

@@ -24,6 +24,7 @@ import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import android.app.ActivityManager;
import android.app.IApplicationThread;
import android.content.ComponentName;
import android.content.Context;
@@ -581,7 +582,7 @@ public class CacheOomRankerTest {
}
private ProcessRecord nextProcessRecord(int setAdj, long lastActivityTime, long lastRss,
int returnedToCacheCount) {
int wentToForegroundCount) {
ApplicationInfo ai = new ApplicationInfo();
ai.packageName = "a.package.name" + mNextPackageName++;
ProcessRecord app = new ProcessRecord(mAms, ai, ai.packageName + ":process", mNextUid++);
@@ -593,9 +594,9 @@ public class CacheOomRankerTest {
app.setLastActivityTime(lastActivityTime);
app.mProfile.setLastRss(lastRss);
app.mState.setCached(false);
for (int i = 0; i < returnedToCacheCount; ++i) {
app.mState.setCached(false);
app.mState.setCached(true);
for (int i = 0; i < wentToForegroundCount; ++i) {
app.mState.setSetProcState(ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
app.mState.setSetProcState(ActivityManager.PROCESS_STATE_CACHED_RECENT);
}
// Sets the thread returned by ProcessRecord#getThread, which we use to check whether the
// app is currently launching.