From 84a2e2a06bb95e9c30f10a77d0fb90386b0f470d Mon Sep 17 00:00:00 2001 From: Ng Zhi An Date: Wed, 13 Sep 2017 15:09:32 -0700 Subject: [PATCH] Show dialog if top app is killed by lmk Bug: 65488249 Fixes: 65488249 Test: run an app, then kill from command line like so adb shell "kill \$(pidof app)" Change-Id: I7c259542723a9659c52e4571071ec5809693816d Merged-In: I7c259542723a9659c52e4571071ec5809693816d --- core/res/res/values/strings.xml | 7 +++++ core/res/res/values/symbols.xml | 3 +++ .../android/server/am/ActivityManagerService.java | 30 ++++++++++++++++++++++ 3 files changed, 40 insertions(+) diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index ce6815f10b30..5347719ef993 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -2679,6 +2679,8 @@ OK Cancel + + CLOSE @@ -2811,6 +2813,11 @@ Re-enable this in System settings > Apps > Downloaded. + + App isn\'t responding + + %1$s may be using too much memory. + %1$s does not support the current Display size setting and may behave unexpectedly. diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 0548db69a05d..b36630e07f68 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1890,6 +1890,9 @@ + + + diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index cbfc747a7481..bffccafc677b 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -1690,6 +1690,7 @@ public class ActivityManagerService extends IActivityManager.Stub static final int SERVICE_FOREGROUND_CRASH_MSG = 69; static final int DISPATCH_OOM_ADJ_OBSERVER_MSG = 70; static final int START_USER_SWITCH_FG_MSG = 712; + static final int TOP_APP_KILLED_BY_LMK_MSG = 73; static final int FIRST_ACTIVITY_STACK_MSG = 100; static final int FIRST_BROADCAST_QUEUE_MSG = 200; @@ -1921,6 +1922,17 @@ public class ActivityManagerService extends IActivityManager.Stub dispatchProcessDied(pid, uid); break; } + case TOP_APP_KILLED_BY_LMK_MSG: { + final String appName = (String) msg.obj; + final AlertDialog d = new BaseErrorDialog(mUiContext); + d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR); + d.setTitle(mUiContext.getText(R.string.top_app_killed_title)); + d.setMessage(mUiContext.getString(R.string.top_app_killed_message, appName)); + d.setButton(DialogInterface.BUTTON_POSITIVE, mUiContext.getText(R.string.close), + obtainMessage(DISMISS_DIALOG_UI_MSG, d)); + d.show(); + break; + } case DISPATCH_UIDS_CHANGED_UI_MSG: { dispatchUidsChanged(); } break; @@ -5430,6 +5442,7 @@ public class ActivityManagerService extends IActivityManager.Stub boolean doLowMem = app.instr == null; boolean doOomAdj = doLowMem; if (!app.killedByAm) { + maybeNotifyTopAppKilled(app); Slog.i(TAG, "Process " + app.processName + " (pid " + pid + ") has died: " + ProcessList.makeOomAdjString(app.setAdj) + ProcessList.makeProcStateString(app.setProcState)); @@ -5463,6 +5476,23 @@ public class ActivityManagerService extends IActivityManager.Stub } } + /** Show system error dialog when a top app is killed by LMK */ + void maybeNotifyTopAppKilled(ProcessRecord app) { + if (!shouldNotifyTopAppKilled(app)) { + return; + } + + Message msg = mHandler.obtainMessage(TOP_APP_KILLED_BY_LMK_MSG); + msg.obj = mContext.getPackageManager().getApplicationLabel(app.info); + mUiHandler.sendMessage(msg); + } + + /** Only show notification when the top app is killed on low ram devices */ + private boolean shouldNotifyTopAppKilled(ProcessRecord app) { + return app.curSchedGroup == ProcessList.SCHED_GROUP_TOP_APP && + ActivityManager.isLowRamDeviceStatic(); + } + /** * If a stack trace dump file is configured, dump process stack traces. * @param clearTraces causes the dump file to be erased prior to the new -- 2.11.0