From 6de944c27a64a0a8db4d663873a3d099ad9be576 Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Wed, 30 Mar 2022 16:02:12 +0800 Subject: [PATCH] Skip reporting ANR on zero pid process Though currently the only case is from broadcast timeout on a process forking by unresponsive webview_zygote, skip the case to avoid noise reports. Bug: 227349843 Test: AnrHelperTest Change-Id: I433c4d33e14619bec764b99a1334ebe7c6137bb0 --- services/core/java/com/android/server/am/AnrHelper.java | 5 +++++ .../src/com/android/server/am/AnrHelperTest.java | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/am/AnrHelper.java b/services/core/java/com/android/server/am/AnrHelper.java index 1e1024e863142..e3544953e63d6 100644 --- a/services/core/java/com/android/server/am/AnrHelper.java +++ b/services/core/java/com/android/server/am/AnrHelper.java @@ -79,6 +79,11 @@ class AnrHelper { WindowProcessController parentProcess, boolean aboveSystem, String annotation) { final int incomingPid = anrProcess.mPid; synchronized (mAnrRecords) { + if (incomingPid == 0) { + // Extreme corner case such as zygote is no response to return pid for the process. + Slog.i(TAG, "Skip zero pid ANR, process=" + anrProcess.processName); + return; + } if (mProcessingPid == incomingPid) { Slog.i(TAG, "Skip duplicated ANR, pid=" + incomingPid + " " + annotation); return; diff --git a/services/tests/servicestests/src/com/android/server/am/AnrHelperTest.java b/services/tests/servicestests/src/com/android/server/am/AnrHelperTest.java index 782d519418092..c940ef5c290d5 100644 --- a/services/tests/servicestests/src/com/android/server/am/AnrHelperTest.java +++ b/services/tests/servicestests/src/com/android/server/am/AnrHelperTest.java @@ -70,6 +70,7 @@ public class AnrHelperTest { final Context context = getInstrumentation().getTargetContext(); runWithDexmakerShareClassLoader(() -> { mAnrApp = mock(ProcessRecord.class); + mAnrApp.mPid = 12345; final ProcessErrorStateRecord errorState = mock(ProcessErrorStateRecord.class); setFieldValue(ProcessErrorStateRecord.class, errorState, "mProcLock", new ActivityManagerProcLock()); @@ -130,7 +131,6 @@ public class AnrHelperTest { }).when(mAnrApp.mErrorState).appNotResponding(anyString(), any(), any(), any(), anyBoolean(), anyString(), anyBoolean()); final ApplicationInfo appInfo = new ApplicationInfo(); - mAnrApp.mPid = 12345; final Runnable reportAnr = () -> mAnrHelper.appNotResponding(mAnrApp, "activityShortComponentName", appInfo, "parentShortComponentName", null /* parentProcess */, false /* aboveSystem */, "annotation");