summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/os/ZygoteProcess.java17
-rw-r--r--core/java/com/android/internal/os/ZygoteConfig.java75
-rw-r--r--core/java/com/android/internal/os/ZygoteServer.java73
3 files changed, 98 insertions, 67 deletions
diff --git a/core/java/android/os/ZygoteProcess.java b/core/java/android/os/ZygoteProcess.java
index bf2898137967..3cb5c60259eb 100644
--- a/core/java/android/os/ZygoteProcess.java
+++ b/core/java/android/os/ZygoteProcess.java
@@ -82,13 +82,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.
*/
private final LocalSocketAddress mZygoteSocketAddress;
@@ -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;
diff --git a/core/java/com/android/internal/os/ZygoteConfig.java b/core/java/com/android/internal/os/ZygoteConfig.java
index 6ebcae182b11..e5dc874d1f90 100644
--- a/core/java/com/android/internal/os/ZygoteConfig.java
+++ b/core/java/com/android/internal/os/ZygoteConfig.java
@@ -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);
+ }
+ }
}
diff --git a/core/java/com/android/internal/os/ZygoteServer.java b/core/java/com/android/internal/os/ZygoteServer.java
index 4d2266b2eba5..f8598f2f471a 100644
--- a/core/java/com/android/internal/os/ZygoteServer.java
+++ b/core/java/com/android/internal/os/ZygoteServer.java
@@ -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);
-
- 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(
+ mUsapPoolSizeMax = Integer.min(
+ ZygoteConfig.getInt(
+ ZygoteConfig.USAP_POOL_SIZE_MAX,
+ ZygoteConfig.USAP_POOL_SIZE_MAX_DEFAULT),
+ ZygoteConfig.USAP_POOL_SIZE_MAX_LIMIT);
+
+ mUsapPoolSizeMin = Integer.max(
+ ZygoteConfig.getInt(
+ ZygoteConfig.USAP_POOL_SIZE_MIN,
+ ZygoteConfig.USAP_POOL_SIZE_MIN_DEFAULT),
+ ZygoteConfig.USAP_POOL_SIZE_MIN_LIMIT);
+
+ mUsapPoolRefillThreshold = Integer.min(
+ ZygoteConfig.getInt(
ZygoteConfig.USAP_POOL_REFILL_THRESHOLD,
- Integer.toString(mUsapPoolSizeMax / 2));
+ ZygoteConfig.USAP_POOL_REFILL_THRESHOLD_DEFAULT),
+ mUsapPoolSizeMax);
- if (!usapPoolRefillThresholdPropString.isEmpty()) {
- mUsapPoolRefillThreshold = Integer.min(
- Integer.parseInt(usapPoolRefillThresholdPropString),
- 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;
}
}