From 5693405bacfc6ae7748e940c37ae0096cb32f45e Mon Sep 17 00:00:00 2001 From: Louis Chang Date: Thu, 20 Apr 2023 03:29:35 +0000 Subject: [PATCH] Prevents system busy or restarted due to rapid activity launch loop Tracking rapid activity starts. Move the task to back and kill the app if the rapid launch count exceeds maximum. Bug: 145096943 Test: verified using a bad app Change-Id: I164596fb21df55e9daf6d28fb3664e7300eafd7e --- .../server/wm/WindowProcessController.java | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java index 85c601fe0a5c7..dbd9e4b8ea68a 100644 --- a/services/core/java/com/android/server/wm/WindowProcessController.java +++ b/services/core/java/com/android/server/wm/WindowProcessController.java @@ -107,6 +107,12 @@ public class WindowProcessController extends ConfigurationContainer 0; } - void setLastActivityLaunchTime(long launchTime) { + void setLastActivityLaunchTime(ActivityRecord r) { + long launchTime = r.lastLaunchTime; if (launchTime <= mLastActivityLaunchTime) { if (launchTime < mLastActivityLaunchTime) { Slog.w(TAG, @@ -547,9 +554,29 @@ public class WindowProcessController extends ConfigurationContainer= RESET_RAPID_ACTIVITY_LAUNCH_MS) { + mRapidActivityLaunchCount = 0; + } + + if (mRapidActivityLaunchCount > MAX_RAPID_ACTIVITY_LAUNCH_COUNT) { + Slog.w(TAG, "Killing " + mPid + " because of rapid activity launch"); + r.getRootTask().moveTaskToBack(r.getTask()); + mAtm.mH.post(() -> mAtm.mAmInternal.killProcess(mName, mUid, "rapidActivityLaunch")); + } + } + void setLastActivityFinishTimeIfNeeded(long finishTime) { if (finishTime <= mLastActivityFinishTime || !hasActivityInVisibleTask()) { return; @@ -696,7 +723,7 @@ public class WindowProcessController extends ConfigurationContainer