SurfaceFlinger 转储提供特定时间 SurfaceFlinger 的快照。SurfaceFlinger 跟踪记录按时间顺序排列的状态序列,可深入了解窗口在屏幕上的显示方式,并确定哪个窗口在特定位置接收触摸响应。此信息对于排查诸如应用不响应我的触摸或观看视频时遇到闪烁等问题至关重要。
Winscope 的 SurfaceFlinger 查看器会显示此信息,这些信息来自使用活动模式收集或在拍摄错误报告时从事务跟踪记录生成的跟踪记录(默认情况下为 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 上的覆盖图层。
几何图形和效果
本节介绍当前图层请求和计算的几何图形和效果。
“请求”部分显示在图层上设置的属性。相比之下,“计算”部分显示应用于图层的属性。这种区别是因为几何图形和效果会沿层级结构向下传递,并从父元素继承。
在图 2 中,该图层请求将“圆角半径”设置为 0 像素。但是,其父图层之一将“圆角半径”设置为 97.419 像素,这是应用的实际值。
缓冲区
以下属性显示有关图层是否具有缓冲区、其大小和变换的信息。
- 帧编号:从应用创建时开始的递增编号。
- 目标帧:用于将缓冲区缩放到目标帧定义的边界。
层级结构
以下属性描述如何确定图层的层级结构
- z 序:在图层层级结构中,z 序决定了图层相对于其同级图层的位置。z 值为 0 的图层位于其父图层的上方。如果多个图层共享相同的 z 值,则图层 ID 较高的图层位于顶部。
- 相对父项:指示 z 序中的相对父图层。子项不会从其相对父项继承任何属性,但隐藏标志除外。
输入
以下属性包含有关可触摸区域和焦点的信息
- 使用项裁剪触摸区域:使用图层边界裁剪可触摸区域。
- 使用裁剪替换触摸区域:使用当前图层的裁剪作为其可触摸区域。