From b0424de7d3103998e1e633db4bfaf31c939a09d6 Mon Sep 17 00:00:00 2001 From: Zim Date: Thu, 25 Feb 2021 14:24:39 +0000 Subject: [PATCH] Retrieve max ANR dialog before dumping thread stacks Dumping thread stacks can take >5s, after which the cause of the ANR might have completed and there might not longer be a valid ANR controller to cancel the dialog. Test: Manual Bug: 170486601 Fix comment from Idb9190a0e6014ce64bf1412c26f6ae03f97e922d Test: m Bug: 170486601 Change-Id: Ibb5699693fac054fd8a8237af7036e610d7af189 --- .../server/am/ProcessErrorStateRecord.java | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/services/core/java/com/android/server/am/ProcessErrorStateRecord.java b/services/core/java/com/android/server/am/ProcessErrorStateRecord.java index 3258f8af0da21..d03a47afed8ac 100644 --- a/services/core/java/com/android/server/am/ProcessErrorStateRecord.java +++ b/services/core/java/com/android/server/am/ProcessErrorStateRecord.java @@ -329,6 +329,22 @@ class ProcessErrorStateRecord { info.append("Package is ").append((int) (loadingProgress * 100)).append("% loaded.\n"); } + // Retrieve controller with max ANR delay from AnrControllers + // Note that we retrieve the controller before dumping stacks because dumping stacks can + // take a few seconds, after which the cause of the ANR delay might have completed and + // there might no longer be a valid ANR controller to cancel the dialog in that case + AnrController anrController = mService.mActivityTaskManager.getAnrController(aInfo); + long anrDialogDelayMs = 0; + if (anrController != null) { + String packageName = aInfo.packageName; + int uid = aInfo.uid; + anrDialogDelayMs = anrController.getAnrDelayMillis(packageName, uid); + // Might execute an async binder call to a system app to show an interim + // ANR progress UI + anrController.onAnrDelayStarted(packageName, uid); + Slog.i(TAG, "ANR delay of " + anrDialogDelayMs + "ms started for " + packageName); + } + StringBuilder report = new StringBuilder(); report.append(MemoryPressureUtil.currentPsiState()); ProcessCpuTracker processCpuTracker = new ProcessCpuTracker(true); @@ -417,20 +433,6 @@ class ProcessErrorStateRecord { return; } - // Retrieve max ANR delay from AnrControllers without the mService lock since the - // controllers might in turn call into apps - AnrController anrController = mService.mActivityTaskManager.getAnrController(aInfo); - long anrDialogDelayMs = 0; - if (anrController != null) { - String packageName = aInfo.packageName; - int uid = aInfo.uid; - anrDialogDelayMs = anrController.getAnrDelayMillis(packageName, uid); - // Might execute an async binder call to a system app to show an interim - // ANR progress UI - anrController.onAnrDelayStarted(packageName, uid); - Slog.i(TAG, "ANR delay of " + anrDialogDelayMs + "ms started for " + packageName); - } - synchronized (mService) { // mBatteryStatsService can be null if the AMS is constructed with injector only. This // will only happen in tests.