summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerConstants.java109
1 files changed, 109 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/am/ActivityManagerConstants.java b/services/core/java/com/android/server/am/ActivityManagerConstants.java
index 003f7f0d88fb..8b5b795b8ff5 100644
--- a/services/core/java/com/android/server/am/ActivityManagerConstants.java
+++ b/services/core/java/com/android/server/am/ActivityManagerConstants.java
@@ -318,6 +318,12 @@ final class ActivityManagerConstants extends ContentObserver {
"deferred_fgs_notification_interval";
/**
+ * Same as {@link #KEY_DEFERRED_FGS_NOTIFICATION_INTERVAL} but for "short FGS".
+ */
+ private static final String KEY_DEFERRED_FGS_NOTIFICATION_INTERVAL_FOR_SHORT =
+ "deferred_fgs_notification_interval_for_short";
+
+ /**
* Time in milliseconds; once an FGS notification for a given uid has been
* deferred, no subsequent FGS notification from that uid will be deferred
* until this amount of time has passed. Default is two minutes
@@ -327,6 +333,12 @@ final class ActivityManagerConstants extends ContentObserver {
"deferred_fgs_notification_exclusion_time";
/**
+ * Same as {@link #KEY_DEFERRED_FGS_NOTIFICATION_EXCLUSION_TIME} but for "short FGS".
+ */
+ private static final String KEY_DEFERRED_FGS_NOTIFICATION_EXCLUSION_TIME_FOR_SHORT =
+ "deferred_fgs_notification_exclusion_time_for_short";
+
+ /**
* Default value for mPushMessagingOverQuotaBehavior if not explicitly set in
* Settings.Global.
*/
@@ -583,11 +595,22 @@ final class ActivityManagerConstants extends ContentObserver {
// the foreground state.
volatile long mFgsNotificationDeferralInterval = 10_000;
+ /**
+ * Same as {@link #mFgsNotificationDeferralInterval} but used for "short FGS".
+ */
+ volatile long mFgsNotificationDeferralIntervalForShort = mFgsNotificationDeferralInterval;
+
// Rate limit: minimum time after an app's FGS notification is deferred
// before another FGS notification from that app can be deferred.
volatile long mFgsNotificationDeferralExclusionTime = 2 * 60 * 1000L;
/**
+ * Same as {@link #mFgsNotificationDeferralExclusionTime} but used for "short FGS".
+ */
+ volatile long mFgsNotificationDeferralExclusionTimeForShort =
+ mFgsNotificationDeferralExclusionTime;
+
+ /**
* When server pushing message is over the quote, select one of the temp allow list type as
* defined in {@link PowerExemptionManager.TempAllowListType}
*/
@@ -923,6 +946,32 @@ final class ActivityManagerConstants extends ContentObserver {
public static boolean PROACTIVE_KILLS_ENABLED = DEFAULT_PROACTIVE_KILLS_ENABLED;
public static float LOW_SWAP_THRESHOLD_PERCENT = DEFAULT_LOW_SWAP_THRESHOLD_PERCENT;
+ /** Timeout for a "short service" FGS, in milliseconds. */
+ private static final String KEY_SHORT_FGS_TIMEOUT_DURATION =
+ "short_fgs_timeout_duration";
+
+ /** @see #KEY_SHORT_FGS_TIMEOUT_DURATION */
+ static final long DEFAULT_SHORT_FGS_TIMEOUT_DURATION = 60_000;
+
+ /** @see #KEY_SHORT_FGS_TIMEOUT_DURATION */
+ public static volatile long mShortFgsTimeoutDuration = DEFAULT_SHORT_FGS_TIMEOUT_DURATION;
+
+ /**
+ * If a "short service" doesn't finish within this after the timeout (
+ * {@link #KEY_SHORT_FGS_TIMEOUT_DURATION}), then we'll declare an ANR.
+ * i.e. if the timeout is 60 seconds, and this ANR extra duration is 5 seconds, then
+ * the app will be ANR'ed in 65 seconds after a short service starts and it's not stopped.
+ */
+ private static final String KEY_SHORT_FGS_ANR_EXTRA_WAIT_DURATION =
+ "short_fgs_anr_extra_wait_duration";
+
+ /** @see #KEY_SHORT_FGS_ANR_EXTRA_WAIT_DURATION */
+ static final long DEFAULT_SHORT_FGS_ANR_EXTRA_WAIT_DURATION = 5_000;
+
+ /** @see #KEY_SHORT_FGS_ANR_EXTRA_WAIT_DURATION */
+ public static volatile long mShortFgsAnrExtraWaitDuration =
+ DEFAULT_SHORT_FGS_ANR_EXTRA_WAIT_DURATION;
+
private final OnPropertiesChangedListener mOnDeviceConfigChangedListener =
new OnPropertiesChangedListener() {
@Override
@@ -962,6 +1011,12 @@ final class ActivityManagerConstants extends ContentObserver {
case KEY_DEFERRED_FGS_NOTIFICATION_EXCLUSION_TIME:
updateFgsNotificationDeferralExclusionTime();
break;
+ case KEY_DEFERRED_FGS_NOTIFICATION_INTERVAL_FOR_SHORT:
+ updateFgsNotificationDeferralIntervalForShort();
+ break;
+ case KEY_DEFERRED_FGS_NOTIFICATION_EXCLUSION_TIME_FOR_SHORT:
+ updateFgsNotificationDeferralExclusionTimeForShort();
+ break;
case KEY_PUSH_MESSAGING_OVER_QUOTA_BEHAVIOR:
updatePushMessagingOverQuotaBehavior();
break;
@@ -1058,6 +1113,12 @@ final class ActivityManagerConstants extends ContentObserver {
case KEY_MAX_SERVICE_CONNECTIONS_PER_PROCESS:
updateMaxServiceConnectionsPerProcess();
break;
+ case KEY_SHORT_FGS_TIMEOUT_DURATION:
+ updateShortFgsTimeoutDuration();
+ break;
+ case KEY_SHORT_FGS_ANR_EXTRA_WAIT_DURATION:
+ updateShortFgsAnrExtraWaitDuration();
+ break;
case KEY_PROACTIVE_KILLS_ENABLED:
updateProactiveKillsEnabled();
break;
@@ -1374,6 +1435,13 @@ final class ActivityManagerConstants extends ContentObserver {
/*default value*/ 10_000L);
}
+ private void updateFgsNotificationDeferralIntervalForShort() {
+ mFgsNotificationDeferralIntervalForShort = DeviceConfig.getLong(
+ DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ KEY_DEFERRED_FGS_NOTIFICATION_INTERVAL_FOR_SHORT,
+ /*default value*/ 10_000L);
+ }
+
private void updateFgsNotificationDeferralExclusionTime() {
mFgsNotificationDeferralExclusionTime = DeviceConfig.getLong(
DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
@@ -1381,6 +1449,13 @@ final class ActivityManagerConstants extends ContentObserver {
/*default value*/ 2 * 60 * 1000L);
}
+ private void updateFgsNotificationDeferralExclusionTimeForShort() {
+ mFgsNotificationDeferralExclusionTimeForShort = DeviceConfig.getLong(
+ DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ KEY_DEFERRED_FGS_NOTIFICATION_EXCLUSION_TIME_FOR_SHORT,
+ /*default value*/ 2 * 60 * 1000L);
+ }
+
private void updatePushMessagingOverQuotaBehavior() {
mPushMessagingOverQuotaBehavior = DeviceConfig.getInt(
DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
@@ -1746,6 +1821,20 @@ final class ActivityManagerConstants extends ContentObserver {
DEFAULT_MAX_SERVICE_CONNECTIONS_PER_PROCESS);
}
+ private void updateShortFgsTimeoutDuration() {
+ mShortFgsTimeoutDuration = DeviceConfig.getLong(
+ DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ KEY_SHORT_FGS_TIMEOUT_DURATION,
+ DEFAULT_SHORT_FGS_TIMEOUT_DURATION);
+ }
+
+ private void updateShortFgsAnrExtraWaitDuration() {
+ mShortFgsAnrExtraWaitDuration = DeviceConfig.getLong(
+ DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ KEY_SHORT_FGS_ANR_EXTRA_WAIT_DURATION,
+ DEFAULT_SHORT_FGS_ANR_EXTRA_WAIT_DURATION);
+ }
+
@NeverCompile // Avoid size overhead of debugging code.
void dump(PrintWriter pw) {
pw.println("ACTIVITY MANAGER SETTINGS (dumpsys activity settings) "
@@ -1903,6 +1992,26 @@ final class ActivityManagerConstants extends ContentObserver {
pw.print(" "); pw.print(KEY_LOW_SWAP_THRESHOLD_PERCENT);
pw.print("="); pw.println(LOW_SWAP_THRESHOLD_PERCENT);
+ pw.print(" "); pw.print(KEY_DEFERRED_FGS_NOTIFICATIONS_ENABLED);
+ pw.print("="); pw.println(mFlagFgsNotificationDeferralEnabled);
+ pw.print(" "); pw.print(KEY_DEFERRED_FGS_NOTIFICATIONS_API_GATED);
+ pw.print("="); pw.println(mFlagFgsNotificationDeferralApiGated);
+
+ pw.print(" "); pw.print(KEY_DEFERRED_FGS_NOTIFICATION_INTERVAL);
+ pw.print("="); pw.println(mFgsNotificationDeferralInterval);
+ pw.print(" "); pw.print(KEY_DEFERRED_FGS_NOTIFICATION_INTERVAL_FOR_SHORT);
+ pw.print("="); pw.println(mFgsNotificationDeferralIntervalForShort);
+
+ pw.print(" "); pw.print(KEY_DEFERRED_FGS_NOTIFICATION_EXCLUSION_TIME);
+ pw.print("="); pw.println(mFgsNotificationDeferralExclusionTime);
+ pw.print(" "); pw.print(KEY_DEFERRED_FGS_NOTIFICATION_EXCLUSION_TIME_FOR_SHORT);
+ pw.print("="); pw.println(mFgsNotificationDeferralExclusionTimeForShort);
+
+ pw.print(" "); pw.print(KEY_SHORT_FGS_TIMEOUT_DURATION);
+ pw.print("="); pw.println(mShortFgsTimeoutDuration);
+ pw.print(" "); pw.print(KEY_SHORT_FGS_ANR_EXTRA_WAIT_DURATION);
+ pw.print("="); pw.println(mShortFgsAnrExtraWaitDuration);
+
pw.println();
if (mOverrideMaxCachedProcesses >= 0) {
pw.print(" mOverrideMaxCachedProcesses="); pw.println(mOverrideMaxCachedProcesses);