From dddc9f5051c463561e970769b888903f3141cc21 Mon Sep 17 00:00:00 2001 From: Vishnu Nair Date: Mon, 9 Mar 2020 09:37:27 -0700 Subject: [PATCH] Support DisplayAreas in protos Dump WindowContainers and their children without hard coding the hierarchy. Bug: 149672519 Test: open wm trace in winscope Merged-In: If5a7bd88728054e50aaacee138d9ae78513e94fe Change-Id: If5a7bd88728054e50aaacee138d9ae78513e94fe --- .../android/server/windowmanagerservice.proto | 43 +++++++++++++++---- .../com/android/server/wm/ActivityRecord.java | 6 +++ .../com/android/server/wm/ActivityStack.java | 13 ------ .../com/android/server/wm/DisplayArea.java | 25 +++-------- .../com/android/server/wm/DisplayContent.java | 13 +++--- .../server/wm/RootWindowContainer.java | 14 ------ .../core/java/com/android/server/wm/Task.java | 6 +++ .../android/server/wm/WindowContainer.java | 17 ++++++++ .../com/android/server/wm/WindowState.java | 10 +++-- .../com/android/server/wm/WindowToken.java | 11 ++--- 10 files changed, 90 insertions(+), 68 deletions(-) diff --git a/core/proto/android/server/windowmanagerservice.proto b/core/proto/android/server/windowmanagerservice.proto index e8a0b46e84305..60892557891b5 100644 --- a/core/proto/android/server/windowmanagerservice.proto +++ b/core/proto/android/server/windowmanagerservice.proto @@ -53,10 +53,10 @@ message RootWindowContainerProto { option (.android.msg_privacy).dest = DEST_AUTOMATIC; optional WindowContainerProto window_container = 1; - repeated DisplayContentProto displays = 2; + repeated DisplayContentProto displays = 2 [deprecated=true]; reserved 3; // IdentifierProto windows /* window references in top down z order */ - repeated WindowStateProto windows = 4; + repeated WindowStateProto windows = 4 [deprecated=true]; optional KeyguardControllerProto keyguard_controller = 5; // Whether or not the home activity is the recents activity. This is needed for the CTS tests to // know what activity types to check for when invoking splitscreen multi-window. @@ -192,7 +192,8 @@ message DisplayContentProto { optional bool single_task_instance = 22; optional int32 focused_root_task_id = 23; optional .com.android.server.wm.IdentifierProto resumed_activity = 24; - repeated TaskProto tasks = 25; + repeated TaskProto tasks = 25 [deprecated=true]; + optional bool display_ready = 26; } /* represents DisplayArea object */ @@ -201,7 +202,7 @@ message DisplayAreaProto { optional WindowContainerProto window_container = 1; optional string name = 2 [ (.android.privacy).dest = DEST_EXPLICIT ]; - repeated DisplayAreaChildProto children = 3; + repeated DisplayAreaChildProto children = 3 [deprecated=true]; } /* represents a generic child of a DisplayArea */ @@ -254,8 +255,8 @@ message TaskProto { optional int32 surface_width = 8; optional int32 surface_height = 9; - repeated TaskProto tasks = 10; - repeated ActivityRecordProto activities = 11; + repeated TaskProto tasks = 10 [deprecated=true]; + repeated ActivityRecordProto activities = 11 [deprecated=true]; optional .com.android.server.wm.IdentifierProto resumed_activity = 12; optional string real_activity = 13; @@ -321,7 +322,7 @@ message WindowTokenProto { optional WindowContainerProto window_container = 1; optional int32 hash_code = 2; - repeated WindowStateProto windows = 3; + repeated WindowStateProto windows = 3 [deprecated=true]; optional bool waiting_to_show = 5; optional bool paused = 6; } @@ -346,7 +347,7 @@ message WindowStateProto { optional .android.graphics.RectProto surface_insets = 12; optional WindowStateAnimatorProto animator = 13; optional bool animating_exit = 14; - repeated WindowStateProto child_windows = 15; + repeated WindowStateProto child_windows = 15 [deprecated=true]; optional .android.graphics.RectProto surface_position = 16; optional int32 requested_width = 18; optional int32 requested_height = 19; @@ -426,6 +427,32 @@ message WindowContainerProto { optional int32 orientation = 2; optional bool visible = 3; optional SurfaceAnimatorProto surface_animator = 4; + repeated WindowContainerChildProto children = 5; +} + +/* represents a generic child of a WindowContainer */ +message WindowContainerChildProto { + option (.android.msg_privacy).dest = DEST_AUTOMATIC; + + /* A window container can have multiple children of different types stored as + * a WindowContainerChildProto but each instance of WindowContainerChildProto + * can only contain a single type. + */ + /* We do not know the derived typ and the class is dumped + * as a WindowContainer */ + optional WindowContainerProto window_container = 2; + /* represents a DisplayContent child */ + optional DisplayContentProto display_content = 3; + /* represents a DisplayArea child */ + optional DisplayAreaProto display_area = 4; + /* represents a Task child */ + optional TaskProto task = 5; + /* represents an ActivityRecord child */ + optional ActivityRecordProto activity = 6; + /* represents a WindowToken child */ + optional WindowTokenProto window_token = 7; + /* represents a WindowState child */ + optional WindowStateProto window = 8; } /* represents ConfigurationContainer */ diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 7a302110b13b7..a9517fefc69b1 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -200,6 +200,7 @@ import static com.android.server.wm.TaskPersister.IMAGE_EXTENSION; import static com.android.server.wm.WindowContainer.AnimationFlags.CHILDREN; import static com.android.server.wm.WindowContainer.AnimationFlags.PARENTS; import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION; +import static com.android.server.wm.WindowContainerChildProto.ACTIVITY; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ANIM; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYOUT_REPEATS; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STARTING_WINDOW_VERBOSE; @@ -7449,6 +7450,11 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } } + @Override + long getProtoFieldId() { + return ACTIVITY; + } + @Override public void dumpDebug(ProtoOutputStream proto, long fieldId, @WindowTraceLogLevel int logLevel) { diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java index 420675c5ba1eb..580425b4e864c 100644 --- a/services/core/java/com/android/server/wm/ActivityStack.java +++ b/services/core/java/com/android/server/wm/ActivityStack.java @@ -90,7 +90,6 @@ import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_WITH_CLAS import static com.android.server.wm.ActivityTaskManagerService.H.FIRST_ACTIVITY_STACK_MSG; import static com.android.server.wm.ActivityTaskManagerService.RELAUNCH_REASON_FREE_RESIZE; import static com.android.server.wm.ActivityTaskManagerService.RELAUNCH_REASON_WINDOWING_MODE_RESIZE; -import static com.android.server.wm.TaskProto.ACTIVITIES; import static com.android.server.wm.TaskProto.ACTIVITY_TYPE; import static com.android.server.wm.TaskProto.ANIMATING_BOUNDS; import static com.android.server.wm.TaskProto.BOUNDS; @@ -109,7 +108,6 @@ import static com.android.server.wm.TaskProto.RESUMED_ACTIVITY; import static com.android.server.wm.TaskProto.ROOT_TASK_ID; import static com.android.server.wm.TaskProto.SURFACE_HEIGHT; import static com.android.server.wm.TaskProto.SURFACE_WIDTH; -import static com.android.server.wm.TaskProto.TASKS; import static com.android.server.wm.TaskProto.WINDOW_CONTAINER; import static com.android.server.wm.WindowContainer.AnimationFlags.CHILDREN; import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION; @@ -3918,17 +3916,6 @@ class ActivityStack extends Task { proto.write(DISPLAY_ID, getDisplayId()); proto.write(ROOT_TASK_ID, getRootTaskId()); - for (int i = mChildren.size() - 1; i >= 0; --i) { - final WindowContainer child = mChildren.get(i); - if (child instanceof Task) { - child.dumpDebug(proto, TASKS, logLevel); - } else if (child instanceof ActivityRecord) { - child.dumpDebug(proto, ACTIVITIES, logLevel); - } else { - throw new IllegalStateException("Unknown child type: " + child); - } - } - if (mResumedActivity != null) { mResumedActivity.writeIdentifierToProto(proto, RESUMED_ACTIVITY); } diff --git a/services/core/java/com/android/server/wm/DisplayArea.java b/services/core/java/com/android/server/wm/DisplayArea.java index 0d365b16e228e..d9e41afa91416 100644 --- a/services/core/java/com/android/server/wm/DisplayArea.java +++ b/services/core/java/com/android/server/wm/DisplayArea.java @@ -23,13 +23,10 @@ import static android.view.WindowManager.TRANSIT_KEYGUARD_UNOCCLUDE; import static android.view.WindowManagerPolicyConstants.APPLICATION_LAYER; import static com.android.internal.util.Preconditions.checkState; -import static com.android.server.wm.DisplayAreaChildProto.DISPLAY_AREA; -import static com.android.server.wm.DisplayAreaChildProto.UNKNOWN; -import static com.android.server.wm.DisplayAreaChildProto.WINDOW; -import static com.android.server.wm.DisplayAreaProto.CHILDREN; import static com.android.server.wm.DisplayAreaProto.NAME; import static com.android.server.wm.DisplayAreaProto.WINDOW_CONTAINER; import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_ORIENTATION; +import static com.android.server.wm.WindowContainerChildProto.DISPLAY_AREA; import android.graphics.Rect; import android.util.proto.ProtoOutputStream; @@ -111,24 +108,14 @@ public class DisplayArea extends WindowContainer { final long token = proto.start(fieldId); super.dumpDebug(proto, WINDOW_CONTAINER, logLevel); proto.write(NAME, mName); - for (int i = 0; i < getChildCount(); i++) { - final long childToken = proto.start(CHILDREN); - final T child = getChildAt(i); - if (child instanceof ActivityStack) { - // TODO(display-area): Dump stacks & tasks here, instead of in DisplayContent's - // dumpDebug. For now, skip them here to avoid dumping them as UNKNOWN. - } else if (child instanceof WindowToken) { - ((WindowToken) child).dumpDebug(proto, WINDOW, logLevel); - } else if (child instanceof DisplayArea) { - child.dumpDebug(proto, DISPLAY_AREA, logLevel); - } else { - proto.write(UNKNOWN, child.getClass().getSimpleName()); - } - proto.end(childToken); - } proto.end(token); } + @Override + long getProtoFieldId() { + return DISPLAY_AREA; + } + /** * DisplayArea that contains WindowTokens, and orders them according to their type. */ diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 55ce84eb213b5..3352bd5b00962 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -94,6 +94,7 @@ import static com.android.server.wm.DisplayContentProto.APP_TRANSITION; import static com.android.server.wm.DisplayContentProto.CLOSING_APPS; import static com.android.server.wm.DisplayContentProto.DISPLAY_FRAMES; import static com.android.server.wm.DisplayContentProto.DISPLAY_INFO; +import static com.android.server.wm.DisplayContentProto.DISPLAY_READY; import static com.android.server.wm.DisplayContentProto.DPI; import static com.android.server.wm.DisplayContentProto.FOCUSED_APP; import static com.android.server.wm.DisplayContentProto.FOCUSED_ROOT_TASK_ID; @@ -105,7 +106,6 @@ import static com.android.server.wm.DisplayContentProto.ROOT_DISPLAY_AREA; import static com.android.server.wm.DisplayContentProto.ROTATION; import static com.android.server.wm.DisplayContentProto.SCREEN_ROTATION_ANIMATION; import static com.android.server.wm.DisplayContentProto.SINGLE_TASK_INSTANCE; -import static com.android.server.wm.DisplayContentProto.TASKS; import static com.android.server.wm.DisplayContentProto.WINDOW_CONTAINER; import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_ADD_REMOVE; import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_APP_TRANSITIONS; @@ -117,6 +117,7 @@ import static com.android.server.wm.ProtoLogGroup.WM_SHOW_TRANSACTIONS; import static com.android.server.wm.RootWindowContainer.TAG_STATES; import static com.android.server.wm.WindowContainer.AnimationFlags.PARENTS; import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION; +import static com.android.server.wm.WindowContainerChildProto.DISPLAY_CONTENT; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_DISPLAY; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_INPUT_METHOD; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYOUT; @@ -2837,10 +2838,6 @@ class DisplayContent extends WindowContainer= 0; --i) { - final ActivityStack stack = mTaskContainers.getChildAt(i); - stack.dumpDebug(proto, TASKS, logLevel); - } for (int i = mOverlayContainers.getChildCount() - 1; i >= 0; --i) { final WindowToken windowToken = mOverlayContainers.getChildAt(i); windowToken.dumpDebug(proto, OVERLAY_WINDOWS, logLevel); @@ -2875,10 +2872,16 @@ class DisplayContent extends WindowContainer final long token = proto.start(fieldId); super.dumpDebug(proto, WINDOW_CONTAINER, logLevel); - if (mWmService.mDisplayReady) { - final int count = mChildren.size(); - for (int i = 0; i < count; ++i) { - final DisplayContent displayContent = mChildren.get(i); - displayContent.dumpDebug(proto, DISPLAYS, logLevel); - } - } - if (logLevel == WindowTraceLogLevel.ALL) { - forAllWindows((w) -> { - w.dumpDebug(proto, WINDOWS, logLevel); - }, true); - } mStackSupervisor.getKeyguardController().dumpDebug(proto, KEYGUARD_CONTROLLER); proto.write(IS_HOME_RECENTS_COMPONENT, diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 88d4fb31b16b0..2d9a3792f45fd 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -85,6 +85,7 @@ import static com.android.server.wm.IdentifierProto.USER_ID; import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_ADD_REMOVE; import static com.android.server.wm.WindowContainer.AnimationFlags.CHILDREN; import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION; +import static com.android.server.wm.WindowContainerChildProto.TASK; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STACK; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_TASK_MOVEMENT; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; @@ -4121,4 +4122,9 @@ class Task extends WindowContainer { SurfaceControl.Transaction getMainWindowSizeChangeTransaction() { return mMainWindowSizeChangeTransaction; } + + @Override + long getProtoFieldId() { + return TASK; + } } diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index 10d34b57bacba..809931d1fe357 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -40,6 +40,7 @@ import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_APP_TRANSITIO import static com.android.server.wm.WindowContainer.AnimationFlags.CHILDREN; import static com.android.server.wm.WindowContainer.AnimationFlags.PARENTS; import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION; +import static com.android.server.wm.WindowContainerChildProto.WINDOW_CONTAINER; import static com.android.server.wm.WindowContainerProto.CONFIGURATION_CONTAINER; import static com.android.server.wm.WindowContainerProto.ORIENTATION; import static com.android.server.wm.WindowContainerProto.SURFACE_ANIMATOR; @@ -1819,9 +1820,25 @@ class WindowContainer extends ConfigurationContainer< if (mSurfaceAnimator.isAnimating()) { mSurfaceAnimator.dumpDebug(proto, SURFACE_ANIMATOR); } + + // add children to proto + for (int i = 0; i < getChildCount(); i++) { + final long childToken = proto.start(WindowContainerProto.CHILDREN); + final E child = getChildAt(i); + child.dumpDebug(proto, child.getProtoFieldId(), logLevel); + proto.end(childToken); + } proto.end(token); } + /** + * @return a proto field id to identify where to add the derived class to the generic window + * container proto. + */ + long getProtoFieldId() { + return WINDOW_CONTAINER; + } + private ForAllWindowsConsumerWrapper obtainConsumerWrapper(Consumer consumer) { ForAllWindowsConsumerWrapper wrapper = mConsumerWrapperPool.acquire(); if (wrapper == null) { diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 386755de9b873..d1f97f8d38ce3 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -118,6 +118,7 @@ import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_STARTING_WINDOW; import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_WINDOW_ANIMATION; import static com.android.server.wm.WindowContainer.AnimationFlags.PARENTS; import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION; +import static com.android.server.wm.WindowContainerChildProto.WINDOW; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ANIM; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_CONFIGURATION; @@ -145,7 +146,6 @@ import static com.android.server.wm.WindowStateAnimator.READY_TO_SHOW; import static com.android.server.wm.WindowStateProto.ANIMATING_EXIT; import static com.android.server.wm.WindowStateProto.ANIMATOR; import static com.android.server.wm.WindowStateProto.ATTRIBUTES; -import static com.android.server.wm.WindowStateProto.CHILD_WINDOWS; import static com.android.server.wm.WindowStateProto.DESTROYING; import static com.android.server.wm.WindowStateProto.DISPLAY_ID; import static com.android.server.wm.WindowStateProto.FINISHED_SEAMLESS_ROTATION_FRAME; @@ -3758,9 +3758,6 @@ class WindowState extends WindowContainer implements WindowManagerP mSurfacePosition.dumpDebug(proto, SURFACE_POSITION); mWinAnimator.dumpDebug(proto, ANIMATOR); proto.write(ANIMATING_EXIT, mAnimatingExit); - for (int i = 0; i < mChildren.size(); i++) { - mChildren.get(i).dumpDebug(proto, CHILD_WINDOWS, logLevel); - } proto.write(REQUESTED_WIDTH, mRequestedWidth); proto.write(REQUESTED_HEIGHT, mRequestedHeight); proto.write(VIEW_VISIBILITY, mViewVisibility); @@ -3778,6 +3775,11 @@ class WindowState extends WindowContainer implements WindowManagerP proto.end(token); } + @Override + long getProtoFieldId() { + return WINDOW; + } + @Override public void writeIdentifierToProto(ProtoOutputStream proto, long fieldId) { final long token = proto.start(fieldId); diff --git a/services/core/java/com/android/server/wm/WindowToken.java b/services/core/java/com/android/server/wm/WindowToken.java index 98d9c8fcab5a2..f41d5a52775d1 100644 --- a/services/core/java/com/android/server/wm/WindowToken.java +++ b/services/core/java/com/android/server/wm/WindowToken.java @@ -28,13 +28,13 @@ import static com.android.server.wm.ProtoLogGroup.WM_ERROR; import static com.android.server.wm.WindowContainer.AnimationFlags.CHILDREN; import static com.android.server.wm.WindowContainer.AnimationFlags.PARENTS; import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION; +import static com.android.server.wm.WindowContainerChildProto.WINDOW_TOKEN; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_NORMAL; import static com.android.server.wm.WindowTokenProto.HASH_CODE; import static com.android.server.wm.WindowTokenProto.PAUSED; import static com.android.server.wm.WindowTokenProto.WAITING_TO_SHOW; -import static com.android.server.wm.WindowTokenProto.WINDOWS; import static com.android.server.wm.WindowTokenProto.WINDOW_CONTAINER; import android.annotation.CallSuper; @@ -539,15 +539,16 @@ class WindowToken extends WindowContainer { final long token = proto.start(fieldId); super.dumpDebug(proto, WINDOW_CONTAINER, logLevel); proto.write(HASH_CODE, System.identityHashCode(this)); - for (int i = 0; i < mChildren.size(); i++) { - final WindowState w = mChildren.get(i); - w.dumpDebug(proto, WINDOWS, logLevel); - } proto.write(WAITING_TO_SHOW, waitingToShow); proto.write(PAUSED, paused); proto.end(token); } + @Override + long getProtoFieldId() { + return WINDOW_TOKEN; + } + void dump(PrintWriter pw, String prefix, boolean dumpAll) { super.dump(pw, prefix, dumpAll); pw.print(prefix); pw.print("windows="); pw.println(mChildren);