blob: 030d596a1676971a748991bb617e2aff08ce1259 [file] [log] [blame]
/*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.server.am;
import static android.provider.DeviceConfig.NAMESPACE_ACTIVITY_MANAGER_NATIVE_BOOT;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.app.ActivityManager;
import android.compat.annotation.ChangeId;
import android.compat.annotation.EnabledAfter;
import android.compat.annotation.Overridable;
import android.content.ContentResolver;
import android.database.ContentObserver;
import android.os.Build;
import android.os.Handler;
import android.os.HandlerExecutor;
import android.os.SystemProperties;
import android.provider.DeviceConfig;
import android.provider.Settings;
import android.util.IndentingPrintWriter;
import android.util.KeyValueListParser;
import android.util.Slog;
import android.util.TimeUtils;
import dalvik.annotation.optimization.NeverCompile;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
* Tunable parameters for broadcast dispatch policy
*/
public class BroadcastConstants {
private static final String TAG = "BroadcastConstants";
// TODO: migrate remaining constants to be loaded from DeviceConfig
// TODO: migrate fg/bg values into single constants instance
// Value element names within the Settings record
static final String KEY_TIMEOUT = "bcast_timeout";
static final String KEY_SLOW_TIME = "bcast_slow_time";
static final String KEY_DEFERRAL = "bcast_deferral";
static final String KEY_DEFERRAL_DECAY_FACTOR = "bcast_deferral_decay_factor";
static final String KEY_DEFERRAL_FLOOR = "bcast_deferral_floor";
static final String KEY_ALLOW_BG_ACTIVITY_START_TIMEOUT =
"bcast_allow_bg_activity_start_timeout";
// All time intervals are in milliseconds
private static final long DEFAULT_TIMEOUT = 10_000 * Build.HW_TIMEOUT_MULTIPLIER;
private static final long DEFAULT_SLOW_TIME = 5_000 * Build.HW_TIMEOUT_MULTIPLIER;
private static final long DEFAULT_DEFERRAL = 5_000 * Build.HW_TIMEOUT_MULTIPLIER;
private static final float DEFAULT_DEFERRAL_DECAY_FACTOR = 0.75f;
private static final long DEFAULT_DEFERRAL_FLOOR = 0;
private static final long DEFAULT_ALLOW_BG_ACTIVITY_START_TIMEOUT =
10_000 * Build.HW_TIMEOUT_MULTIPLIER;
/**
* Defer LOCKED_BOOT_COMPLETED and BOOT_COMPLETED broadcasts until the first time any process in
* the UID is started.
*/
@ChangeId
@EnabledAfter(targetSdkVersion = android.os.Build.VERSION_CODES.S_V2)
@Overridable
static final long DEFER_BOOT_COMPLETED_BROADCAST_CHANGE_ID = 203704822L;
/**
* Do not defer LOCKED_BOOT_COMPLETED and BOOT_COMPLETED broadcasts.
*/
public static final int DEFER_BOOT_COMPLETED_BROADCAST_NONE = 0;
/**
* Defer all LOCKED_BOOT_COMPLETED and BOOT_COMPLETED broadcasts.
*/
public static final int DEFER_BOOT_COMPLETED_BROADCAST_ALL = 1 << 0;
/**
* Defer LOCKED_BOOT_COMPLETED and BOOT_COMPLETED broadcasts if app is background restricted.
*/
public static final int DEFER_BOOT_COMPLETED_BROADCAST_BACKGROUND_RESTRICTED_ONLY = 1 << 1;
/**
* Defer LOCKED_BOOT_COMPLETED and BOOT_COMPLETED broadcasts if app's targetSdkVersion is T
* and above.
*/
public static final int DEFER_BOOT_COMPLETED_BROADCAST_TARGET_T_ONLY = 1 << 2;
/**
* The list of DEFER_BOOT_COMPLETED_BROADCAST types.
* If multiple flags are selected, all conditions must be met to defer the broadcast.
* @hide
*/
@IntDef(flag = true, prefix = { "DEFER_BOOT_COMPLETED_BROADCAST_" }, value = {
DEFER_BOOT_COMPLETED_BROADCAST_NONE,
DEFER_BOOT_COMPLETED_BROADCAST_ALL,
DEFER_BOOT_COMPLETED_BROADCAST_BACKGROUND_RESTRICTED_ONLY,
DEFER_BOOT_COMPLETED_BROADCAST_TARGET_T_ONLY,
})
@Retention(RetentionPolicy.SOURCE)
public @interface DeferBootCompletedBroadcastType {}
// All time constants are in milliseconds
// Timeout period for this broadcast queue
public long TIMEOUT = DEFAULT_TIMEOUT;
// Handling time above which we declare that a broadcast recipient was "slow". Any
// value <= zero is interpreted as disabling broadcast deferral policy entirely.
public long SLOW_TIME = DEFAULT_SLOW_TIME;
// How long to initially defer broadcasts, if an app is slow to handle one
public long DEFERRAL = DEFAULT_DEFERRAL;
// Decay factor for successive broadcasts' deferral time
public float DEFERRAL_DECAY_FACTOR = DEFAULT_DEFERRAL_DECAY_FACTOR;
// Minimum that the deferral time can decay to until the backlog fully clears
public long DEFERRAL_FLOOR = DEFAULT_DEFERRAL_FLOOR;
// For a receiver that has been allowed to start background activities, how long after it
// started its process can start a background activity.
public long ALLOW_BG_ACTIVITY_START_TIMEOUT = DEFAULT_ALLOW_BG_ACTIVITY_START_TIMEOUT;
/**
* Flag indicating if we should use {@link BroadcastQueueModernImpl} instead
* of the default {@link BroadcastQueueImpl}.
*/
public boolean MODERN_QUEUE_ENABLED = DEFAULT_MODERN_QUEUE_ENABLED;
private static final String KEY_MODERN_QUEUE_ENABLED = "modern_queue_enabled";
private static final boolean DEFAULT_MODERN_QUEUE_ENABLED = true;
/**
* For {@link BroadcastQueueModernImpl}: Maximum dispatch parallelism
* that we'll tolerate for ordinary broadcast dispatch.
*/
public int MAX_RUNNING_PROCESS_QUEUES = DEFAULT_MAX_RUNNING_PROCESS_QUEUES;
private static final String KEY_MAX_RUNNING_PROCESS_QUEUES = "bcast_max_running_process_queues";
private static final int DEFAULT_MAX_RUNNING_PROCESS_QUEUES =
ActivityManager.isLowRamDeviceStatic() ? 2 : 4;
/**
* For {@link BroadcastQueueModernImpl}: Additional running process queue parallelism beyond
* {@link #MAX_RUNNING_PROCESS_QUEUES} for dispatch of "urgent" broadcasts.
*/
public int EXTRA_RUNNING_URGENT_PROCESS_QUEUES = DEFAULT_EXTRA_RUNNING_URGENT_PROCESS_QUEUES;
private static final String KEY_EXTRA_RUNNING_URGENT_PROCESS_QUEUES =
"bcast_extra_running_urgent_process_queues";
private static final int DEFAULT_EXTRA_RUNNING_URGENT_PROCESS_QUEUES = 1;
/**
* For {@link BroadcastQueueModernImpl}: Maximum number of consecutive urgent
* broadcast dispatches allowed before letting broadcasts in lower priority queue
* to be scheduled in order to avoid starvation.
*/
public int MAX_CONSECUTIVE_URGENT_DISPATCHES = DEFAULT_MAX_CONSECUTIVE_URGENT_DISPATCHES;
private static final String KEY_MAX_CONSECUTIVE_URGENT_DISPATCHES =
"bcast_max_consecutive_urgent_dispatches";
private static final int DEFAULT_MAX_CONSECUTIVE_URGENT_DISPATCHES = 3;
/**
* For {@link BroadcastQueueModernImpl}: Maximum number of consecutive normal
* broadcast dispatches allowed before letting broadcasts in lower priority queue
* to be scheduled in order to avoid starvation.
*/
public int MAX_CONSECUTIVE_NORMAL_DISPATCHES = DEFAULT_MAX_CONSECUTIVE_NORMAL_DISPATCHES;
private static final String KEY_MAX_CONSECUTIVE_NORMAL_DISPATCHES =
"bcast_max_consecutive_normal_dispatches";
private static final int DEFAULT_MAX_CONSECUTIVE_NORMAL_DISPATCHES = 10;
/**
* For {@link BroadcastQueueModernImpl}: Maximum number of active broadcasts
* to dispatch to a "running" process queue before we retire them back to
* being "runnable" to give other processes a chance to run.
*/
public int MAX_RUNNING_ACTIVE_BROADCASTS = DEFAULT_MAX_RUNNING_ACTIVE_BROADCASTS;
private static final String KEY_MAX_RUNNING_ACTIVE_BROADCASTS =
"bcast_max_running_active_broadcasts";
private static final int DEFAULT_MAX_RUNNING_ACTIVE_BROADCASTS =
ActivityManager.isLowRamDeviceStatic() ? 8 : 16;
/**
* For {@link BroadcastQueueModernImpl}: Maximum number of active "blocking" broadcasts
* to dispatch to a "running" System process queue before we retire them back to
* being "runnable" to give other processes a chance to run. Here "blocking" refers to
* whether or not we are going to block on the finishReceiver() to be called before moving
* to the next broadcast.
*/
public int MAX_CORE_RUNNING_BLOCKING_BROADCASTS = DEFAULT_MAX_CORE_RUNNING_BLOCKING_BROADCASTS;
private static final String KEY_CORE_MAX_RUNNING_BLOCKING_BROADCASTS =
"bcast_max_core_running_blocking_broadcasts";
private static final int DEFAULT_MAX_CORE_RUNNING_BLOCKING_BROADCASTS =
ActivityManager.isLowRamDeviceStatic() ? 8 : 16;
/**
* For {@link BroadcastQueueModernImpl}: Maximum number of active non-"blocking" broadcasts
* to dispatch to a "running" System process queue before we retire them back to
* being "runnable" to give other processes a chance to run. Here "blocking" refers to
* whether or not we are going to block on the finishReceiver() to be called before moving
* to the next broadcast.
*/
public int MAX_CORE_RUNNING_NON_BLOCKING_BROADCASTS =
DEFAULT_MAX_CORE_RUNNING_NON_BLOCKING_BROADCASTS;
private static final String KEY_CORE_MAX_RUNNING_NON_BLOCKING_BROADCASTS =
"bcast_max_core_running_non_blocking_broadcasts";
private static final int DEFAULT_MAX_CORE_RUNNING_NON_BLOCKING_BROADCASTS =
ActivityManager.isLowRamDeviceStatic() ? 32 : 64;
/**
* For {@link BroadcastQueueModernImpl}: Maximum number of pending
* broadcasts to hold for a process before we ignore any delays that policy
* might have applied to that process.
*/
public int MAX_PENDING_BROADCASTS = DEFAULT_MAX_PENDING_BROADCASTS;
private static final String KEY_MAX_PENDING_BROADCASTS = "bcast_max_pending_broadcasts";
private static final int DEFAULT_MAX_PENDING_BROADCASTS =
ActivityManager.isLowRamDeviceStatic() ? 128 : 256;
/**
* For {@link BroadcastQueueModernImpl}: Delay to apply to normal
* broadcasts, giving a chance for debouncing of rapidly changing events.
*/
public long DELAY_NORMAL_MILLIS = DEFAULT_DELAY_NORMAL_MILLIS;
private static final String KEY_DELAY_NORMAL_MILLIS = "bcast_delay_normal_millis";
private static final long DEFAULT_DELAY_NORMAL_MILLIS = +500;
/**
* For {@link BroadcastQueueModernImpl}: Delay to apply to broadcasts
* targeting cached applications.
*/
public long DELAY_CACHED_MILLIS = DEFAULT_DELAY_CACHED_MILLIS;
private static final String KEY_DELAY_CACHED_MILLIS = "bcast_delay_cached_millis";
private static final long DEFAULT_DELAY_CACHED_MILLIS = +120_000;
/**
* For {@link BroadcastQueueModernImpl}: Delay to apply to urgent
* broadcasts, typically a negative value to indicate they should be
* executed before most other pending broadcasts.
*/
public long DELAY_URGENT_MILLIS = DEFAULT_DELAY_URGENT_MILLIS;
private static final String KEY_DELAY_URGENT_MILLIS = "bcast_delay_urgent_millis";
private static final long DEFAULT_DELAY_URGENT_MILLIS = -120_000;
/**
* For {@link BroadcastQueueModernImpl}: Delay to apply to broadcasts to
* foreground processes, typically a negative value to indicate they should be
* executed before most other pending broadcasts.
*/
public long DELAY_FOREGROUND_PROC_MILLIS = DEFAULT_DELAY_FOREGROUND_PROC_MILLIS;
private static final String KEY_DELAY_FOREGROUND_PROC_MILLIS =
"bcast_delay_foreground_proc_millis";
private static final long DEFAULT_DELAY_FOREGROUND_PROC_MILLIS = -120_000;
/**
* For {@link BroadcastQueueModernImpl}: Delay to apply to broadcasts to
* persistent processes, typically a negative value to indicate they should be
* executed before most other pending broadcasts.
*/
public long DELAY_PERSISTENT_PROC_MILLIS = DEFAULT_DELAY_FOREGROUND_PROC_MILLIS;
private static final String KEY_DELAY_PERSISTENT_PROC_MILLIS =
"bcast_delay_persistent_proc_millis";
private static final long DEFAULT_DELAY_PERSISTENT_PROC_MILLIS = -120_000;
/**
* For {@link BroadcastQueueModernImpl}: Maximum number of complete
* historical broadcasts to retain for debugging purposes.
*/
public int MAX_HISTORY_COMPLETE_SIZE = DEFAULT_MAX_HISTORY_COMPLETE_SIZE;
private static final String KEY_MAX_HISTORY_COMPLETE_SIZE = "bcast_max_history_complete_size";
private static final int DEFAULT_MAX_HISTORY_COMPLETE_SIZE =
ActivityManager.isLowRamDeviceStatic() ? 64 : 256;
/**
* For {@link BroadcastQueueModernImpl}: Maximum number of summarized
* historical broadcasts to retain for debugging purposes.
*/
public int MAX_HISTORY_SUMMARY_SIZE = DEFAULT_MAX_HISTORY_SUMMARY_SIZE;
private static final String KEY_MAX_HISTORY_SUMMARY_SIZE = "bcast_max_history_summary_size";
private static final int DEFAULT_MAX_HISTORY_SUMMARY_SIZE =
ActivityManager.isLowRamDeviceStatic() ? 256 : 1024;
/**
* For {@link BroadcastRecord}: Default to treating all broadcasts sent by
* the system as be {@link BroadcastOptions#DEFERRAL_POLICY_UNTIL_ACTIVE}.
*/
public boolean CORE_DEFER_UNTIL_ACTIVE = DEFAULT_CORE_DEFER_UNTIL_ACTIVE;
private static final String KEY_CORE_DEFER_UNTIL_ACTIVE = "bcast_core_defer_until_active";
private static final boolean DEFAULT_CORE_DEFER_UNTIL_ACTIVE = true;
// Settings override tracking for this instance
private String mSettingsKey;
private SettingsObserver mSettingsObserver;
private ContentResolver mResolver;
private final KeyValueListParser mParser = new KeyValueListParser(',');
class SettingsObserver extends ContentObserver {
SettingsObserver(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
updateSettingsConstants();
}
}
// A given constants instance is configured to observe specific keys from which
// that instance's values are drawn.
public BroadcastConstants(String settingsKey) {
mSettingsKey = settingsKey;
// Load initial values at least once before we start observing below
updateDeviceConfigConstants();
}
/**
* Spin up the observer lazily, since it can only happen once the settings provider
* has been brought into service
*/
public void startObserving(Handler handler, ContentResolver resolver) {
mResolver = resolver;
mSettingsObserver = new SettingsObserver(handler);
mResolver.registerContentObserver(Settings.Global.getUriFor(mSettingsKey),
false, mSettingsObserver);
updateSettingsConstants();
DeviceConfig.addOnPropertiesChangedListener(NAMESPACE_ACTIVITY_MANAGER_NATIVE_BOOT,
new HandlerExecutor(handler), this::updateDeviceConfigConstants);
updateDeviceConfigConstants();
}
public int getMaxRunningQueues() {
return MAX_RUNNING_PROCESS_QUEUES + EXTRA_RUNNING_URGENT_PROCESS_QUEUES;
}
private void updateSettingsConstants() {
synchronized (this) {
try {
mParser.setString(Settings.Global.getString(mResolver, mSettingsKey));
} catch (IllegalArgumentException e) {
Slog.e(TAG, "Bad broadcast settings in key '" + mSettingsKey + "'", e);
return;
}
// Unspecified fields retain their current value rather than revert to default
TIMEOUT = mParser.getLong(KEY_TIMEOUT, TIMEOUT);
SLOW_TIME = mParser.getLong(KEY_SLOW_TIME, SLOW_TIME);
DEFERRAL = mParser.getLong(KEY_DEFERRAL, DEFERRAL);
DEFERRAL_DECAY_FACTOR = mParser.getFloat(KEY_DEFERRAL_DECAY_FACTOR,
DEFERRAL_DECAY_FACTOR);
DEFERRAL_FLOOR = mParser.getLong(KEY_DEFERRAL_FLOOR, DEFERRAL_FLOOR);
ALLOW_BG_ACTIVITY_START_TIMEOUT = mParser.getLong(KEY_ALLOW_BG_ACTIVITY_START_TIMEOUT,
ALLOW_BG_ACTIVITY_START_TIMEOUT);
}
}
/**
* Return the {@link SystemProperty} name for the given key in our
* {@link DeviceConfig} namespace.
*/
private @NonNull String propertyFor(@NonNull String key) {
return "persist.device_config." + NAMESPACE_ACTIVITY_MANAGER_NATIVE_BOOT + "." + key;
}
/**
* Return the {@link SystemProperty} name for the given key in our
* {@link DeviceConfig} namespace, but with a different prefix that can be
* used to locally override the {@link DeviceConfig} value.
*/
private @NonNull String propertyOverrideFor(@NonNull String key) {
return "persist.sys." + NAMESPACE_ACTIVITY_MANAGER_NATIVE_BOOT + "." + key;
}
private boolean getDeviceConfigBoolean(@NonNull String key, boolean def) {
return SystemProperties.getBoolean(propertyOverrideFor(key),
SystemProperties.getBoolean(propertyFor(key), def));
}
private int getDeviceConfigInt(@NonNull String key, int def) {
return SystemProperties.getInt(propertyOverrideFor(key),
SystemProperties.getInt(propertyFor(key), def));
}
private long getDeviceConfigLong(@NonNull String key, long def) {
return SystemProperties.getLong(propertyOverrideFor(key),
SystemProperties.getLong(propertyFor(key), def));
}
private void updateDeviceConfigConstants(@NonNull DeviceConfig.Properties properties) {
updateDeviceConfigConstants();
}
/**
* Since our values are stored in a "native boot" namespace, we load them
* directly from the system properties.
*/
private void updateDeviceConfigConstants() {
synchronized (this) {
MODERN_QUEUE_ENABLED = getDeviceConfigBoolean(KEY_MODERN_QUEUE_ENABLED,
DEFAULT_MODERN_QUEUE_ENABLED);
MAX_RUNNING_PROCESS_QUEUES = getDeviceConfigInt(KEY_MAX_RUNNING_PROCESS_QUEUES,
DEFAULT_MAX_RUNNING_PROCESS_QUEUES);
EXTRA_RUNNING_URGENT_PROCESS_QUEUES = getDeviceConfigInt(
KEY_EXTRA_RUNNING_URGENT_PROCESS_QUEUES,
DEFAULT_EXTRA_RUNNING_URGENT_PROCESS_QUEUES);
MAX_CONSECUTIVE_URGENT_DISPATCHES = getDeviceConfigInt(
KEY_MAX_CONSECUTIVE_URGENT_DISPATCHES,
DEFAULT_MAX_CONSECUTIVE_URGENT_DISPATCHES);
MAX_CONSECUTIVE_NORMAL_DISPATCHES = getDeviceConfigInt(
KEY_MAX_CONSECUTIVE_NORMAL_DISPATCHES,
DEFAULT_MAX_CONSECUTIVE_NORMAL_DISPATCHES);
MAX_RUNNING_ACTIVE_BROADCASTS = getDeviceConfigInt(KEY_MAX_RUNNING_ACTIVE_BROADCASTS,
DEFAULT_MAX_RUNNING_ACTIVE_BROADCASTS);
MAX_CORE_RUNNING_BLOCKING_BROADCASTS = getDeviceConfigInt(
KEY_CORE_MAX_RUNNING_BLOCKING_BROADCASTS,
DEFAULT_MAX_CORE_RUNNING_BLOCKING_BROADCASTS);
MAX_CORE_RUNNING_NON_BLOCKING_BROADCASTS = getDeviceConfigInt(
KEY_CORE_MAX_RUNNING_NON_BLOCKING_BROADCASTS,
DEFAULT_MAX_CORE_RUNNING_NON_BLOCKING_BROADCASTS);
MAX_PENDING_BROADCASTS = getDeviceConfigInt(KEY_MAX_PENDING_BROADCASTS,
DEFAULT_MAX_PENDING_BROADCASTS);
DELAY_NORMAL_MILLIS = getDeviceConfigLong(KEY_DELAY_NORMAL_MILLIS,
DEFAULT_DELAY_NORMAL_MILLIS);
DELAY_CACHED_MILLIS = getDeviceConfigLong(KEY_DELAY_CACHED_MILLIS,
DEFAULT_DELAY_CACHED_MILLIS);
DELAY_URGENT_MILLIS = getDeviceConfigLong(KEY_DELAY_URGENT_MILLIS,
DEFAULT_DELAY_URGENT_MILLIS);
DELAY_FOREGROUND_PROC_MILLIS = getDeviceConfigLong(KEY_DELAY_FOREGROUND_PROC_MILLIS,
DEFAULT_DELAY_FOREGROUND_PROC_MILLIS);
DELAY_PERSISTENT_PROC_MILLIS = getDeviceConfigLong(KEY_DELAY_PERSISTENT_PROC_MILLIS,
DEFAULT_DELAY_PERSISTENT_PROC_MILLIS);
MAX_HISTORY_COMPLETE_SIZE = getDeviceConfigInt(KEY_MAX_HISTORY_COMPLETE_SIZE,
DEFAULT_MAX_HISTORY_COMPLETE_SIZE);
MAX_HISTORY_SUMMARY_SIZE = getDeviceConfigInt(KEY_MAX_HISTORY_SUMMARY_SIZE,
DEFAULT_MAX_HISTORY_SUMMARY_SIZE);
CORE_DEFER_UNTIL_ACTIVE = getDeviceConfigBoolean(KEY_CORE_DEFER_UNTIL_ACTIVE,
DEFAULT_CORE_DEFER_UNTIL_ACTIVE);
}
// TODO: migrate BroadcastRecord to accept a BroadcastConstants
BroadcastRecord.CORE_DEFER_UNTIL_ACTIVE = CORE_DEFER_UNTIL_ACTIVE;
}
/**
* Standard dumpsys support; invoked from BroadcastQueue dump
*/
@NeverCompile
public void dump(@NonNull IndentingPrintWriter pw) {
synchronized (this) {
pw.print("Broadcast parameters (key=");
pw.print(mSettingsKey);
pw.print(", observing=");
pw.print(mSettingsObserver != null);
pw.println("):");
pw.increaseIndent();
pw.print(KEY_TIMEOUT, TimeUtils.formatDuration(TIMEOUT)).println();
pw.print(KEY_SLOW_TIME, TimeUtils.formatDuration(SLOW_TIME)).println();
pw.print(KEY_DEFERRAL, TimeUtils.formatDuration(DEFERRAL)).println();
pw.print(KEY_DEFERRAL_DECAY_FACTOR, DEFERRAL_DECAY_FACTOR).println();
pw.print(KEY_DEFERRAL_FLOOR, DEFERRAL_FLOOR).println();
pw.print(KEY_ALLOW_BG_ACTIVITY_START_TIMEOUT,
TimeUtils.formatDuration(ALLOW_BG_ACTIVITY_START_TIMEOUT)).println();
pw.decreaseIndent();
pw.println();
pw.print("Broadcast parameters (namespace=");
pw.print(NAMESPACE_ACTIVITY_MANAGER_NATIVE_BOOT);
pw.println("):");
pw.increaseIndent();
pw.print(KEY_MODERN_QUEUE_ENABLED, MODERN_QUEUE_ENABLED).println();
pw.print(KEY_MAX_RUNNING_PROCESS_QUEUES, MAX_RUNNING_PROCESS_QUEUES).println();
pw.print(KEY_MAX_RUNNING_ACTIVE_BROADCASTS, MAX_RUNNING_ACTIVE_BROADCASTS).println();
pw.print(KEY_CORE_MAX_RUNNING_BLOCKING_BROADCASTS,
MAX_CORE_RUNNING_BLOCKING_BROADCASTS).println();
pw.print(KEY_CORE_MAX_RUNNING_NON_BLOCKING_BROADCASTS,
MAX_CORE_RUNNING_NON_BLOCKING_BROADCASTS).println();
pw.print(KEY_MAX_PENDING_BROADCASTS, MAX_PENDING_BROADCASTS).println();
pw.print(KEY_DELAY_NORMAL_MILLIS,
TimeUtils.formatDuration(DELAY_NORMAL_MILLIS)).println();
pw.print(KEY_DELAY_CACHED_MILLIS,
TimeUtils.formatDuration(DELAY_CACHED_MILLIS)).println();
pw.print(KEY_DELAY_URGENT_MILLIS,
TimeUtils.formatDuration(DELAY_URGENT_MILLIS)).println();
pw.print(KEY_DELAY_FOREGROUND_PROC_MILLIS,
TimeUtils.formatDuration(DELAY_FOREGROUND_PROC_MILLIS)).println();
pw.print(KEY_DELAY_PERSISTENT_PROC_MILLIS,
TimeUtils.formatDuration(DELAY_PERSISTENT_PROC_MILLIS)).println();
pw.print(KEY_MAX_HISTORY_COMPLETE_SIZE, MAX_HISTORY_COMPLETE_SIZE).println();
pw.print(KEY_MAX_HISTORY_SUMMARY_SIZE, MAX_HISTORY_SUMMARY_SIZE).println();
pw.print(KEY_MAX_CONSECUTIVE_URGENT_DISPATCHES,
MAX_CONSECUTIVE_URGENT_DISPATCHES).println();
pw.print(KEY_MAX_CONSECUTIVE_NORMAL_DISPATCHES,
MAX_CONSECUTIVE_NORMAL_DISPATCHES).println();
pw.print(KEY_CORE_DEFER_UNTIL_ACTIVE,
CORE_DEFER_UNTIL_ACTIVE).println();
pw.decreaseIndent();
pw.println();
}
}
}