文章目录WindowContainer窗口层级分析WindowContainerWindowContainer/** * Defines common functionality for classes that can hold windows directly or through their * children in a hierarchy form. * The test class is {link WindowContainerTests} which must be kept up-to-date and ran anytime * changes are made to this class. */classWindowContainerEextendsWindowContainerextendsConfigurationContainerEimplementsComparableWindowContainer,Animatable,SurfaceFreezer.Freezable,InsetsControlTarget{/** * The parent of this window container. * For removing or setting new parent {link #setParent} should be used, because it also * performs configuration updates based on new parents settings. */privateWindowContainerWindowContainermParentnull;// List of children for this window container. List is in z-order as the children appear on// screen with the top-most window container at the tail of the list.protectedfinalWindowListEmChildrennewWindowListE();给持有窗口的自己和孩子定义了一些公共的方法和属性比如RootWindowContainer、DisplayContent、DisplayArea、DisplayArea.Tokens、TaskDisplayArea、Task、ActivityRecord、WindowToken、WindowState等。重点看下mParent和mChildren两个字段一个代表父节点一个代表子节点子节点list代表Z轴层级显示list的末端比开头的Z轴层级要高。RootWindowContainer根窗口即树根位置其child是DisplayContent。DisplayContent对应的是显示屏幕Android是支持多屏幕的所有可能有多个DisplayContent对象。DisplayArea代表的是屏幕下面的显示区域一组窗口集合有多个子类比如Tokens、TaskDisplayArea等等。TaskDisplayArealayer为2,表示应用层child为Task或者是TaskDisplayArea而Task的child可以是Task或者是ActivityRecord。Tokens:WindowTokens的容器child是WindowToken类型。WindowToken的child是WindowState。ImeContainer输入法容器child是WindowToken。WindowToken的child是WindowState类型。Task任务child可以是Task或者ActivityRecord。ActivityRecord对应进程中的Activity。ActivityRecord继承WindowTokenchild也是WindowState。WindowState对应着一个窗口的。窗口层级分析WindowContainer使用dumpsys命令查看层级结构adb shell dumpsys activity containersROOTtypeundefinedmodefullscreen override-modeundefined requested-bounds[0,0][0,0]bounds[0,0][1440,2960]#0 Display 0 nameBuilt-in Screen typeundefined modefullscreen override-modefullscreen requested-bounds[0,0][1440,2960] bounds[0,0][1440,2960]#2 Leaf:36:36 typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#1 WindowToken{9661fe1 type2024 android.os.BinderProxy89ec548} typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 7385106 ScreenDecorOverlayBottom typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 WindowToken{16d29cf type2024 android.os.BinderProxya812a2e} typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 3520f5c ScreenDecorOverlay typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#1 HideDisplayCutout:32:35 typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#2 OneHanded:34:35 typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 FullscreenMagnification:34:35 typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 Leaf:34:35 typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#1 FullscreenMagnification:33:33 typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 Leaf:33:33 typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 OneHanded:32:32 typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 Leaf:32:32 typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 WindowedMagnification:0:31 typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#6 HideDisplayCutout:26:31 typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 OneHanded:26:31 typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#2 FullscreenMagnification:29:31 typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 Leaf:29:31 typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#1 Leaf:28:28 typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 FullscreenMagnification:26:27 typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 Leaf:26:27 typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#5 Leaf:24:25 typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#1 WindowToken{3b88f3c type2024 android.os.BinderProxya203d2f} typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 cb0ee1a pip-dismiss-overlay typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 WindowToken{45f2760 type2019 android.os.BinderProxyf44d992} typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 ec33419 NavigationBar0 typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#4 HideDisplayCutout:18:23 typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 OneHanded:18:23 typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 FullscreenMagnification:18:23 typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 Leaf:18:23 typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#3 OneHanded:17:17 typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 FullscreenMagnification:17:17 typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 Leaf:17:17 typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 WindowToken{af8c0b4 type2040 android.os.BinderProxyd25b5c6} typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 5d914dd NotificationShade typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#2 HideDisplayCutout:16:16 typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 OneHanded:16:16 typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 FullscreenMagnification:16:16 typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 Leaf:16:16 typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#1 OneHanded:15:15 typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 FullscreenMagnification:15:15 typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 Leaf:15:15 typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 WindowToken{e3fb79e type2000 android.os.BinderProxy4bb3420} typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 d47827f StatusBar typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 HideDisplayCutout:0:14 typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 OneHanded:0:14 typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#1 ImePlaceholder:13:14 typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 ImeContainer typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 WindowToken{dac70cf type2011 android.os.Binder4a52d2e} typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 354cf86 InputMethod typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 FullscreenMagnification:0:12 typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#2 Leaf:3:12 typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 WindowToken{47c3a1f type2038 android.os.BinderProxy3da2b09} typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 66e879 ShellDropTarget typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#1 DefaultTaskDisplayArea typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#2 Task1 typehome modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 Task130 typehome modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 ActivityRecord{699937e u0 com.android.launcher3/.uioverrides.QuickstepLauncher} t130} typehome modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 4efca06 com.android.launcher3/com.android.launcher3.uioverrides.QuickstepLauncher typehome modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#1 Task2 typeundefined modefullscreen override-modefullscreen requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 Task3 typeundefined modefullscreen override-modefullscreen requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#1 Task5 typeundefined modemulti-window override-modemulti-window requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 Task4 typeundefined modemulti-window override-modemulti-window requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 Leaf:0:1 typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 WallpaperWindowToken{a169211 tokenandroid.os.Binderbbde238} typeundefined modefullscreen override-modefullscreen requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 fc460c4 com.android.systemui.ImageWallpaper typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]针对层级结构数中的数组变化如下所示未计算mMaxlayer时如下所示计算mMaxlayer时如下所示将其转化成图如下所示窗口层级为37层0-36层上层覆盖下层。格式如下name:mMinLayer:mMaxLayerwms中树的结构如上所示但是并没有发现WindowToken因为树开始创建没有有效Window有效window是由各个app触发的根据dumpsys信息进行如下调整结构如下所示有上图有颜色标记信息可知Wallpaper位于 0-1层级Activity 位于DefaultTaskDisplayArea是第2层InputMethod 位于13-14层StatusBar位于15层NavigationBar0位于24-25层WindowContainer的子类结合层级树关系如下所示