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

Commit a2143c07 authored by Chris Wailes's avatar Chris Wailes Committed by Gerrit Code Review
Browse files

Merge "Add System Properties based settings for USAPs"

parents ba550748 e05e1fff
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;
            }
        }