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 9512e1dafe7ea..95e35ef6cf323 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -3780,7 +3780,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"); } } } @@ -3810,7 +3810,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"); } @@ -4352,7 +4352,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"); } @@ -4404,7 +4404,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); } @@ -13636,7 +13636,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); } } @@ -16365,7 +16365,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 e0d333ee8f6a3..7ed3dcf40f65e 100644 --- a/services/core/java/com/android/server/am/OomAdjuster.java +++ b/services/core/java/com/android/server/am/OomAdjuster.java @@ -2561,7 +2561,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;