Merge changes from topic "cherrypicker-L09000000959180098:N55700001348327156" into udc-dev

* changes:
  Add debug support for native compactions
  Simplify debug command to force compactions
  Disable file compaction by default
  Remove some no longer used compaction variables
This commit is contained in:
Edgar Arriaga García
2023-03-17 16:37:49 +00:00
committed by Android (Google) Code Review
3 changed files with 121 additions and 187 deletions

View File

@@ -1066,16 +1066,26 @@ final class ActivityManagerShellCommand extends ShellCommand {
}
@NeverCompile
int runCompact(PrintWriter pw) {
int runCompact(PrintWriter pw) throws RemoteException {
ProcessRecord app;
String op = getNextArgRequired();
boolean isFullCompact = op.equals("full");
boolean isSomeCompact = op.equals("some");
if (isFullCompact || isSomeCompact) {
String processName = getNextArgRequired();
String uid = getNextArgRequired();
synchronized (mInternal.mProcLock) {
app = mInternal.getProcessRecordLocked(processName, Integer.parseInt(uid));
// Default to current user
int userId = mInterface.getCurrentUserId();
String userOpt = getNextOption();
if (userOpt != null && "--user".equals(userOpt)) {
int inputUserId = UserHandle.parseUserArg(getNextArgRequired());
if (inputUserId != UserHandle.USER_CURRENT) {
userId = inputUserId;
}
}
final int uid =
mInternal.getPackageManagerInternal().getPackageUid(processName, 0, userId);
app = mInternal.getProcessRecordLocked(processName, uid);
}
pw.println("Process record found pid: " + app.mPid);
if (isFullCompact) {
@@ -1101,6 +1111,28 @@ final class ActivityManagerShellCommand extends ShellCommand {
mInternal.mOomAdjuster.mCachedAppOptimizer.compactAllSystem();
}
pw.println("Finished system compaction");
} else if (op.equals("native")) {
op = getNextArgRequired();
isFullCompact = op.equals("full");
isSomeCompact = op.equals("some");
int pid;
String pidStr = getNextArgRequired();
try {
pid = Integer.parseInt(pidStr);
} catch (Exception e) {
getErrPrintWriter().println("Error: failed to parse '" + pidStr + "' as a PID");
return -1;
}
if (isFullCompact) {
mInternal.mOomAdjuster.mCachedAppOptimizer.compactNative(
CachedAppOptimizer.CompactProfile.FULL, pid);
} else if (isSomeCompact) {
mInternal.mOomAdjuster.mCachedAppOptimizer.compactNative(
CachedAppOptimizer.CompactProfile.SOME, pid);
} else {
getErrPrintWriter().println("Error: unknown compaction type '" + op + "'");
return -1;
}
} else {
getErrPrintWriter().println("Error: unknown compact command '" + op + "'");
return -1;
@@ -4018,11 +4050,17 @@ final class ActivityManagerShellCommand extends ShellCommand {
pw.println(" --allow-background-activity-starts: The receiver may start activities");
pw.println(" even if in the background.");
pw.println(" --async: Send without waiting for the completion of the receiver.");
pw.println(" compact [some|full|system] <process_name> <Package UID>");
pw.println(" Force process compaction.");
pw.println(" compact [some|full] <process_name> [--user <USER_ID>]");
pw.println(" Perform a single process compaction.");
pw.println(" some: execute file compaction.");
pw.println(" full: execute anon + file compaction.");
pw.println(" system: system compaction.");
pw.println(" compact system");
pw.println(" Perform a full system compaction.");
pw.println(" compact native [some|full] <pid>");
pw.println(" Perform a native compaction for process with <pid>.");
pw.println(" some: execute file compaction.");
pw.println(" full: execute anon + file compaction.");
pw.println(" instrument [-r] [-e <NAME> <VALUE>] [-p <FILE>] [-w]");
pw.println(" [--user <USER_ID> | current]");
pw.println(" [--no-hidden-api-checks [--no-test-api-access]]");

View File

@@ -66,8 +66,6 @@ public final class CachedAppOptimizer {
// Flags stored in the DeviceConfig API.
@VisibleForTesting static final String KEY_USE_COMPACTION = "use_compaction";
@VisibleForTesting static final String KEY_USE_FREEZER = "use_freezer";
@VisibleForTesting static final String KEY_COMPACT_ACTION_1 = "compact_action_1";
@VisibleForTesting static final String KEY_COMPACT_ACTION_2 = "compact_action_2";
@VisibleForTesting static final String KEY_COMPACT_THROTTLE_1 = "compact_throttle_1";
@VisibleForTesting static final String KEY_COMPACT_THROTTLE_2 = "compact_throttle_2";
@VisibleForTesting static final String KEY_COMPACT_THROTTLE_3 = "compact_throttle_3";
@@ -99,15 +97,6 @@ public final class CachedAppOptimizer {
private static final int RSS_ANON_INDEX = 2;
private static final int RSS_SWAP_INDEX = 3;
// Phenotype sends int configurations and we map them to the strings we'll use on device,
// preventing a weird string value entering the kernel.
private static final int COMPACT_ACTION_NONE = 0;
private static final int COMPACT_ACTION_FILE = 1;
private static final int COMPACT_ACTION_ANON = 2;
private static final int COMPACT_ACTION_ALL = 3;
private static final String COMPACT_ACTION_STRING[] = {"", "file", "anon", "all"};
// Keeps these flags in sync with services/core/jni/com_android_server_am_CachedAppOptimizer.cpp
private static final int COMPACT_ACTION_FILE_FLAG = 1;
private static final int COMPACT_ACTION_ANON_FLAG = 2;
@@ -117,11 +106,11 @@ public final class CachedAppOptimizer {
private static final int FREEZE_BINDER_TIMEOUT_MS = 100;
@VisibleForTesting static final boolean ENABLE_FILE_COMPACT = false;
// Defaults for phenotype flags.
@VisibleForTesting static final Boolean DEFAULT_USE_COMPACTION = true;
@VisibleForTesting static final Boolean DEFAULT_USE_FREEZER = true;
@VisibleForTesting static final int DEFAULT_COMPACT_ACTION_2 = COMPACT_ACTION_ALL;
@VisibleForTesting static final int DEFAULT_COMPACT_ACTION_1 = COMPACT_ACTION_FILE;
@VisibleForTesting static final long DEFAULT_COMPACT_THROTTLE_1 = 5_000;
@VisibleForTesting static final long DEFAULT_COMPACT_THROTTLE_2 = 10_000;
@VisibleForTesting static final long DEFAULT_COMPACT_THROTTLE_3 = 500;
@@ -156,22 +145,15 @@ public final class CachedAppOptimizer {
@VisibleForTesting
interface ProcessDependencies {
long[] getRss(int pid);
void performCompaction(CompactAction action, int pid) throws IOException;
void performCompaction(CompactProfile action, int pid) throws IOException;
}
// This indicates the compaction we want to perform
public enum CompactProfile {
SOME, // File compaction
FULL // File+anon compaction
}
// Low level actions that can be performed for compaction
// currently determined by the compaction profile
public enum CompactAction {
NONE, // No compaction
FILE, // File+anon compaction
ANON,
ALL
SOME, // File compaction
ANON, // Anon compaction
FULL // File+anon compaction
}
// This indicates the process OOM memory state that initiated the compaction request
@@ -187,6 +169,7 @@ public final class CachedAppOptimizer {
static final int COMPACT_SYSTEM_MSG = 2;
static final int SET_FROZEN_PROCESS_MSG = 3;
static final int REPORT_UNFREEZE_MSG = 4;
static final int COMPACT_NATIVE_MSG = 5;
// When free swap falls below this percentage threshold any full (file + anon)
// compactions will be downgraded to file only compactions to reduce pressure
@@ -240,9 +223,6 @@ public final class CachedAppOptimizer {
for (String name : properties.getKeyset()) {
if (KEY_USE_COMPACTION.equals(name)) {
updateUseCompaction();
} else if (KEY_COMPACT_ACTION_1.equals(name)
|| KEY_COMPACT_ACTION_2.equals(name)) {
updateCompactionActions();
} else if (KEY_COMPACT_THROTTLE_1.equals(name)
|| KEY_COMPACT_THROTTLE_2.equals(name)
|| KEY_COMPACT_THROTTLE_3.equals(name)
@@ -314,12 +294,6 @@ public final class CachedAppOptimizer {
// Configured by phenotype. Updates from the server take effect immediately.
@GuardedBy("mPhenotypeFlagLock")
@VisibleForTesting
volatile CompactAction mCompactActionSome = compactActionIntToAction(DEFAULT_COMPACT_ACTION_1);
@GuardedBy("mPhenotypeFlagLock")
@VisibleForTesting
volatile CompactAction mCompactActionFull = compactActionIntToAction(DEFAULT_COMPACT_ACTION_2);
@GuardedBy("mPhenotypeFlagLock")
@VisibleForTesting volatile long mCompactThrottleSomeSome = DEFAULT_COMPACT_THROTTLE_1;
@GuardedBy("mPhenotypeFlagLock")
@VisibleForTesting volatile long mCompactThrottleSomeFull = DEFAULT_COMPACT_THROTTLE_2;
@@ -542,7 +516,6 @@ public final class CachedAppOptimizer {
CACHED_APP_FREEZER_ENABLED_URI, false, mSettingsObserver);
synchronized (mPhenotypeFlagLock) {
updateUseCompaction();
updateCompactionActions();
updateCompactionThrottles();
updateCompactStatsdSampleRate();
updateFreezerStatsdSampleRate();
@@ -587,8 +560,6 @@ public final class CachedAppOptimizer {
pw.println("CachedAppOptimizer settings");
synchronized (mPhenotypeFlagLock) {
pw.println(" " + KEY_USE_COMPACTION + "=" + mUseCompaction);
pw.println(" " + KEY_COMPACT_ACTION_1 + "=" + mCompactActionSome);
pw.println(" " + KEY_COMPACT_ACTION_2 + "=" + mCompactActionFull);
pw.println(" " + KEY_COMPACT_THROTTLE_1 + "=" + mCompactThrottleSomeSome);
pw.println(" " + KEY_COMPACT_THROTTLE_2 + "=" + mCompactThrottleSomeFull);
pw.println(" " + KEY_COMPACT_THROTTLE_3 + "=" + mCompactThrottleFullSome);
@@ -761,19 +732,9 @@ public final class CachedAppOptimizer {
return false;
}
private CompactAction resolveCompactActionForProfile(CompactProfile profile) {
CompactAction action;
switch (profile) {
case SOME:
action = CompactAction.FILE;
break;
case FULL:
action = CompactAction.ALL;
break;
default:
action = CompactAction.NONE;
}
return action;
void compactNative(CompactProfile compactProfile, int pid) {
mCompactionHandler.sendMessage(mCompactionHandler.obtainMessage(
COMPACT_NATIVE_MSG, pid, compactProfile.ordinal()));
}
private AggregatedProcessCompactionStats getPerProcessAggregatedCompactStat(
@@ -1050,18 +1011,6 @@ public final class CachedAppOptimizer {
});
}
@GuardedBy("mPhenotypeFlagLock")
private void updateCompactionActions() {
int compactAction1 = DeviceConfig.getInt(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
KEY_COMPACT_ACTION_1, DEFAULT_COMPACT_ACTION_1);
int compactAction2 = DeviceConfig.getInt(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
KEY_COMPACT_ACTION_2, DEFAULT_COMPACT_ACTION_2);
mCompactActionSome = compactActionIntToAction(compactAction1);
mCompactActionFull = compactActionIntToAction(compactAction2);
}
@GuardedBy("mPhenotypeFlagLock")
private void updateCompactionThrottles() {
boolean useThrottleDefaults = false;
@@ -1235,14 +1184,6 @@ public final class CachedAppOptimizer {
return true;
}
static CompactAction compactActionIntToAction(int action) {
if (action < 0 || action >= CompactAction.values().length) {
return CompactAction.NONE;
}
return CompactAction.values()[action];
}
// This will ensure app will be out of the freezer for at least mFreezerDebounceTimeout.
@GuardedBy("mAm")
void unfreezeTemporarily(ProcessRecord app, @OomAdjuster.OomAdjReason int reason) {
@@ -1475,8 +1416,10 @@ public final class CachedAppOptimizer {
if (oldAdj <= ProcessList.PERCEPTIBLE_APP_ADJ
&& (newAdj == ProcessList.PREVIOUS_APP_ADJ || newAdj == ProcessList.HOME_APP_ADJ)) {
// Perform a minor compaction when a perceptible app becomes the prev/home app
compactApp(app, CompactProfile.SOME, CompactSource.APP, false);
if (ENABLE_FILE_COMPACT) {
// Perform a minor compaction when a perceptible app becomes the prev/home app
compactApp(app, CompactProfile.SOME, CompactSource.APP, false);
}
} else if (oldAdj < ProcessList.CACHED_APP_MIN_ADJ
&& newAdj >= ProcessList.CACHED_APP_MIN_ADJ
&& newAdj <= ProcessList.CACHED_APP_MAX_ADJ) {
@@ -1486,23 +1429,37 @@ public final class CachedAppOptimizer {
}
/**
* Applies a compaction downgrade when swap is low.
* Computes the final compaction profile to be used which depends on compaction
* features enabled and swap usage.
*/
CompactProfile downgradeCompactionIfRequired(CompactProfile profile) {
// Downgrade compaction under swap memory pressure
CompactProfile resolveCompactionProfile(CompactProfile profile) {
if (profile == CompactProfile.FULL) {
double swapFreePercent = getFreeSwapPercent();
// Downgrade compaction under swap memory pressure
if (swapFreePercent < COMPACT_DOWNGRADE_FREE_SWAP_THRESHOLD) {
profile = CompactProfile.SOME;
++mTotalCompactionDowngrades;
if (DEBUG_COMPACTION) {
Slog.d(TAG_AM,
"Downgraded compaction to file only due to low swap."
"Downgraded compaction to "+ profile +" due to low swap."
+ " Swap Free% " + swapFreePercent);
}
}
}
if (!ENABLE_FILE_COMPACT) {
if (profile == CompactProfile.SOME) {
profile = CompactProfile.NONE;
} else if (profile == CompactProfile.FULL) {
profile = CompactProfile.ANON;
}
if (DEBUG_COMPACTION) {
Slog.d(TAG_AM,
"Final compaction profile "+ profile +" due to file compact disabled");
}
}
return profile;
}
@@ -1733,7 +1690,6 @@ public final class CachedAppOptimizer {
ProcessRecord proc;
final ProcessCachedOptimizerRecord opt;
int pid;
CompactAction resolvedAction;
final String name;
CompactProfile lastCompactProfile;
long lastCompactTime;
@@ -1811,17 +1767,24 @@ public final class CachedAppOptimizer {
}
CompactProfile resolvedProfile =
downgradeCompactionIfRequired(requestedProfile);
resolvedAction = resolveCompactActionForProfile(resolvedProfile);
resolveCompactionProfile(requestedProfile);
if (resolvedProfile == CompactProfile.NONE) {
// No point on issuing compaction call as we don't want to compact.
if (DEBUG_COMPACTION) {
Slog.d(TAG_AM, "Resolved no compaction for "+ name +
" requested profile="+requestedProfile);
}
return;
}
try {
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,
"Compact " + resolvedAction.name() + ": " + name
"Compact " + resolvedProfile.name() + ": " + name
+ " lastOomAdjReason: " + oomAdjReason
+ " source: " + compactSource.name());
long zramUsedKbBefore = getUsedZramMemory();
long startCpuTime = threadCpuTimeNs();
mProcessDependencies.performCompaction(resolvedAction, pid);
mProcessDependencies.performCompaction(resolvedProfile, pid);
long endCpuTime = threadCpuTimeNs();
long[] rssAfter = mProcessDependencies.getRss(pid);
long end = SystemClock.uptimeMillis();
@@ -1877,7 +1840,7 @@ public final class CachedAppOptimizer {
return;
}
EventLog.writeEvent(EventLogTags.AM_COMPACT, pid, name,
resolvedAction.name(), rssBefore[RSS_TOTAL_INDEX],
resolvedProfile.name(), rssBefore[RSS_TOTAL_INDEX],
rssBefore[RSS_FILE_INDEX], rssBefore[RSS_ANON_INDEX],
rssBefore[RSS_SWAP_INDEX], deltaTotalRss, deltaFileRss,
deltaAnonRss, deltaSwapRss, time, lastCompactProfile.name(),
@@ -1907,6 +1870,21 @@ public final class CachedAppOptimizer {
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
break;
}
case COMPACT_NATIVE_MSG: {
int pid = msg.arg1;
CompactProfile compactProfile = CompactProfile.values()[msg.arg2];
Slog.d(TAG_AM,
"Performing native compaction for pid=" + pid
+ " type=" + compactProfile.name());
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "compactSystem");
try {
mProcessDependencies.performCompaction(compactProfile, pid);
} catch (Exception e) {
Slog.d(TAG_AM, "Failed compacting native pid= " + pid);
}
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
break;
}
}
}
}
@@ -2170,14 +2148,14 @@ public final class CachedAppOptimizer {
// Compact process.
@Override
public void performCompaction(CompactAction action, int pid) throws IOException {
public void performCompaction(CompactProfile profile, int pid) throws IOException {
mPidCompacting = pid;
if (action == CompactAction.ALL) {
compactProcess(pid, COMPACT_ACTION_FILE_FLAG | COMPACT_ACTION_ANON_FLAG);
} else if (action == CompactAction.FILE) {
compactProcess(pid, COMPACT_ACTION_FILE_FLAG);
} else if (action == CompactAction.ANON) {
compactProcess(pid, COMPACT_ACTION_ANON_FLAG);
if (profile == CompactProfile.FULL) {
compactProcess(pid, COMPACT_ACTION_FILE_FLAG | COMPACT_ACTION_ANON_FLAG);
} else if (profile == CompactProfile.SOME) {
compactProcess(pid, COMPACT_ACTION_FILE_FLAG);
} else if (profile == CompactProfile.ANON) {
compactProcess(pid, COMPACT_ACTION_ANON_FLAG);
}
mPidCompacting = -1;
}

View File

@@ -19,7 +19,6 @@ package com.android.server.am;
import static android.app.ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE;
import static com.android.server.am.ActivityManagerService.Injector;
import static com.android.server.am.CachedAppOptimizer.compactActionIntToAction;
import static com.google.common.truth.Truth.assertThat;
@@ -155,12 +154,6 @@ public final class CachedAppOptimizerTest {
synchronized (mCachedAppOptimizerUnderTest.mPhenotypeFlagLock) {
assertThat(mCachedAppOptimizerUnderTest.useCompaction()).isEqualTo(
CachedAppOptimizer.DEFAULT_USE_COMPACTION);
assertThat(mCachedAppOptimizerUnderTest.mCompactActionSome)
.isEqualTo(
compactActionIntToAction(CachedAppOptimizer.DEFAULT_COMPACT_ACTION_1));
assertThat(mCachedAppOptimizerUnderTest.mCompactActionFull)
.isEqualTo(
compactActionIntToAction(CachedAppOptimizer.DEFAULT_COMPACT_ACTION_2));
assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleSomeSome).isEqualTo(
CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_1);
assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleSomeFull).isEqualTo(
@@ -209,12 +202,6 @@ public final class CachedAppOptimizerTest {
assertThat(CachedAppOptimizer.DEFAULT_USE_COMPACTION).isTrue();
DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
CachedAppOptimizer.KEY_USE_COMPACTION, "true", false);
DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
CachedAppOptimizer.KEY_COMPACT_ACTION_1,
Integer.toString((CachedAppOptimizer.DEFAULT_COMPACT_ACTION_1 + 1 % 4) + 1), false);
DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
CachedAppOptimizer.KEY_COMPACT_ACTION_2,
Integer.toString((CachedAppOptimizer.DEFAULT_COMPACT_ACTION_2 + 1 % 4) + 1), false);
DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
CachedAppOptimizer.KEY_COMPACT_THROTTLE_1,
Long.toString(CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_1 + 1), false);
@@ -266,12 +253,6 @@ public final class CachedAppOptimizerTest {
assertThat(mCachedAppOptimizerUnderTest.useCompaction()).isTrue();
assertThat(mCachedAppOptimizerUnderTest.mCachedAppOptimizerThread.isAlive()).isTrue();
assertThat(mCachedAppOptimizerUnderTest.mCompactActionSome)
.isEqualTo(compactActionIntToAction(
(CachedAppOptimizer.DEFAULT_COMPACT_ACTION_1 + 1 % 4) + 1));
assertThat(mCachedAppOptimizerUnderTest.mCompactActionFull)
.isEqualTo(compactActionIntToAction(
(CachedAppOptimizer.DEFAULT_COMPACT_ACTION_2 + 1 % 4) + 1));
assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleSomeSome).isEqualTo(
CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_1 + 1);
assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleSomeFull).isEqualTo(
@@ -403,72 +384,6 @@ public final class CachedAppOptimizerTest {
assertThat(mCachedAppOptimizerUnderTest.useFreezer()).isFalse();
}
@Test
public void compactAction_listensToDeviceConfigChanges() throws InterruptedException {
mCachedAppOptimizerUnderTest.init();
// When we override new values for the compaction action with reasonable values...
// There are four possible values for compactAction[Some|Full].
for (int i = 1; i < 5; i++) {
mCountDown = new CountDownLatch(2);
int expectedSome = (CachedAppOptimizer.DEFAULT_COMPACT_ACTION_1 + i) % 4 + 1;
DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
CachedAppOptimizer.KEY_COMPACT_ACTION_1, Integer.toString(expectedSome), false);
int expectedFull = (CachedAppOptimizer.DEFAULT_COMPACT_ACTION_2 + i) % 4 + 1;
DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
CachedAppOptimizer.KEY_COMPACT_ACTION_2, Integer.toString(expectedFull), false);
assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
// Then the updates are reflected in the flags.
synchronized (mCachedAppOptimizerUnderTest.mPhenotypeFlagLock) {
assertThat(mCachedAppOptimizerUnderTest.mCompactActionSome)
.isEqualTo(compactActionIntToAction(expectedSome));
assertThat(mCachedAppOptimizerUnderTest.mCompactActionFull)
.isEqualTo(compactActionIntToAction(expectedFull));
}
}
}
@Test
public void compactAction_listensToDeviceConfigChangesBadValues() throws InterruptedException {
mCachedAppOptimizerUnderTest.init();
// When we override new values for the compaction action with bad values ...
mCountDown = new CountDownLatch(2);
DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
CachedAppOptimizer.KEY_COMPACT_ACTION_1, "foo", false);
DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
CachedAppOptimizer.KEY_COMPACT_ACTION_2, "foo", false);
assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
synchronized (mCachedAppOptimizerUnderTest.mPhenotypeFlagLock) {
// Then the default values are reflected in the flag
assertThat(mCachedAppOptimizerUnderTest.mCompactActionSome)
.isEqualTo(
compactActionIntToAction(CachedAppOptimizer.DEFAULT_COMPACT_ACTION_1));
assertThat(mCachedAppOptimizerUnderTest.mCompactActionFull)
.isEqualTo(
compactActionIntToAction(CachedAppOptimizer.DEFAULT_COMPACT_ACTION_2));
}
mCountDown = new CountDownLatch(2);
DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
CachedAppOptimizer.KEY_COMPACT_ACTION_1, "", false);
DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
CachedAppOptimizer.KEY_COMPACT_ACTION_2, "", false);
assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
synchronized (mCachedAppOptimizerUnderTest.mPhenotypeFlagLock) {
assertThat(mCachedAppOptimizerUnderTest.mCompactActionSome)
.isEqualTo(
compactActionIntToAction(CachedAppOptimizer.DEFAULT_COMPACT_ACTION_1));
assertThat(mCachedAppOptimizerUnderTest.mCompactActionFull)
.isEqualTo(
compactActionIntToAction(CachedAppOptimizer.DEFAULT_COMPACT_ACTION_2));
}
}
@Test
public void compactThrottle_listensToDeviceConfigChanges() throws InterruptedException {
mCachedAppOptimizerUnderTest.init();
@@ -1108,14 +1023,17 @@ public final class CachedAppOptimizerTest {
mCachedAppOptimizerUnderTest.mLastCompactionStats.clear();
// We force a some compaction
mCachedAppOptimizerUnderTest.compactApp(processRecord,
CachedAppOptimizer.CompactProfile.SOME, CachedAppOptimizer.CompactSource.APP, true);
waitForHandler();
// then process is compacted.
CachedAppOptimizer.CompactProfile executedCompactProfile =
processRecord.mOptRecord.getLastCompactProfile();
assertThat(executedCompactProfile).isEqualTo(CachedAppOptimizer.CompactProfile.SOME);
if (CachedAppOptimizer.ENABLE_FILE_COMPACT) {
// We force a some compaction
mCachedAppOptimizerUnderTest.compactApp(processRecord,
CachedAppOptimizer.CompactProfile.SOME, CachedAppOptimizer.CompactSource.APP,
true);
waitForHandler();
// then process is compacted.
CachedAppOptimizer.CompactProfile executedCompactProfile =
processRecord.mOptRecord.getLastCompactProfile();
assertThat(executedCompactProfile).isEqualTo(CachedAppOptimizer.CompactProfile.SOME);
}
}
private void setFlag(String key, String value, boolean defaultValue) throws Exception {
@@ -1192,7 +1110,7 @@ public final class CachedAppOptimizerTest {
}
@Override
public void performCompaction(CachedAppOptimizer.CompactAction action, int pid)
public void performCompaction(CachedAppOptimizer.CompactProfile profile, int pid)
throws IOException {
mRss = mRssAfterCompaction;
}