背景:
在升级到aosp13/14高版本android后发现经常在做分屏,pip等相关wmshell业务模块时候,发现有一个新的类Windowless/SurfaceControlViewHost经常出现在我们的视野,当时的理解也是字面意思理解为无窗口模式的画面展示。
因为正常的所有窗口一般都可以通过窗口层级结构树看到对应的WindowState,或者说dumpsys window windows命令看到当前绘制的所有窗口。
一般显示窗口都可以通过dumpsys activity containers命令输出的层级结构树中看到:
同时也可以通过专门查看WindowState的命令查看dumpsys window windows:
但是一旦遇到有Windowless类型的窗口就无法通过上面方式查看到。
直观认识Windowless场景
具体使用Windowless的场景在wmshell的业务部分使用比较多的,具体举几个:
1、分屏的分割线DividerView
2、aosp14版本开始的自由窗口顶部操作栏Caption
这些其实都是采用Windowless的方式添加上去展示的,Windowless可以简单字面意思理解为无窗口的画面,即可以看到显示内容画面,但是它并不属于WindowState。能看到画面其实也可以理解为一般在Surfaceflinger肯定有独立的Layer,课程也讲过一般情况下Layer会和wms的层级结构树进行一一对应,但是这种Windowless的情况就是只有SurfaceFlinger的Layer,没有WMS中的WindowState。
从Winscope中可以明显看出相关差异:
SurfaceFlinger中可以看到有分屏SplitDivider
WMS中看不到有分屏SplitDivider窗口
为什么要有Windowless存在呢?
android为要引入Windowless这种无窗口化的显示方式呢?这个目前还是一个属于一个开放性问题,因为没有看到有android官方的正规解释,所以下面一些观点讨论都是基于学员们和我自己的一些个人理解观点,下面展示一下千里马的vip社群讨论该话题的一些结论:
这里汇总一下关于为什么要引入Windowless的一些观点:
1、可以实现把一个View附加到没有Activity,没有Window等窗口容器,直接附加到SurfaceControl的显示容器,提供显示View一种新方法
2、轻量级别使用的ViewRootImpl,不需要维护wms窗口,只需要考虑绘制和触摸
3、理论上所有Windowless显示内容都可以使用正常WidnowState显示,但是因为wmshell中有很多额外窗口需求,这样可能会需要额外增加比较多的窗口类型type,这样针对一些少见业务场景,然后去改动整个wms层级结构树的业务成本太大,即实现了一些业务窗口与整个系统窗口结构管理的解耦
同学也给出了AI到的一些关键总结性的结论:
AI这里总结的更加精简一些,不过相对我们上面讨论的来说,新手可能看不懂,相对我们自己总结的更加容易理解。