Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d891a370 authored by Matt Pape's avatar Matt Pape Committed by Android (Google) Code Review
Browse files

Merge "Update ActivityManager DeviceConfig flag definitions."

parents b1011334 40074dad
Loading
Loading
Loading
Loading
+1 −13
Original line number Original line Diff line number Diff line
@@ -5835,6 +5835,7 @@ package android.provider {
    method public static void removeOnPropertyChangedListener(android.provider.DeviceConfig.OnPropertyChangedListener);
    method public static void removeOnPropertyChangedListener(android.provider.DeviceConfig.OnPropertyChangedListener);
    method @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static void resetToDefaults(int, @Nullable String);
    method @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static void resetToDefaults(int, @Nullable String);
    method @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static boolean setProperty(String, String, String, boolean);
    method @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static boolean setProperty(String, String, String, boolean);
    field public static final String NAMESPACE_ACTIVITY_MANAGER = "activity_manager";
    field public static final String NAMESPACE_AUTOFILL = "autofill";
    field public static final String NAMESPACE_AUTOFILL = "autofill";
    field public static final String NAMESPACE_CONTENT_CAPTURE = "content_capture";
    field public static final String NAMESPACE_CONTENT_CAPTURE = "content_capture";
    field public static final String NAMESPACE_GAME_DRIVER = "game_driver";
    field public static final String NAMESPACE_GAME_DRIVER = "game_driver";
@@ -5843,19 +5844,6 @@ package android.provider {
    field public static final String NAMESPACE_SYSTEMUI = "systemui";
    field public static final String NAMESPACE_SYSTEMUI = "systemui";
  }
  }
  public static interface DeviceConfig.ActivityManager {
    field public static final String KEY_COMPACT_ACTION_1 = "compact_action_1";
    field public static final String KEY_COMPACT_ACTION_2 = "compact_action_2";
    field public static final String KEY_COMPACT_STATSD_SAMPLE_RATE = "compact_statsd_sample_rate";
    field public static final String KEY_COMPACT_THROTTLE_1 = "compact_throttle_1";
    field public static final String KEY_COMPACT_THROTTLE_2 = "compact_throttle_2";
    field public static final String KEY_COMPACT_THROTTLE_3 = "compact_throttle_3";
    field public static final String KEY_COMPACT_THROTTLE_4 = "compact_throttle_4";
    field public static final String KEY_MAX_CACHED_PROCESSES = "max_cached_processes";
    field public static final String KEY_USE_COMPACTION = "use_compaction";
    field public static final String NAMESPACE = "activity_manager";
  }
  public static interface DeviceConfig.ActivityManagerNativeBoot {
  public static interface DeviceConfig.ActivityManagerNativeBoot {
    field public static final String NAMESPACE = "activity_manager_native_boot";
    field public static final String NAMESPACE = "activity_manager_native_boot";
    field public static final String OFFLOAD_QUEUE_ENABLED = "offload_queue_enabled";
    field public static final String OFFLOAD_QUEUE_ENABLED = "offload_queue_enabled";
+9 −29
Original line number Original line Diff line number Diff line
@@ -54,6 +54,15 @@ public final class DeviceConfig {
     */
     */
    public static final Uri CONTENT_URI = Uri.parse("content://" + Settings.AUTHORITY + "/config");
    public static final Uri CONTENT_URI = Uri.parse("content://" + Settings.AUTHORITY + "/config");


    /**
     * Namespace for activity manager related features. These features will be applied
     * immediately upon change.
     *
     * @hide
     */
    @SystemApi
    public static final String NAMESPACE_ACTIVITY_MANAGER = "activity_manager";

    /**
    /**
     * Namespace for all Game Driver features.
     * Namespace for all Game Driver features.
     *
     *
@@ -280,35 +289,6 @@ public final class DeviceConfig {
        String PRIV_APPS_OOB_WHITELIST = "priv_apps_oob_whitelist";
        String PRIV_APPS_OOB_WHITELIST = "priv_apps_oob_whitelist";
    }
    }


    /**
     * Namespace for activity manager related features. These features will be applied
     * immediately upon change.
     *
     * @hide
     */
    @SystemApi
    public interface ActivityManager {
        String NAMESPACE = "activity_manager";

        /**
         * App compaction flags. See {@link com.android.server.am.AppCompactor}.
         */
        String KEY_USE_COMPACTION = "use_compaction";
        String KEY_COMPACT_ACTION_1 = "compact_action_1";
        String KEY_COMPACT_ACTION_2 = "compact_action_2";
        String KEY_COMPACT_THROTTLE_1 = "compact_throttle_1";
        String KEY_COMPACT_THROTTLE_2 = "compact_throttle_2";
        String KEY_COMPACT_THROTTLE_3 = "compact_throttle_3";
        String KEY_COMPACT_THROTTLE_4 = "compact_throttle_4";
        String KEY_COMPACT_STATSD_SAMPLE_RATE = "compact_statsd_sample_rate";

        /**
         * Maximum number of cached processes. See
         * {@link com.android.server.am.ActivityManagerConstants}.
         */
        String KEY_MAX_CACHED_PROCESSES = "max_cached_processes";
    }

    /**
    /**
     * Namespace for {@link AttentionManagerService} related features.
     * Namespace for {@link AttentionManagerService} related features.
     *
     *
+8 −4
Original line number Original line Diff line number Diff line
@@ -16,8 +16,6 @@


package com.android.server.am;
package com.android.server.am;


import static android.provider.DeviceConfig.ActivityManager.KEY_MAX_CACHED_PROCESSES;

import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_POWER_QUICK;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_POWER_QUICK;


import android.app.ActivityThread;
import android.app.ActivityThread;
@@ -105,6 +103,12 @@ final class ActivityManagerConstants extends ContentObserver {
    private static final long DEFAULT_MEMORY_INFO_THROTTLE_TIME = 5*60*1000;
    private static final long DEFAULT_MEMORY_INFO_THROTTLE_TIME = 5*60*1000;
    private static final long DEFAULT_TOP_TO_FGS_GRACE_DURATION = 15 * 1000;
    private static final long DEFAULT_TOP_TO_FGS_GRACE_DURATION = 15 * 1000;


    // Flag stored in the DeviceConfig API.
    /**
     * Maximum number of cached processes.
     */
    private static final String KEY_MAX_CACHED_PROCESSES = "max_cached_processes";

    // Maximum number of cached processes we will allow.
    // Maximum number of cached processes we will allow.
    public int MAX_CACHED_PROCESSES = DEFAULT_MAX_CACHED_PROCESSES;
    public int MAX_CACHED_PROCESSES = DEFAULT_MAX_CACHED_PROCESSES;


@@ -292,7 +296,7 @@ final class ActivityManagerConstants extends ContentObserver {
        updateConstants();
        updateConstants();
        updateActivityStartsLoggingEnabled();
        updateActivityStartsLoggingEnabled();
        updateBackgroundActivityStartsEnabled();
        updateBackgroundActivityStartsEnabled();
        DeviceConfig.addOnPropertyChangedListener(DeviceConfig.ActivityManager.NAMESPACE,
        DeviceConfig.addOnPropertyChangedListener(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                ActivityThread.currentApplication().getMainExecutor(),
                ActivityThread.currentApplication().getMainExecutor(),
                mOnDeviceConfigChangedListener);
                mOnDeviceConfigChangedListener);
        updateMaxCachedProcesses();
        updateMaxCachedProcesses();
@@ -412,7 +416,7 @@ final class ActivityManagerConstants extends ContentObserver {


    private void updateMaxCachedProcesses() {
    private void updateMaxCachedProcesses() {
        String maxCachedProcessesFlag = DeviceConfig.getProperty(
        String maxCachedProcessesFlag = DeviceConfig.getProperty(
                DeviceConfig.ActivityManager.NAMESPACE, KEY_MAX_CACHED_PROCESSES);
                DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, KEY_MAX_CACHED_PROCESSES);
        try {
        try {
            CUR_MAX_CACHED_PROCESSES = mOverrideMaxCachedProcesses < 0
            CUR_MAX_CACHED_PROCESSES = mOverrideMaxCachedProcesses < 0
                    ? (TextUtils.isEmpty(maxCachedProcessesFlag)
                    ? (TextUtils.isEmpty(maxCachedProcessesFlag)
+20 −17
Original line number Original line Diff line number Diff line
@@ -17,14 +17,6 @@
package com.android.server.am;
package com.android.server.am;


import static android.os.Process.THREAD_PRIORITY_FOREGROUND;
import static android.os.Process.THREAD_PRIORITY_FOREGROUND;
import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_ACTION_1;
import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_ACTION_2;
import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_STATSD_SAMPLE_RATE;
import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_1;
import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_2;
import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_3;
import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_4;
import static android.provider.DeviceConfig.ActivityManager.KEY_USE_COMPACTION;


import android.app.ActivityManager;
import android.app.ActivityManager;
import android.app.ActivityThread;
import android.app.ActivityThread;
@@ -51,6 +43,17 @@ import java.util.Random;


public final class AppCompactor {
public final class AppCompactor {


    // Flags stored in the DeviceConfig API.
    @VisibleForTesting static final String KEY_USE_COMPACTION = "use_compaction";
    @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";
    @VisibleForTesting static final String KEY_COMPACT_THROTTLE_4 = "compact_throttle_4";
    @VisibleForTesting static final String KEY_COMPACT_STATSD_SAMPLE_RATE =
            "compact_statsd_sample_rate";

    // Phenotype sends int configurations and we map them to the strings we'll use on device,
    // Phenotype sends int configurations and we map them to the strings we'll use on device,
    // preventing a weird string value entering the kernel.
    // preventing a weird string value entering the kernel.
    private static final int COMPACT_ACTION_FILE_FLAG = 1;
    private static final int COMPACT_ACTION_FILE_FLAG = 1;
@@ -165,7 +168,7 @@ public final class AppCompactor {
     * starts the background thread if necessary.
     * starts the background thread if necessary.
     */
     */
    public void init() {
    public void init() {
        DeviceConfig.addOnPropertyChangedListener(DeviceConfig.ActivityManager.NAMESPACE,
        DeviceConfig.addOnPropertyChangedListener(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                ActivityThread.currentApplication().getMainExecutor(), mOnFlagsChangedListener);
                ActivityThread.currentApplication().getMainExecutor(), mOnFlagsChangedListener);
        synchronized (mPhenotypeFlagLock) {
        synchronized (mPhenotypeFlagLock) {
            updateUseCompaction();
            updateUseCompaction();
@@ -228,7 +231,7 @@ public final class AppCompactor {
    @GuardedBy("mPhenotypeFlagLock")
    @GuardedBy("mPhenotypeFlagLock")
    private void updateUseCompaction() {
    private void updateUseCompaction() {
        String useCompactionFlag =
        String useCompactionFlag =
                DeviceConfig.getProperty(DeviceConfig.ActivityManager.NAMESPACE,
                DeviceConfig.getProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                    KEY_USE_COMPACTION);
                    KEY_USE_COMPACTION);
        mUseCompaction = TextUtils.isEmpty(useCompactionFlag)
        mUseCompaction = TextUtils.isEmpty(useCompactionFlag)
                ? DEFAULT_USE_COMPACTION : Boolean.parseBoolean(useCompactionFlag);
                ? DEFAULT_USE_COMPACTION : Boolean.parseBoolean(useCompactionFlag);
@@ -241,10 +244,10 @@ public final class AppCompactor {
    @GuardedBy("mPhenotypeFlagLock")
    @GuardedBy("mPhenotypeFlagLock")
    private void updateCompactionActions() {
    private void updateCompactionActions() {
        String compactAction1Flag =
        String compactAction1Flag =
                DeviceConfig.getProperty(DeviceConfig.ActivityManager.NAMESPACE,
                DeviceConfig.getProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                        KEY_COMPACT_ACTION_1);
                        KEY_COMPACT_ACTION_1);
        String compactAction2Flag =
        String compactAction2Flag =
                DeviceConfig.getProperty(DeviceConfig.ActivityManager.NAMESPACE,
                DeviceConfig.getProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                        KEY_COMPACT_ACTION_2);
                        KEY_COMPACT_ACTION_2);


        int compactAction1 = DEFAULT_COMPACT_ACTION_1;
        int compactAction1 = DEFAULT_COMPACT_ACTION_1;
@@ -271,16 +274,16 @@ public final class AppCompactor {
    private void updateCompactionThrottles() {
    private void updateCompactionThrottles() {
        boolean useThrottleDefaults = false;
        boolean useThrottleDefaults = false;
        String throttleSomeSomeFlag =
        String throttleSomeSomeFlag =
                DeviceConfig.getProperty(DeviceConfig.ActivityManager.NAMESPACE,
                DeviceConfig.getProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                    KEY_COMPACT_THROTTLE_1);
                    KEY_COMPACT_THROTTLE_1);
        String throttleSomeFullFlag =
        String throttleSomeFullFlag =
                DeviceConfig.getProperty(DeviceConfig.ActivityManager.NAMESPACE,
                DeviceConfig.getProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                    KEY_COMPACT_THROTTLE_2);
                    KEY_COMPACT_THROTTLE_2);
        String throttleFullSomeFlag =
        String throttleFullSomeFlag =
                DeviceConfig.getProperty(DeviceConfig.ActivityManager.NAMESPACE,
                DeviceConfig.getProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                    KEY_COMPACT_THROTTLE_3);
                    KEY_COMPACT_THROTTLE_3);
        String throttleFullFullFlag =
        String throttleFullFullFlag =
                DeviceConfig.getProperty(DeviceConfig.ActivityManager.NAMESPACE,
                DeviceConfig.getProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                    KEY_COMPACT_THROTTLE_4);
                    KEY_COMPACT_THROTTLE_4);


        if (TextUtils.isEmpty(throttleSomeSomeFlag) || TextUtils.isEmpty(throttleSomeFullFlag)
        if (TextUtils.isEmpty(throttleSomeSomeFlag) || TextUtils.isEmpty(throttleSomeFullFlag)
@@ -309,7 +312,7 @@ public final class AppCompactor {


    @GuardedBy("mPhenotypeFlagLock")
    @GuardedBy("mPhenotypeFlagLock")
    private void updateStatsdSampleRate() {
    private void updateStatsdSampleRate() {
        String sampleRateFlag = DeviceConfig.getProperty(DeviceConfig.ActivityManager.NAMESPACE,
        String sampleRateFlag = DeviceConfig.getProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                KEY_COMPACT_STATSD_SAMPLE_RATE);
                KEY_COMPACT_STATSD_SAMPLE_RATE);
        try {
        try {
            mStatsdSampleRate = TextUtils.isEmpty(sampleRateFlag)
            mStatsdSampleRate = TextUtils.isEmpty(sampleRateFlag)
+58 −67
Original line number Original line Diff line number Diff line
@@ -16,15 +16,6 @@


package com.android.server.am;
package com.android.server.am;


import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_ACTION_1;
import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_ACTION_2;
import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_STATSD_SAMPLE_RATE;
import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_1;
import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_2;
import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_3;
import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_4;
import static android.provider.DeviceConfig.ActivityManager.KEY_USE_COMPACTION;

import static com.android.server.am.ActivityManagerService.Injector;
import static com.android.server.am.ActivityManagerService.Injector;
import static com.android.server.am.AppCompactor.compactActionIntToString;
import static com.android.server.am.AppCompactor.compactActionIntToString;


@@ -117,28 +108,28 @@ public final class AppCompactorTest {
        // When the DeviceConfig already has a flag value stored (note this test will need to
        // When the DeviceConfig already has a flag value stored (note this test will need to
        // change if the default value changes from false).
        // change if the default value changes from false).
        assertThat(AppCompactor.DEFAULT_USE_COMPACTION).isFalse();
        assertThat(AppCompactor.DEFAULT_USE_COMPACTION).isFalse();
        DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                KEY_USE_COMPACTION, "true", false);
                AppCompactor.KEY_USE_COMPACTION, "true", false);
        DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                KEY_COMPACT_ACTION_1,
                AppCompactor.KEY_COMPACT_ACTION_1,
                Integer.toString((AppCompactor.DEFAULT_COMPACT_ACTION_1 + 1 % 4) + 1), false);
                Integer.toString((AppCompactor.DEFAULT_COMPACT_ACTION_1 + 1 % 4) + 1), false);
        DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                KEY_COMPACT_ACTION_2,
                AppCompactor.KEY_COMPACT_ACTION_2,
                Integer.toString((AppCompactor.DEFAULT_COMPACT_ACTION_2 + 1 % 4) + 1), false);
                Integer.toString((AppCompactor.DEFAULT_COMPACT_ACTION_2 + 1 % 4) + 1), false);
        DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                KEY_COMPACT_THROTTLE_1,
                AppCompactor.KEY_COMPACT_THROTTLE_1,
                Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_1 + 1), false);
                Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_1 + 1), false);
        DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                KEY_COMPACT_THROTTLE_2,
                AppCompactor.KEY_COMPACT_THROTTLE_2,
                Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_2 + 1), false);
                Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_2 + 1), false);
        DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                KEY_COMPACT_THROTTLE_3,
                AppCompactor.KEY_COMPACT_THROTTLE_3,
                Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_3 + 1), false);
                Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_3 + 1), false);
        DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                KEY_COMPACT_THROTTLE_4,
                AppCompactor.KEY_COMPACT_THROTTLE_4,
                Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_4 + 1), false);
                Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_4 + 1), false);
        DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                KEY_COMPACT_STATSD_SAMPLE_RATE,
                AppCompactor.KEY_COMPACT_STATSD_SAMPLE_RATE,
                Float.toString(AppCompactor.DEFAULT_STATSD_SAMPLE_RATE + 0.1f), false);
                Float.toString(AppCompactor.DEFAULT_STATSD_SAMPLE_RATE + 0.1f), false);


        // Then calling init will read and set that flag.
        // Then calling init will read and set that flag.
@@ -169,8 +160,8 @@ public final class AppCompactorTest {
        // When we call init and change some the flag value...
        // When we call init and change some the flag value...
        mCompactorUnderTest.init();
        mCompactorUnderTest.init();
        mCountDown = new CountDownLatch(1);
        mCountDown = new CountDownLatch(1);
        DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                KEY_USE_COMPACTION, "true", false);
                AppCompactor.KEY_USE_COMPACTION, "true", false);
        assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
        assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();


        // Then that new flag value is updated in the implementation.
        // Then that new flag value is updated in the implementation.
@@ -179,8 +170,8 @@ public final class AppCompactorTest {


        // And again, setting the flag the other way.
        // And again, setting the flag the other way.
        mCountDown = new CountDownLatch(1);
        mCountDown = new CountDownLatch(1);
        DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                KEY_USE_COMPACTION, "false", false);
                AppCompactor.KEY_USE_COMPACTION, "false", false);
        assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
        assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
        assertThat(mCompactorUnderTest.useCompaction()).isFalse();
        assertThat(mCompactorUnderTest.useCompaction()).isFalse();
    }
    }
@@ -193,8 +184,8 @@ public final class AppCompactorTest {


        // When we push an invalid flag value...
        // When we push an invalid flag value...
        mCountDown = new CountDownLatch(1);
        mCountDown = new CountDownLatch(1);
        DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                KEY_USE_COMPACTION, "foobar", false);
                AppCompactor.KEY_USE_COMPACTION, "foobar", false);
        assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
        assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();


        // Then we set the default.
        // Then we set the default.
@@ -212,11 +203,11 @@ public final class AppCompactorTest {
        for (int i = 1; i < 5; i++) {
        for (int i = 1; i < 5; i++) {
            mCountDown = new CountDownLatch(2);
            mCountDown = new CountDownLatch(2);
            int expectedSome = (AppCompactor.DEFAULT_COMPACT_ACTION_1 + i) % 4 + 1;
            int expectedSome = (AppCompactor.DEFAULT_COMPACT_ACTION_1 + i) % 4 + 1;
            DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
            DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                    KEY_COMPACT_ACTION_1, Integer.toString(expectedSome), false);
                    AppCompactor.KEY_COMPACT_ACTION_1, Integer.toString(expectedSome), false);
            int expectedFull = (AppCompactor.DEFAULT_COMPACT_ACTION_2 + i) % 4 + 1;
            int expectedFull = (AppCompactor.DEFAULT_COMPACT_ACTION_2 + i) % 4 + 1;
            DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
            DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                    KEY_COMPACT_ACTION_2, Integer.toString(expectedFull), false);
                    AppCompactor.KEY_COMPACT_ACTION_2, Integer.toString(expectedFull), false);
            assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
            assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();


            // Then the updates are reflected in the flags.
            // Then the updates are reflected in the flags.
@@ -233,10 +224,10 @@ public final class AppCompactorTest {


        // When we override new values for the compaction action with bad values ...
        // When we override new values for the compaction action with bad values ...
        mCountDown = new CountDownLatch(2);
        mCountDown = new CountDownLatch(2);
        DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                KEY_COMPACT_ACTION_1, "foo", false);
                AppCompactor.KEY_COMPACT_ACTION_1, "foo", false);
        DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                KEY_COMPACT_ACTION_2, "foo", false);
                AppCompactor.KEY_COMPACT_ACTION_2, "foo", false);
        assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
        assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();


        // Then the default values are reflected in the flag
        // Then the default values are reflected in the flag
@@ -246,10 +237,10 @@ public final class AppCompactorTest {
                compactActionIntToString(AppCompactor.DEFAULT_COMPACT_ACTION_2));
                compactActionIntToString(AppCompactor.DEFAULT_COMPACT_ACTION_2));


        mCountDown = new CountDownLatch(2);
        mCountDown = new CountDownLatch(2);
        DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                KEY_COMPACT_ACTION_1, "", false);
                AppCompactor.KEY_COMPACT_ACTION_1, "", false);
        DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                KEY_COMPACT_ACTION_2, "", false);
                AppCompactor.KEY_COMPACT_ACTION_2, "", false);
        assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
        assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();


        assertThat(mCompactorUnderTest.mCompactActionSome).isEqualTo(
        assertThat(mCompactorUnderTest.mCompactActionSome).isEqualTo(
@@ -264,17 +255,17 @@ public final class AppCompactorTest {


        // When we override new reasonable throttle values after init...
        // When we override new reasonable throttle values after init...
        mCountDown = new CountDownLatch(4);
        mCountDown = new CountDownLatch(4);
        DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                KEY_COMPACT_THROTTLE_1,
                AppCompactor.KEY_COMPACT_THROTTLE_1,
                Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_1 + 1), false);
                Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_1 + 1), false);
        DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                KEY_COMPACT_THROTTLE_2,
                AppCompactor.KEY_COMPACT_THROTTLE_2,
                Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_2 + 1), false);
                Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_2 + 1), false);
        DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                KEY_COMPACT_THROTTLE_3,
                AppCompactor.KEY_COMPACT_THROTTLE_3,
                Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_3 + 1), false);
                Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_3 + 1), false);
        DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                KEY_COMPACT_THROTTLE_4,
                AppCompactor.KEY_COMPACT_THROTTLE_4,
                Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_4 + 1), false);
                Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_4 + 1), false);
        assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
        assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();


@@ -296,8 +287,8 @@ public final class AppCompactorTest {


        // When one of the throttles is overridden with a bad value...
        // When one of the throttles is overridden with a bad value...
        mCountDown = new CountDownLatch(1);
        mCountDown = new CountDownLatch(1);
        DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                KEY_COMPACT_THROTTLE_1, "foo", false);
                AppCompactor.KEY_COMPACT_THROTTLE_1, "foo", false);
        // Then all the throttles have the defaults set.
        // Then all the throttles have the defaults set.
        assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
        assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
        assertThat(mCompactorUnderTest.mCompactThrottleSomeSome).isEqualTo(
        assertThat(mCompactorUnderTest.mCompactThrottleSomeSome).isEqualTo(
@@ -311,8 +302,8 @@ public final class AppCompactorTest {


        // Repeat for each of the throttle keys.
        // Repeat for each of the throttle keys.
        mCountDown = new CountDownLatch(1);
        mCountDown = new CountDownLatch(1);
        DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                KEY_COMPACT_THROTTLE_2, "foo", false);
                AppCompactor.KEY_COMPACT_THROTTLE_2, "foo", false);
        assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
        assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
        assertThat(mCompactorUnderTest.mCompactThrottleSomeSome).isEqualTo(
        assertThat(mCompactorUnderTest.mCompactThrottleSomeSome).isEqualTo(
                AppCompactor.DEFAULT_COMPACT_THROTTLE_1);
                AppCompactor.DEFAULT_COMPACT_THROTTLE_1);
@@ -324,8 +315,8 @@ public final class AppCompactorTest {
                AppCompactor.DEFAULT_COMPACT_THROTTLE_4);
                AppCompactor.DEFAULT_COMPACT_THROTTLE_4);


        mCountDown = new CountDownLatch(1);
        mCountDown = new CountDownLatch(1);
        DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                KEY_COMPACT_THROTTLE_3, "foo", false);
                AppCompactor.KEY_COMPACT_THROTTLE_3, "foo", false);
        assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
        assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
        assertThat(mCompactorUnderTest.mCompactThrottleSomeSome).isEqualTo(
        assertThat(mCompactorUnderTest.mCompactThrottleSomeSome).isEqualTo(
                AppCompactor.DEFAULT_COMPACT_THROTTLE_1);
                AppCompactor.DEFAULT_COMPACT_THROTTLE_1);
@@ -337,8 +328,8 @@ public final class AppCompactorTest {
                AppCompactor.DEFAULT_COMPACT_THROTTLE_4);
                AppCompactor.DEFAULT_COMPACT_THROTTLE_4);


        mCountDown = new CountDownLatch(1);
        mCountDown = new CountDownLatch(1);
        DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                KEY_COMPACT_THROTTLE_4, "foo", false);
                AppCompactor.KEY_COMPACT_THROTTLE_4, "foo", false);
        assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
        assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
        assertThat(mCompactorUnderTest.mCompactThrottleSomeSome).isEqualTo(
        assertThat(mCompactorUnderTest.mCompactThrottleSomeSome).isEqualTo(
                AppCompactor.DEFAULT_COMPACT_THROTTLE_1);
                AppCompactor.DEFAULT_COMPACT_THROTTLE_1);
@@ -356,8 +347,8 @@ public final class AppCompactorTest {


        // When we override mStatsdSampleRate with a reasonable values ...
        // When we override mStatsdSampleRate with a reasonable values ...
        mCountDown = new CountDownLatch(1);
        mCountDown = new CountDownLatch(1);
        DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                KEY_COMPACT_STATSD_SAMPLE_RATE,
                AppCompactor.KEY_COMPACT_STATSD_SAMPLE_RATE,
                Float.toString(AppCompactor.DEFAULT_STATSD_SAMPLE_RATE + 0.1f), false);
                Float.toString(AppCompactor.DEFAULT_STATSD_SAMPLE_RATE + 0.1f), false);
        assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
        assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();


@@ -373,8 +364,8 @@ public final class AppCompactorTest {


        // When we override mStatsdSampleRate with a reasonable values ...
        // When we override mStatsdSampleRate with a reasonable values ...
        mCountDown = new CountDownLatch(1);
        mCountDown = new CountDownLatch(1);
        DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                KEY_COMPACT_STATSD_SAMPLE_RATE, "foo", false);
                AppCompactor.KEY_COMPACT_STATSD_SAMPLE_RATE, "foo", false);
        assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
        assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();


        // Then that override is reflected in the compactor.
        // Then that override is reflected in the compactor.
@@ -389,8 +380,8 @@ public final class AppCompactorTest {


        // When we override mStatsdSampleRate with an value outside of [0..1]...
        // When we override mStatsdSampleRate with an value outside of [0..1]...
        mCountDown = new CountDownLatch(1);
        mCountDown = new CountDownLatch(1);
        DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                KEY_COMPACT_STATSD_SAMPLE_RATE,
                AppCompactor.KEY_COMPACT_STATSD_SAMPLE_RATE,
                Float.toString(-1.0f), false);
                Float.toString(-1.0f), false);
        assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
        assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();


@@ -398,8 +389,8 @@ public final class AppCompactorTest {
        assertThat(mCompactorUnderTest.mStatsdSampleRate).isEqualTo(0.0f);
        assertThat(mCompactorUnderTest.mStatsdSampleRate).isEqualTo(0.0f);


        mCountDown = new CountDownLatch(1);
        mCountDown = new CountDownLatch(1);
        DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                KEY_COMPACT_STATSD_SAMPLE_RATE,
                AppCompactor.KEY_COMPACT_STATSD_SAMPLE_RATE,
                Float.toString(1.01f), false);
                Float.toString(1.01f), false);
        assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
        assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();