SurfaceFlinger 转储能够提供特定时间的 SurfaceFlinger 快照。SurfaceFlinger 跟踪记录会按时间顺序显示状态序列,以便提供有价值的信息,让用户了解窗口在界面上的显示方式,以及如何确定哪个窗口在特定位置接收触摸响应。这些信息对于排查问题(例如应用未响应我的触摸操作或我在观看视频时遇到闪烁问题)至关重要。
Winscope 的 SurfaceFlinger 查看器会针对以下各项显示这些信息:使用活跃模式收集的跟踪记录或在提交 bug 报告时根据事务跟踪记录生成的跟踪记录(默认情况下为 Droidfood 配置),以及转储。
如需详细了解跟踪记录收集,请参阅 SurfaceFlinger(层)。
图 1. SurfaceFlinger 跟踪记录分析。
界面左侧显示了层的 3D 视图。矩形视图考虑了层边界、z 轴顺序、不透明度、相对 Z 值和圆角。
层次结构条状标签
该标签页的中心部分显示了层次结构,其中包含用于显示更多信息(例如层之间的父子关系)的条状标签,如下所示:
- V:标识可见层。
- RelZParent:标识具有 RelZ 子级的层。
- RelZ:标识具有 RelZParent 且按照层次结构中的 z 轴顺序进行绘制的层。
- HWC:标识由硬件混合渲染器合成的层。
- GPU:标识由 GPU 合成的层。
界面右侧显示了一系列精选属性,以及包含所有可用层属性的 proto 转储。如需详细了解 proto 转储部分的内容,请参阅属性。
精选属性
为了让调试更轻松,SurfaceFlinger 查看器提供了一系列精选属性,以便以更有条理的格式呈现最常用的信息:
图 2. SurfaceFlinger 属性。
此列表包含以下类别。
可见性
此部分包含关于层可见性的信息,以及层不可见的原因。其中包括:
标志:用于控制可见性,例如 HIDDEN
和 OPAQUE
。
不可见原因:说明层或 surface 在界面上不可见的原因(如果适用),例如由自身或其父级隐藏,或者没有缓冲区来绘制。
被遮挡、被部分遮挡或被覆盖:
- 被遮挡:系统将当前层计算为可见,但在其前面绘制了另一个不透明层,从而导致当前层不可见。被遮挡的层前方的层不透明,也就是说,前方的层设置了
OPAQUE
标志、像素格式不包含 alpha,或未设置 alpha。 - 被部分遮盖:当前层部分可见,因为其前方绘制的不透明层未完全覆盖它。被部分遮挡的层前方的层不透明,也就是说,前方的层设置了
OPAQUE
标志、像素格式不包含 alpha,或未设置 alpha。 被覆盖:当前层被透明层完全或部分覆盖,但在屏幕上仍可能可见。被覆盖的层前方的层透明,也就是说,前方的层未设置
OPAQUE
标志、像素格式包含 alpha,或设置了 alpha。不过,在 SurfaceFlinger 跟踪记录中,被覆盖的层对于 SurfaceFlinger 后方的层来说会显示为可见:图 3. SurfaceFlinger 上被覆盖的层。
几何图形和效果
本部分介绍了为当前层请求和计算出的几何图形和效果。
Requested(请求的属性)部分显示层上设置的属性。Calculated(计算出的属性)部分则显示为层应用的属性。之所以有这种区别,是因为几何图形和效果会沿着层次结构传递,并从父元素继承。
在图 2 中,层请求将 Corner Radius 设置为 0 像素。但是,其中一个父层将 Corner Radius 设置为 97.419 像素,这是应用的值:
缓冲区
以下属性显示层是否具有缓冲区、缓冲区的大小和转换方面的信息。
- 帧号:从应用创建后开始递增的编号。
- 目标帧:用于将缓冲区缩放到由目标帧定义的边界。
层次结构
以下属性描述了如何确定层次结构:
- z 顺序:在层次结构中,z 顺序决定层相对于其同级层的位置。z 值为 0 的层会位于其父级前方。如果多个层具有相同的 z 值,则 ID 较高的层会位于前方。
- 相对父级:表示 z 轴顺序中的相对父级层。子级不会从其相对父级继承任何属性,隐藏的标志除外。
输入
以下属性包含关于可触摸区域和焦点的信息:
- 根据内容项裁剪触摸区域:根据层边界裁剪可触摸区域。
- 将触摸区域替换为裁剪区域:将当前层的裁剪区域用作其可触摸区域。