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
diff --git a/core/java/android/app/ApplicationExitInfo.java b/core/java/android/app/ApplicationExitInfo.java
index 60e22f4..9bdddd0 100644
--- a/core/java/android/app/ApplicationExitInfo.java
+++ b/core/java/android/app/ApplicationExitInfo.java
@@ -360,6 +360,53 @@
*/
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 @@
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 @@
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 47f9fd5..6296e23 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 @@
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 @@
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 @@
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 @@
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 @@
UserHandle.getAppId(extraUid),
userId, ProcessList.INVALID_ADJ,
ApplicationExitInfo.REASON_USER_REQUESTED,
- ApplicationExitInfo.SUBREASON_UNKNOWN,
+ ApplicationExitInfo.SUBREASON_PACKAGE_UPDATE,
"change " + ssp);
}
}
@@ -16361,7 +16361,7 @@
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 6a211d3..d3e54b1 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 @@
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;