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");