From 9edb86c98576abb3731b53aaeeeae8e4b6f9ae98 Mon Sep 17 00:00:00 2001 From: Jing Ji Date: Fri, 4 Mar 2022 18:22:07 -0800 Subject: [PATCH] Add sub-reasons for the killings from task manager and force-stop Bug: 215222002 Test: Manual - stop FGS from task manager & dumpsys activity exit-info Test: atest ApplicationExitInfoTest Test: atest CtsAppExitTestCases Change-Id: I1519df46685ea3c59ab412a415adbd93ea674f0a --- .../java/android/app/ApplicationExitInfo.java | 62 +++++++++++++++++++ .../server/am/ActivityManagerService.java | 12 ++-- .../com/android/server/am/OomAdjuster.java | 2 +- 3 files changed, 69 insertions(+), 7 deletions(-) diff --git a/core/java/android/app/ApplicationExitInfo.java b/core/java/android/app/ApplicationExitInfo.java index 60e22f4ecd12c..9bdddd037e21b 100644 --- a/core/java/android/app/ApplicationExitInfo.java +++ b/core/java/android/app/ApplicationExitInfo.java @@ -360,6 +360,53 @@ public final class ApplicationExitInfo implements Parcelable { */ public static final int SUBREASON_FREEZER_BINDER_TRANSACTION = 20; + /** + * The process was killed because of force-stop, it could be due to that + * the user clicked the "Force stop" button of the application in the Settings; + * this would be set only when the reason is {@link #REASON_USER_REQUESTED}. + * + * For internal use only. + * @hide + */ + public static final int SUBREASON_FORCE_STOP = 21; + + /** + * The process was killed because the user removed the application away from Recents; + * this would be set only when the reason is {@link #REASON_USER_REQUESTED}. + * + * For internal use only. + * @hide + */ + public static final int SUBREASON_REMOVE_TASK = 22; + + /** + * The process was killed because the user stopped the application from the task manager; + * this would be set only when the reason is {@link #REASON_USER_REQUESTED}. + * + * For internal use only. + * @hide + */ + public static final int SUBREASON_STOP_APP = 23; + + /** + * The process was killed because the user stopped the application from developer options, + * or via the adb shell commmand interface; this would be set only when the reason is + * {@link #REASON_USER_REQUESTED}. + * + * For internal use only. + * @hide + */ + public static final int SUBREASON_KILL_BACKGROUND = 24; + + /** + * The process was killed because of package update; this would be set only when the reason is + * {@link #REASON_USER_REQUESTED}. + * + * For internal use only. + * @hide + */ + public static final int SUBREASON_PACKAGE_UPDATE = 25; + // If there is any OEM code which involves additional app kill reasons, it should // be categorized in {@link #REASON_OTHER}, with subreason code starting from 1000. @@ -520,6 +567,11 @@ public final class ApplicationExitInfo implements Parcelable { SUBREASON_ISOLATED_NOT_NEEDED, SUBREASON_FREEZER_BINDER_IOCTL, SUBREASON_FREEZER_BINDER_TRANSACTION, + SUBREASON_FORCE_STOP, + SUBREASON_REMOVE_TASK, + SUBREASON_STOP_APP, + SUBREASON_KILL_BACKGROUND, + SUBREASON_PACKAGE_UPDATE, }) @Retention(RetentionPolicy.SOURCE) public @interface SubReason {} @@ -1193,6 +1245,16 @@ public final class ApplicationExitInfo implements Parcelable { return "FREEZER BINDER IOCTL"; case SUBREASON_FREEZER_BINDER_TRANSACTION: return "FREEZER BINDER TRANSACTION"; + case SUBREASON_FORCE_STOP: + return "FORCE STOP"; + case SUBREASON_REMOVE_TASK: + return "REMOVE TASK"; + case SUBREASON_STOP_APP: + return "STOP APP"; + case SUBREASON_KILL_BACKGROUND: + return "KILL BACKGROUND"; + case SUBREASON_PACKAGE_UPDATE: + return "PACKAGE UPDATE"; default: return "UNKNOWN"; } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 47f9fd535801d..6296e23c04490 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -3779,7 +3779,7 @@ public class ActivityManagerService extends IActivityManager.Stub synchronized (mProcLock) { mProcessList.killPackageProcessesLSP(packageName, appId, targetUserId, ProcessList.SERVICE_ADJ, ApplicationExitInfo.REASON_USER_REQUESTED, - ApplicationExitInfo.SUBREASON_UNKNOWN, "kill background"); + ApplicationExitInfo.SUBREASON_KILL_BACKGROUND, "kill background"); } } } @@ -3809,7 +3809,7 @@ public class ActivityManagerService extends IActivityManager.Stub mProcessList.killPackageProcessesLSP(null /* packageName */, -1 /* appId */, UserHandle.USER_ALL, ProcessList.CACHED_APP_MIN_ADJ, ApplicationExitInfo.REASON_USER_REQUESTED, - ApplicationExitInfo.SUBREASON_UNKNOWN, + ApplicationExitInfo.SUBREASON_KILL_BACKGROUND, "kill all background"); } @@ -4351,7 +4351,7 @@ public class ActivityManagerService extends IActivityManager.Stub ProcessList.INVALID_ADJ, true, false, true, false, true /* setRemoved */, false, ApplicationExitInfo.REASON_USER_REQUESTED, - ApplicationExitInfo.SUBREASON_UNKNOWN, + ApplicationExitInfo.SUBREASON_STOP_APP, "fully stop " + packageName + "/" + userId + " by user request"); } @@ -4403,7 +4403,7 @@ public class ActivityManagerService extends IActivityManager.Stub evenPersistent, true /* setRemoved */, uninstalling, packageName == null ? ApplicationExitInfo.REASON_USER_STOPPED : ApplicationExitInfo.REASON_USER_REQUESTED, - ApplicationExitInfo.SUBREASON_UNKNOWN, + ApplicationExitInfo.SUBREASON_FORCE_STOP, (packageName == null ? ("stop user " + userId) : ("stop " + packageName)) + " due to " + reason); } @@ -13632,7 +13632,7 @@ public class ActivityManagerService extends IActivityManager.Stub UserHandle.getAppId(extraUid), userId, ProcessList.INVALID_ADJ, ApplicationExitInfo.REASON_USER_REQUESTED, - ApplicationExitInfo.SUBREASON_UNKNOWN, + ApplicationExitInfo.SUBREASON_PACKAGE_UPDATE, "change " + ssp); } } @@ -16361,7 +16361,7 @@ public class ActivityManagerService extends IActivityManager.Stub if (pr.mState.getSetSchedGroup() == ProcessList.SCHED_GROUP_BACKGROUND && pr.mReceivers.numberOfCurReceivers() == 0) { pr.killLocked("remove task", ApplicationExitInfo.REASON_USER_REQUESTED, - ApplicationExitInfo.SUBREASON_UNKNOWN, true); + ApplicationExitInfo.SUBREASON_REMOVE_TASK, true); } else { // We delay killing processes that are not in the background or running a // receiver. diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java index 6a211d31aa498..d3e54b1c3f0e1 100644 --- a/services/core/java/com/android/server/am/OomAdjuster.java +++ b/services/core/java/com/android/server/am/OomAdjuster.java @@ -2532,7 +2532,7 @@ public class OomAdjuster { if (app.getWaitingToKill() != null && app.mReceivers.numberOfCurReceivers() == 0 && state.getSetSchedGroup() == ProcessList.SCHED_GROUP_BACKGROUND) { app.killLocked(app.getWaitingToKill(), ApplicationExitInfo.REASON_USER_REQUESTED, - ApplicationExitInfo.SUBREASON_UNKNOWN, true); + ApplicationExitInfo.SUBREASON_REMOVE_TASK, true); success = false; } else { int processGroup;