Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1d3f26bb authored by Graciela Putri's avatar Graciela Putri Committed by Android (Google) Code Review
Browse files

Merge "[2/n] Add crash reporting for tasks in desk" into main

parents 53b94cec 3ee6f89a
Loading
Loading
Loading
Loading
+4 −9
Original line number Diff line number Diff line
@@ -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;
@@ -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(
+58 −6
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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);
@@ -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.
+58 −2
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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;

@@ -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;
@@ -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();
    }