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

Commit 6cb0a4dd authored by Chris Wailes's avatar Chris Wailes Committed by Automerger Merge Worker
Browse files

Merge "Add System Properties based settings for USAPs" am: a2143c07

parents 5d6adc5a a2143c07
Loading
Loading
Loading
Loading
+2 −15
Original line number Diff line number Diff line
@@ -81,13 +81,6 @@ public class ZygoteProcess {

    private static final String LOG_TAG = "ZygoteProcess";

    /**
     * The default value for enabling the unspecialized app process (USAP) pool.  This value will
     * not be used if the devices has a DeviceConfig profile pushed to it that contains a value for
     * this key.
     */
    private static final String USAP_POOL_ENABLED_DEFAULT = "false";

    /**
     * The name of the socket used to communicate with the primary zygote.
     */
@@ -793,14 +786,8 @@ public class ZygoteProcess {
    private boolean fetchUsapPoolEnabledProp() {
        boolean origVal = mUsapPoolEnabled;

        final String propertyString = Zygote.getConfigurationProperty(
                ZygoteConfig.USAP_POOL_ENABLED, USAP_POOL_ENABLED_DEFAULT);

        if (!propertyString.isEmpty()) {
            mUsapPoolEnabled = Zygote.getConfigurationPropertyBoolean(
                  ZygoteConfig.USAP_POOL_ENABLED,
                  Boolean.parseBoolean(USAP_POOL_ENABLED_DEFAULT));
        }
        mUsapPoolEnabled = ZygoteConfig.getBool(
            ZygoteConfig.USAP_POOL_ENABLED, ZygoteConfig.USAP_POOL_ENABLED_DEFAULT);

        boolean valueChanged = origVal != mUsapPoolEnabled;

+75 −0
Original line number Diff line number Diff line
@@ -16,6 +16,9 @@

package com.android.internal.os;

import android.os.SystemProperties;
import android.provider.DeviceConfig;

/**
 * Flag names for configuring the zygote.
 *
@@ -26,15 +29,87 @@ public class ZygoteConfig {
    /** If {@code true}, enables the unspecialized app process (USAP) pool feature */
    public static final String USAP_POOL_ENABLED = "usap_pool_enabled";

    /**
     * The default value for enabling the unspecialized app process (USAP) pool.  This value will
     * not be used if the devices has a DeviceConfig profile pushed to it that contains a value for
     * this key or if the System Property dalvik.vm.usap_pool_enabled is set.
     */
    public static final boolean USAP_POOL_ENABLED_DEFAULT = false;



    /** The threshold used to determine if the pool should be refilled */
    public static final String USAP_POOL_REFILL_THRESHOLD = "usap_refill_threshold";

    public static final int USAP_POOL_REFILL_THRESHOLD_DEFAULT = 1;



    /** The maximum number of processes to keep in the USAP pool */
    public static final String USAP_POOL_SIZE_MAX = "usap_pool_size_max";

    public static final int USAP_POOL_SIZE_MAX_DEFAULT = 3;

    /**
     * The maximim value that will be accepted from the USAP_POOL_SIZE_MAX device property.
     * is a mirror of USAP_POOL_MAX_LIMIT found in com_android_internal_os_Zygote.cpp.
     */
    public static final int USAP_POOL_SIZE_MAX_LIMIT = 100;



    /** The minimum number of processes to keep in the USAP pool */
    public static final String USAP_POOL_SIZE_MIN = "usap_pool_size_min";

    public static final int USAP_POOL_SIZE_MIN_DEFAULT = 1;

    /**
     * The minimum value that will be accepted from the USAP_POOL_SIZE_MIN device property.
     */
    public static final int USAP_POOL_SIZE_MIN_LIMIT = 1;



    /** The number of milliseconds to delay before refilling the USAP pool */
    public static final String USAP_POOL_REFILL_DELAY_MS = "usap_pool_refill_delay_ms";

    public static final int USAP_POOL_REFILL_DELAY_MS_DEFAULT = 3000;

    public static final String PROPERTY_PREFIX_DEVICE_CONFIG = "persist.device_config";
    public static final String PROPERTY_PREFIX_SYSTEM = "dalvik.vm.";

    private static String getDeviceConfig(String name) {
        return SystemProperties.get(
            String.join(
                ".",
                PROPERTY_PREFIX_DEVICE_CONFIG,
                DeviceConfig.NAMESPACE_RUNTIME_NATIVE,
                name));
    }

    /**
     * Get a property value from SystemProperties and convert it to an integer value.
     */
    public static int getInt(String name, int defaultValue) {
        final String propString = getDeviceConfig(name);

        if (!propString.isEmpty()) {
            return Integer.parseInt(propString);
        } else {
            return SystemProperties.getInt(PROPERTY_PREFIX_SYSTEM + name, defaultValue);
        }
    }

    /**
     * Get a property value from SystemProperties and convert it to a Boolean value.
     */
    public static boolean getBool(String name, boolean defaultValue) {
        final String propString = getDeviceConfig(name);

        if (!propString.isEmpty()) {
            return Boolean.parseBoolean(propString);
        } else {
            return SystemProperties.getBoolean(PROPERTY_PREFIX_SYSTEM + name, defaultValue);
        }
    }
}
+21 −52
Original line number Diff line number Diff line
@@ -49,26 +49,6 @@ class ZygoteServer {
    // TODO (chriswailes): Change this so it is set with Zygote or ZygoteSecondary as appropriate
    public static final String TAG = "ZygoteServer";

    /**
     * The maximim value that will be accepted from the USAP_POOL_SIZE_MAX device property.
     * is a mirror of USAP_POOL_MAX_LIMIT found in com_android_internal_os_Zygote.cpp.
     */
    private static final int USAP_POOL_SIZE_MAX_LIMIT = 100;

    /**
     * The minimum value that will be accepted from the USAP_POOL_SIZE_MIN device property.
     */
    private static final int USAP_POOL_SIZE_MIN_LIMIT = 1;

    /** The default value used for the USAP_POOL_SIZE_MAX device property */
    private static final String USAP_POOL_SIZE_MAX_DEFAULT = "10";

    /** The default value used for the USAP_POOL_SIZE_MIN device property */
    private static final String USAP_POOL_SIZE_MIN_DEFAULT = "1";

    /** The default value used for the USAP_REFILL_DELAY_MS device property */
    private static final String USAP_POOL_REFILL_DELAY_MS_DEFAULT = "3000";

    /** The "not a timestamp" value for the refill delay timestamp mechanism. */
    private static final int INVALID_TIMESTAMP = -1;

@@ -264,46 +244,35 @@ class ZygoteServer {

    private void fetchUsapPoolPolicyProps() {
        if (mUsapPoolSupported) {
            final String usapPoolSizeMaxPropString = Zygote.getConfigurationProperty(
                    ZygoteConfig.USAP_POOL_SIZE_MAX, USAP_POOL_SIZE_MAX_DEFAULT);
            mUsapPoolSizeMax = Integer.min(
                ZygoteConfig.getInt(
                    ZygoteConfig.USAP_POOL_SIZE_MAX,
                    ZygoteConfig.USAP_POOL_SIZE_MAX_DEFAULT),
                ZygoteConfig.USAP_POOL_SIZE_MAX_LIMIT);

            if (!usapPoolSizeMaxPropString.isEmpty()) {
                mUsapPoolSizeMax = Integer.min(Integer.parseInt(
                        usapPoolSizeMaxPropString), USAP_POOL_SIZE_MAX_LIMIT);
            }

            final String usapPoolSizeMinPropString = Zygote.getConfigurationProperty(
                    ZygoteConfig.USAP_POOL_SIZE_MIN, USAP_POOL_SIZE_MIN_DEFAULT);

            if (!usapPoolSizeMinPropString.isEmpty()) {
            mUsapPoolSizeMin = Integer.max(
                        Integer.parseInt(usapPoolSizeMinPropString), USAP_POOL_SIZE_MIN_LIMIT);
            }

            final String usapPoolRefillThresholdPropString = Zygote.getConfigurationProperty(
                    ZygoteConfig.USAP_POOL_REFILL_THRESHOLD,
                    Integer.toString(mUsapPoolSizeMax / 2));
                ZygoteConfig.getInt(
                    ZygoteConfig.USAP_POOL_SIZE_MIN,
                    ZygoteConfig.USAP_POOL_SIZE_MIN_DEFAULT),
                ZygoteConfig.USAP_POOL_SIZE_MIN_LIMIT);

            if (!usapPoolRefillThresholdPropString.isEmpty()) {
            mUsapPoolRefillThreshold = Integer.min(
                        Integer.parseInt(usapPoolRefillThresholdPropString),
                ZygoteConfig.getInt(
                    ZygoteConfig.USAP_POOL_REFILL_THRESHOLD,
                    ZygoteConfig.USAP_POOL_REFILL_THRESHOLD_DEFAULT),
                mUsapPoolSizeMax);
            }

            final String usapPoolRefillDelayMsPropString = Zygote.getConfigurationProperty(
                    ZygoteConfig.USAP_POOL_REFILL_DELAY_MS, USAP_POOL_REFILL_DELAY_MS_DEFAULT);

            if (!usapPoolRefillDelayMsPropString.isEmpty()) {
                mUsapPoolRefillDelayMs = Integer.parseInt(usapPoolRefillDelayMsPropString);
            }
            mUsapPoolRefillDelayMs = ZygoteConfig.getInt(
                ZygoteConfig.USAP_POOL_REFILL_DELAY_MS,
                ZygoteConfig.USAP_POOL_REFILL_DELAY_MS_DEFAULT);

            // Validity check
            if (mUsapPoolSizeMin >= mUsapPoolSizeMax) {
                Log.w(TAG, "The max size of the USAP pool must be greater than the minimum size."
                        + "  Restoring default values.");

                mUsapPoolSizeMax = Integer.parseInt(USAP_POOL_SIZE_MAX_DEFAULT);
                mUsapPoolSizeMin = Integer.parseInt(USAP_POOL_SIZE_MIN_DEFAULT);
                mUsapPoolSizeMax = ZygoteConfig.USAP_POOL_SIZE_MAX_DEFAULT;
                mUsapPoolSizeMin = ZygoteConfig.USAP_POOL_SIZE_MIN_DEFAULT;
                mUsapPoolRefillThreshold = mUsapPoolSizeMax / 2;
            }
        }