Loading services/core/java/com/android/server/am/ActivityManagerService.java +4 −9 Original line number Diff line number Diff line Loading @@ -188,8 +188,6 @@ import static com.android.server.wm.ActivityTaskManagerService.DUMP_RECENTS_SHOR import static com.android.server.wm.ActivityTaskManagerService.DUMP_STARTER_CMD; import static com.android.server.wm.ActivityTaskManagerService.DUMP_TOP_RESUMED_ACTIVITY; import static com.android.server.wm.ActivityTaskManagerService.DUMP_VISIBLE_ACTIVITIES; import static com.android.server.wm.ActivityTaskManagerService.RELAUNCH_REASON_NONE; import static com.android.server.wm.ActivityTaskManagerService.relaunchReasonToString; import static com.android.systemui.shared.Flags.enableHomeDelay; import android.Manifest; Loading Loading @@ -9395,13 +9393,10 @@ public class ActivityManagerService extends IActivityManager.Stub processClassEnum, processName, uid, pid); } final int relaunchReason = r == null ? RELAUNCH_REASON_NONE : r.getWindowProcessController().computeRelaunchReason(); final String relaunchReasonString = relaunchReasonToString(relaunchReason); if (crashInfo.crashTag == null) { crashInfo.crashTag = relaunchReasonString; } else { crashInfo.crashTag = crashInfo.crashTag + " " + relaunchReasonString; final String crashTag = r != null ? r.getWindowProcessController().getCrashTag() : null; if (crashTag != null) { crashInfo.crashTag = crashInfo.crashTag == null ? crashTag : crashInfo.crashTag + " " + crashTag; } addErrorToDropBox( Loading services/core/java/com/android/server/wm/WindowProcessController.java +58 −6 Original line number Diff line number Diff line Loading @@ -46,6 +46,8 @@ import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_ATM; import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.ActivityTaskManagerService.INSTRUMENTATION_KEY_DISPATCHING_TIMEOUT_MILLIS; import static com.android.server.wm.ActivityTaskManagerService.RELAUNCH_REASON_NONE; import static com.android.server.wm.ActivityTaskManagerService.relaunchReasonToString; import static com.android.server.wm.DesktopModeHelper.canEnterDesktopMode; import static com.android.server.wm.WindowManagerService.MY_PID; import static java.util.Objects.requireNonNull; Loading Loading @@ -82,6 +84,7 @@ import android.util.ArrayMap; import android.util.Log; import android.util.Slog; import android.util.proto.ProtoOutputStream; import android.view.Display; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; Loading Loading @@ -1364,6 +1367,11 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio public int computeRelaunchReason() { synchronized (mAtm.mGlobalLock) { return computeRelaunchReasonInner(); } } private int computeRelaunchReasonInner() { final int activitiesSize = mActivities.size(); for (int i = activitiesSize - 1; i >= 0; i--) { final ActivityRecord r = mActivities.get(i); Loading @@ -1371,10 +1379,54 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio return r.mRelaunchReason; } } } return RELAUNCH_REASON_NONE; } /** Populate the crash tag related to activities and tasks in a process. */ public String getCrashTag() { int freeformTasks = 0; boolean anyTaskOnExternalDisplay = false; int relaunchReason; final boolean logCrashDesktopInfo = com.android.window.flags.Flags.enableCrashLoggingForDesktop() && canEnterDesktopMode(mAtm.mContext); synchronized (mAtm.mGlobalLock) { relaunchReason = computeRelaunchReasonInner(); if (logCrashDesktopInfo) { for (int i = mRecentTasks.size() - 1; i >= 0; i--) { final Task t = mRecentTasks.get(i); if (t.inFreeformWindowingMode()) { freeformTasks += 1; } if (!anyTaskOnExternalDisplay && t.getDisplayContent() != null && t.getDisplayContent().getDisplayInfo().type == Display.TYPE_EXTERNAL) { anyTaskOnExternalDisplay = true; } } } } final StringBuilder sb = new StringBuilder(); if (freeformTasks > 0) { sb.append("Freeform-Tasks=").append(freeformTasks); } if (anyTaskOnExternalDisplay) { if (!sb.isEmpty()) { sb.append(" "); } sb.append("On-External-Display=Yes"); } if (relaunchReason != RELAUNCH_REASON_NONE) { if (!sb.isEmpty()) { sb.append(" "); } sb.append("Relaunch-Reason=").append(relaunchReasonToString(relaunchReason)); } return sb.isEmpty() ? null : sb.toString(); } /** * Get the current dispatching timeout. If instrumentation is currently taking place, return * a longer value. Shorter timeout is returned otherwise. Loading services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java +58 −2 Original line number Diff line number Diff line Loading @@ -18,12 +18,15 @@ package com.android.server.wm; import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME; import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED; import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.content.pm.ActivityInfo.INSETS_DECOUPLED_CONFIGURATION_ENFORCED; import static android.content.pm.ActivityInfo.OVERRIDE_ENABLE_INSETS_DECOUPLED_CONFIGURATION; import static android.content.res.Configuration.GRAMMATICAL_GENDER_NOT_SPECIFIED; import static android.content.res.Configuration.ORIENTATION_LANDSCAPE; import static android.content.res.Configuration.ORIENTATION_PORTRAIT; import static com.android.dx.mockito.inline.extended.ExtendedMockito.any; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.never; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; Loading @@ -33,6 +36,8 @@ import static com.android.server.wm.ActivityRecord.State.RESUMED; import static com.android.server.wm.ActivityRecord.State.STARTED; import static com.android.server.wm.ActivityRecord.State.STOPPED; import static com.android.server.wm.ActivityRecord.State.STOPPING; import static com.android.server.wm.ActivityTaskManagerService.RELAUNCH_REASON_WINDOWING_MODE_RESIZE; import static com.android.server.wm.ActivityTaskManagerService.relaunchReasonToString; import static com.android.server.wm.ConfigurationContainer.applySizeOverrideIfNeeded; import static org.junit.Assert.assertEquals; Loading @@ -40,11 +45,9 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; Loading @@ -62,6 +65,10 @@ import android.os.LocaleList; import android.os.RemoteException; import android.platform.test.annotations.EnableFlags; import android.platform.test.annotations.Presubmit; import android.view.Display; import android.view.DisplayInfo; import com.android.window.flags.Flags; import org.junit.Before; import org.junit.Test; Loading Loading @@ -507,6 +514,55 @@ public class WindowProcessControllerTests extends WindowTestsBase { assertEquals(1300, resolvedConfig.windowConfiguration.getAppBounds().height()); } @Test @EnableFlags(Flags.FLAG_ENABLE_CRASH_LOGGING_FOR_DESKTOP) public void testGetCrashTag_desktopModeFalse() { doReturn(false).when(() -> DesktopModeHelper.canEnterDesktopMode(mContext)); final ActivityRecord activity = createActivityRecord(mWpc); activity.setWindowingMode(WINDOWING_MODE_FREEFORM); assertNull(mWpc.getCrashTag()); } @Test @EnableFlags(Flags.FLAG_ENABLE_CRASH_LOGGING_FOR_DESKTOP) public void testGetCrashTag_desktopModeFalse_relaunchReason() { doReturn(false).when(() -> DesktopModeHelper.canEnterDesktopMode(mContext)); final ActivityRecord activity = createActivityRecord(mWpc); activity.mRelaunchReason = RELAUNCH_REASON_WINDOWING_MODE_RESIZE; assertEquals( "Relaunch-Reason=" + relaunchReasonToString(RELAUNCH_REASON_WINDOWING_MODE_RESIZE), mWpc.getCrashTag()); } @Test @EnableFlags(Flags.FLAG_ENABLE_CRASH_LOGGING_FOR_DESKTOP) public void testGetCrashTag_desktopModeTrue_freeform() { doReturn(true).when(() -> DesktopModeHelper.canEnterDesktopMode(mContext)); final ActivityRecord activity = createActivityRecord(mWpc); activity.getTask().setWindowingMode(WINDOWING_MODE_FREEFORM); assertEquals("Freeform-Tasks=1", mWpc.getCrashTag()); } @Test @EnableFlags(Flags.FLAG_ENABLE_CRASH_LOGGING_FOR_DESKTOP) public void testGetCrashTag_desktopModeTrue_freeformOnExternalDisplay() { doReturn(true).when(() -> DesktopModeHelper.canEnterDesktopMode(mContext)); DisplayInfo displayInfo = new DisplayInfo(); displayInfo.copyFrom(mDisplayInfo); displayInfo.type = Display.TYPE_EXTERNAL; final DisplayContent dc = createNewDisplay(displayInfo); final TaskBuilder taskBuilder = new TaskBuilder(mSupervisor); final Task task = taskBuilder.setDisplay(dc).setWindowingMode( WINDOWING_MODE_FREEFORM).build(); mWpc.addRecentTask(task); assertEquals("Freeform-Tasks=1 On-External-Display=Yes", mWpc.getCrashTag()); } private TestDisplayContent createTestDisplayContentInContainer() { return new TestDisplayContent.Builder(mAtm, 1000, 1500).build(); } Loading Loading
services/core/java/com/android/server/am/ActivityManagerService.java +4 −9 Original line number Diff line number Diff line Loading @@ -188,8 +188,6 @@ import static com.android.server.wm.ActivityTaskManagerService.DUMP_RECENTS_SHOR import static com.android.server.wm.ActivityTaskManagerService.DUMP_STARTER_CMD; import static com.android.server.wm.ActivityTaskManagerService.DUMP_TOP_RESUMED_ACTIVITY; import static com.android.server.wm.ActivityTaskManagerService.DUMP_VISIBLE_ACTIVITIES; import static com.android.server.wm.ActivityTaskManagerService.RELAUNCH_REASON_NONE; import static com.android.server.wm.ActivityTaskManagerService.relaunchReasonToString; import static com.android.systemui.shared.Flags.enableHomeDelay; import android.Manifest; Loading Loading @@ -9395,13 +9393,10 @@ public class ActivityManagerService extends IActivityManager.Stub processClassEnum, processName, uid, pid); } final int relaunchReason = r == null ? RELAUNCH_REASON_NONE : r.getWindowProcessController().computeRelaunchReason(); final String relaunchReasonString = relaunchReasonToString(relaunchReason); if (crashInfo.crashTag == null) { crashInfo.crashTag = relaunchReasonString; } else { crashInfo.crashTag = crashInfo.crashTag + " " + relaunchReasonString; final String crashTag = r != null ? r.getWindowProcessController().getCrashTag() : null; if (crashTag != null) { crashInfo.crashTag = crashInfo.crashTag == null ? crashTag : crashInfo.crashTag + " " + crashTag; } addErrorToDropBox( Loading
services/core/java/com/android/server/wm/WindowProcessController.java +58 −6 Original line number Diff line number Diff line Loading @@ -46,6 +46,8 @@ import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_ATM; import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.ActivityTaskManagerService.INSTRUMENTATION_KEY_DISPATCHING_TIMEOUT_MILLIS; import static com.android.server.wm.ActivityTaskManagerService.RELAUNCH_REASON_NONE; import static com.android.server.wm.ActivityTaskManagerService.relaunchReasonToString; import static com.android.server.wm.DesktopModeHelper.canEnterDesktopMode; import static com.android.server.wm.WindowManagerService.MY_PID; import static java.util.Objects.requireNonNull; Loading Loading @@ -82,6 +84,7 @@ import android.util.ArrayMap; import android.util.Log; import android.util.Slog; import android.util.proto.ProtoOutputStream; import android.view.Display; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; Loading Loading @@ -1364,6 +1367,11 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio public int computeRelaunchReason() { synchronized (mAtm.mGlobalLock) { return computeRelaunchReasonInner(); } } private int computeRelaunchReasonInner() { final int activitiesSize = mActivities.size(); for (int i = activitiesSize - 1; i >= 0; i--) { final ActivityRecord r = mActivities.get(i); Loading @@ -1371,10 +1379,54 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio return r.mRelaunchReason; } } } return RELAUNCH_REASON_NONE; } /** Populate the crash tag related to activities and tasks in a process. */ public String getCrashTag() { int freeformTasks = 0; boolean anyTaskOnExternalDisplay = false; int relaunchReason; final boolean logCrashDesktopInfo = com.android.window.flags.Flags.enableCrashLoggingForDesktop() && canEnterDesktopMode(mAtm.mContext); synchronized (mAtm.mGlobalLock) { relaunchReason = computeRelaunchReasonInner(); if (logCrashDesktopInfo) { for (int i = mRecentTasks.size() - 1; i >= 0; i--) { final Task t = mRecentTasks.get(i); if (t.inFreeformWindowingMode()) { freeformTasks += 1; } if (!anyTaskOnExternalDisplay && t.getDisplayContent() != null && t.getDisplayContent().getDisplayInfo().type == Display.TYPE_EXTERNAL) { anyTaskOnExternalDisplay = true; } } } } final StringBuilder sb = new StringBuilder(); if (freeformTasks > 0) { sb.append("Freeform-Tasks=").append(freeformTasks); } if (anyTaskOnExternalDisplay) { if (!sb.isEmpty()) { sb.append(" "); } sb.append("On-External-Display=Yes"); } if (relaunchReason != RELAUNCH_REASON_NONE) { if (!sb.isEmpty()) { sb.append(" "); } sb.append("Relaunch-Reason=").append(relaunchReasonToString(relaunchReason)); } return sb.isEmpty() ? null : sb.toString(); } /** * Get the current dispatching timeout. If instrumentation is currently taking place, return * a longer value. Shorter timeout is returned otherwise. Loading
services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java +58 −2 Original line number Diff line number Diff line Loading @@ -18,12 +18,15 @@ package com.android.server.wm; import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME; import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED; import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.content.pm.ActivityInfo.INSETS_DECOUPLED_CONFIGURATION_ENFORCED; import static android.content.pm.ActivityInfo.OVERRIDE_ENABLE_INSETS_DECOUPLED_CONFIGURATION; import static android.content.res.Configuration.GRAMMATICAL_GENDER_NOT_SPECIFIED; import static android.content.res.Configuration.ORIENTATION_LANDSCAPE; import static android.content.res.Configuration.ORIENTATION_PORTRAIT; import static com.android.dx.mockito.inline.extended.ExtendedMockito.any; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.never; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; Loading @@ -33,6 +36,8 @@ import static com.android.server.wm.ActivityRecord.State.RESUMED; import static com.android.server.wm.ActivityRecord.State.STARTED; import static com.android.server.wm.ActivityRecord.State.STOPPED; import static com.android.server.wm.ActivityRecord.State.STOPPING; import static com.android.server.wm.ActivityTaskManagerService.RELAUNCH_REASON_WINDOWING_MODE_RESIZE; import static com.android.server.wm.ActivityTaskManagerService.relaunchReasonToString; import static com.android.server.wm.ConfigurationContainer.applySizeOverrideIfNeeded; import static org.junit.Assert.assertEquals; Loading @@ -40,11 +45,9 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; Loading @@ -62,6 +65,10 @@ import android.os.LocaleList; import android.os.RemoteException; import android.platform.test.annotations.EnableFlags; import android.platform.test.annotations.Presubmit; import android.view.Display; import android.view.DisplayInfo; import com.android.window.flags.Flags; import org.junit.Before; import org.junit.Test; Loading Loading @@ -507,6 +514,55 @@ public class WindowProcessControllerTests extends WindowTestsBase { assertEquals(1300, resolvedConfig.windowConfiguration.getAppBounds().height()); } @Test @EnableFlags(Flags.FLAG_ENABLE_CRASH_LOGGING_FOR_DESKTOP) public void testGetCrashTag_desktopModeFalse() { doReturn(false).when(() -> DesktopModeHelper.canEnterDesktopMode(mContext)); final ActivityRecord activity = createActivityRecord(mWpc); activity.setWindowingMode(WINDOWING_MODE_FREEFORM); assertNull(mWpc.getCrashTag()); } @Test @EnableFlags(Flags.FLAG_ENABLE_CRASH_LOGGING_FOR_DESKTOP) public void testGetCrashTag_desktopModeFalse_relaunchReason() { doReturn(false).when(() -> DesktopModeHelper.canEnterDesktopMode(mContext)); final ActivityRecord activity = createActivityRecord(mWpc); activity.mRelaunchReason = RELAUNCH_REASON_WINDOWING_MODE_RESIZE; assertEquals( "Relaunch-Reason=" + relaunchReasonToString(RELAUNCH_REASON_WINDOWING_MODE_RESIZE), mWpc.getCrashTag()); } @Test @EnableFlags(Flags.FLAG_ENABLE_CRASH_LOGGING_FOR_DESKTOP) public void testGetCrashTag_desktopModeTrue_freeform() { doReturn(true).when(() -> DesktopModeHelper.canEnterDesktopMode(mContext)); final ActivityRecord activity = createActivityRecord(mWpc); activity.getTask().setWindowingMode(WINDOWING_MODE_FREEFORM); assertEquals("Freeform-Tasks=1", mWpc.getCrashTag()); } @Test @EnableFlags(Flags.FLAG_ENABLE_CRASH_LOGGING_FOR_DESKTOP) public void testGetCrashTag_desktopModeTrue_freeformOnExternalDisplay() { doReturn(true).when(() -> DesktopModeHelper.canEnterDesktopMode(mContext)); DisplayInfo displayInfo = new DisplayInfo(); displayInfo.copyFrom(mDisplayInfo); displayInfo.type = Display.TYPE_EXTERNAL; final DisplayContent dc = createNewDisplay(displayInfo); final TaskBuilder taskBuilder = new TaskBuilder(mSupervisor); final Task task = taskBuilder.setDisplay(dc).setWindowingMode( WINDOWING_MODE_FREEFORM).build(); mWpc.addRecentTask(task); assertEquals("Freeform-Tasks=1 On-External-Display=Yes", mWpc.getCrashTag()); } private TestDisplayContent createTestDisplayContentInContainer() { return new TestDisplayContent.Builder(mAtm, 1000, 1500).build(); } Loading