diff options
3 files changed, 19 insertions, 9 deletions
diff --git a/services/core/java/com/android/server/am/ActivityManagerConstants.java b/services/core/java/com/android/server/am/ActivityManagerConstants.java index e9539be8b0d5..fede1d2832b8 100644 --- a/services/core/java/com/android/server/am/ActivityManagerConstants.java +++ b/services/core/java/com/android/server/am/ActivityManagerConstants.java @@ -89,6 +89,7 @@ final class ActivityManagerConstants extends ContentObserver { static final String KEY_MEMORY_INFO_THROTTLE_TIME = "memory_info_throttle_time"; static final String KEY_TOP_TO_FGS_GRACE_DURATION = "top_to_fgs_grace_duration"; static final String KEY_PENDINGINTENT_WARNING_THRESHOLD = "pendingintent_warning_threshold"; + static final String KEY_MIN_CRASH_INTERVAL = "min_crash_interval"; private static final int DEFAULT_MAX_CACHED_PROCESSES = 32; private static final long DEFAULT_BACKGROUND_SETTLE_TIME = 60*1000; @@ -122,6 +123,8 @@ final class ActivityManagerConstants extends ContentObserver { private static final long DEFAULT_MEMORY_INFO_THROTTLE_TIME = 5*60*1000; private static final long DEFAULT_TOP_TO_FGS_GRACE_DURATION = 15 * 1000; private static final int DEFAULT_PENDINGINTENT_WARNING_THRESHOLD = 2000; + private static final int DEFAULT_MIN_CRASH_INTERVAL = 2 * 60 * 1000; + // Flag stored in the DeviceConfig API. /** @@ -281,6 +284,12 @@ final class ActivityManagerConstants extends ContentObserver { // this long. public long TOP_TO_FGS_GRACE_DURATION = DEFAULT_TOP_TO_FGS_GRACE_DURATION; + /** + * The minimum time we allow between crashes, for us to consider this + * application to be bad and stop its services and reject broadcasts. + */ + public static int MIN_CRASH_INTERVAL = DEFAULT_MIN_CRASH_INTERVAL; + // Indicates whether the activity starts logging is enabled. // Controlled by Settings.Global.ACTIVITY_STARTS_LOGGING_ENABLED volatile boolean mFlagActivityStartsLoggingEnabled; @@ -650,6 +659,8 @@ final class ActivityManagerConstants extends ContentObserver { DEFAULT_MEMORY_INFO_THROTTLE_TIME); TOP_TO_FGS_GRACE_DURATION = mParser.getDurationMillis(KEY_TOP_TO_FGS_GRACE_DURATION, DEFAULT_TOP_TO_FGS_GRACE_DURATION); + MIN_CRASH_INTERVAL = mParser.getInt(KEY_MIN_CRASH_INTERVAL, + DEFAULT_MIN_CRASH_INTERVAL); PENDINGINTENT_WARNING_THRESHOLD = mParser.getInt(KEY_PENDINGINTENT_WARNING_THRESHOLD, DEFAULT_PENDINGINTENT_WARNING_THRESHOLD); @@ -866,6 +877,8 @@ final class ActivityManagerConstants extends ContentObserver { pw.println(MEMORY_INFO_THROTTLE_TIME); pw.print(" "); pw.print(KEY_TOP_TO_FGS_GRACE_DURATION); pw.print("="); pw.println(TOP_TO_FGS_GRACE_DURATION); + pw.print(" "); pw.print(KEY_MIN_CRASH_INTERVAL); pw.print("="); + pw.println(MIN_CRASH_INTERVAL); pw.print(" "); pw.print(KEY_IMPERCEPTIBLE_KILL_EXEMPT_PROC_STATES); pw.print("="); pw.println(Arrays.toString(IMPERCEPTIBLE_KILL_EXEMPT_PROC_STATES.toArray())); pw.print(" "); pw.print(KEY_IMPERCEPTIBLE_KILL_EXEMPT_PACKAGES); pw.print("="); diff --git a/services/core/java/com/android/server/am/AppErrors.java b/services/core/java/com/android/server/am/AppErrors.java index 2e92ac0fb3d6..5268359df327 100644 --- a/services/core/java/com/android/server/am/AppErrors.java +++ b/services/core/java/com/android/server/am/AppErrors.java @@ -716,7 +716,7 @@ class AppErrors { // back in the pending list. ServiceRecord sr = app.getRunningServiceAt(i); // If the service was restarted a while ago, then reset crash count, else increment it. - if (now > sr.restartTime + ProcessList.MIN_CRASH_INTERVAL) { + if (now > sr.restartTime + ActivityManagerConstants.MIN_CRASH_INTERVAL) { sr.crashCount = 1; } else { sr.crashCount++; @@ -729,7 +729,7 @@ class AppErrors { } } - if (crashTime != null && now < crashTime + ProcessList.MIN_CRASH_INTERVAL) { + if (crashTime != null && now < crashTime + ActivityManagerConstants.MIN_CRASH_INTERVAL) { // The process crashed again very quickly. If it was a bound foreground service, let's // try to restart again in a while, otherwise the process loses! Slog.w(TAG, "Process " + app.processName @@ -771,7 +771,7 @@ class AppErrors { data.taskId = affectedTaskId; } if (data != null && crashTimePersistent != null - && now < crashTimePersistent + ProcessList.MIN_CRASH_INTERVAL) { + && now < crashTimePersistent + ActivityManagerConstants.MIN_CRASH_INTERVAL) { data.repeating = true; } } @@ -853,7 +853,7 @@ class AppErrors { mAppsNotReportingCrashes.contains(proc.info.packageName); final long now = SystemClock.uptimeMillis(); final boolean shouldThottle = crashShowErrorTime != null - && now < crashShowErrorTime + ProcessList.MIN_CRASH_INTERVAL; + && now < crashShowErrorTime + ActivityManagerConstants.MIN_CRASH_INTERVAL; if ((mService.mAtmInternal.canShowErrorDialogs() || showBackground) && !crashSilenced && !shouldThottle && (showFirstCrash || showFirstCrashDevOption || data.repeating)) { diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java index 4673ecde7a68..76089f8fba01 100644 --- a/services/core/java/com/android/server/am/ProcessList.java +++ b/services/core/java/com/android/server/am/ProcessList.java @@ -154,10 +154,6 @@ public final class ProcessList { static final String ANDROID_VOLD_APP_DATA_ISOLATION_ENABLED_PROPERTY = "persist.sys.vold_app_data_isolation_enabled"; - // The minimum time we allow between crashes, for us to consider this - // application to be bad and stop and its services and reject broadcasts. - static final int MIN_CRASH_INTERVAL = 60 * 1000; - // OOM adjustments for processes in various states: // Uninitialized value for any major or minor adj fields @@ -4070,7 +4066,8 @@ public final class ProcessList { boolean enqueueLocked(ProcessRecord app, String reason, int requester) { // Throttle the killing request for potential bad app to avoid cpu thrashing Long last = app.isolated ? null : mLastProcessKillTimes.get(app.processName, app.uid); - if (last != null && SystemClock.uptimeMillis() < last + MIN_CRASH_INTERVAL) { + if ((last != null) && (SystemClock.uptimeMillis() + < (last + ActivityManagerConstants.MIN_CRASH_INTERVAL))) { return false; } |