SurfaceFlinger

SurfaceFlinger 转储能够提供特定时间的 SurfaceFlinger 快照。SurfaceFlinger 跟踪记录会按时间顺序显示状态序列,以便提供有价值的信息,让用户了解窗口在界面上的显示方式,以及如何确定哪个窗口在特定位置接收触摸响应。这些信息对于排查问题(例如应用未响应我的触摸操作或我在观看视频时遇到闪烁问题)至关重要。

Winscope 的 SurfaceFlinger 查看器会针对以下各项显示这些信息:使用活跃模式收集的跟踪记录或在提交 bug 报告时根据事务跟踪记录生成的跟踪记录(默认情况下为 Droidfood 配置),以及转储。

如需详细了解跟踪记录收集,请参阅 SurfaceFlinger(层)

SurfaceFlinger 跟踪记录分析

图 1. SurfaceFlinger 跟踪记录分析。

界面左侧显示了层的 3D 视图。矩形视图考虑了层边界、z 轴顺序、不透明度、相对 Z 值和圆角。

层次结构条状标签

该标签页的中心部分显示了层次结构,其中包含用于显示更多信息(例如层之间的父子关系)的条状标签,如下所示:

  • V:标识可见层。
  • RelZParent:标识具有 RelZ 子级的层。
  • RelZ:标识具有 RelZParent 且按照层次结构中的 z 轴顺序进行绘制的层。
  • HWC:标识由硬件混合渲染器合成的层。
  • GPU:标识由 GPU 合成的层。

界面右侧显示了一系列精选属性,以及包含所有可用层属性的 proto 转储。如需详细了解 proto 转储部分的内容,请参阅属性

精选属性

为了让调试更轻松,SurfaceFlinger 查看器提供了一系列精选属性,以便以更有条理的格式呈现最常用的信息:

SurfaceFlinger 属性

图 2. SurfaceFlinger 属性。

此列表包含以下类别。

可见性

此部分包含关于层可见性的信息,以及层不可见的原因。其中包括:

标志:用于控制可见性,例如 HIDDENOPAQUE

不可见原因:说明层或 surface 在界面上不可见的原因(如果适用),例如由自身或其父级隐藏,或者没有缓冲区来绘制。

被遮挡被部分遮挡被覆盖

  • 被遮挡:系统将当前层计算为可见,但在其前面绘制了另一个不透明层,从而导致当前层不可见。被遮挡的层前方的层不透明,也就是说,前方的层设置了 OPAQUE 标志、像素格式不包含 alpha,或未设置 alpha。
  • 被部分遮盖:当前层部分可见,因为其前方绘制的不透明层未完全覆盖它。被部分遮挡的层前方的层不透明,也就是说,前方的层设置了 OPAQUE 标志、像素格式不包含 alpha,或未设置 alpha。
  • 被覆盖:当前层被透明层完全或部分覆盖,但在屏幕上仍可能可见。被覆盖的层前方的层透明,也就是说,前方的层未设置 OPAQUE 标志、像素格式包含 alpha,或设置了 alpha。不过,在 SurfaceFlinger 跟踪记录中,被覆盖的层对于 SurfaceFlinger 后方的层来说会显示为可见:

    SurfaceFlinger 上被覆盖的层

    图 3. SurfaceFlinger 上被覆盖的层。

几何图形和效果

本部分介绍了为当前层请求和计算出的几何图形和效果。

Requested(请求的属性)部分显示层上设置的属性。Calculated(计算出的属性)部分则显示为层应用的属性。之所以有这种区别,是因为几何图形和效果会沿着层次结构传递,并从父元素继承。

在图 2 中,层请求将 Corner Radius 设置为 0 像素。但是,其中一个父层将 Corner Radius 设置为 97.419 像素,这是应用的值:

缓冲区

以下属性显示层是否具有缓冲区、缓冲区的大小和转换方面的信息。

  • 帧号:从应用创建后开始递增的编号。
  • 目标帧:用于将缓冲区缩放到由目标帧定义的边界。

层次结构

以下属性描述了如何确定层次结构:

  • z 顺序:在层次结构中,z 顺序决定层相对于其同级层的位置。z 值为 0 的层会位于其父级前方。如果多个层具有相同的 z 值,则 ID 较高的层会位于前方。
  • 相对父级:表示 z 轴顺序中的相对父级层。子级不会从其相对父级继承任何属性,隐藏的标志除外。

输入

以下属性包含关于可触摸区域和焦点的信息:

  • 根据内容项裁剪触摸区域:根据层边界裁剪可触摸区域。
  • 将触摸区域替换为裁剪区域:将当前层的裁剪区域用作其可触摸区域。