安卓闪黑黑屏分析工具:aosp14/15版本Winscope之SurfaceFlinger信息剖析

SurfaceFlinger

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

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

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

SurfaceFlinger 跟踪记录分析
在这里插入图片描述

图 1. SurfaceFlinger 跟踪记录分析。

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

层次结构条状标签

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

V:标识可见层。
RelZParent:标识具有 RelZ 子级的层。
RelZ:标识具有 RelZParent 且按照层次结构中的 z 轴顺序进行绘制的层。

警告:以下各项自 Android 15 起已废弃,但仍会显示在较旧的跟踪记录中。

HWC:标识由硬件混合渲染器合成的层。
GPU:标识由 GPU 合成的层。

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

精选属性

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

SurfaceFlinger 属性
在这里插入图片描述

图 2. SurfaceFlinger 属性。

此列表包含以下类别。

可见性

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

Flags:用于控制可见性,例如 HIDDEN 和 OPAQUE。

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

被遮挡、被部分遮挡或被覆盖:

Occluded:

系统将当前层计算为可见,但在其前面绘制了另一个不透明层,从而导致当前层不可见。被遮挡的层前方的层不透明,也就是说,前方的层设置了 OPAQUE 标志、像素格式不包含 alpha,或未设置 alpha。
Partially Occluded:

当前层部分可见,因为其前方绘制的不透明层未完全覆盖它。被部分遮挡的层前方的层不透明,也就是说,前方的层设置了 OPAQUE 标志、像素格式不包含 alpha,或未设置 alpha。

Covered:

当前层被透明层完全或部分覆盖,但在屏幕上仍可能可见。被覆盖的层前方的层透明,也就是说,前方的层未设置 OPAQUE 标志、像素格式包含 alpha,或设置了 alpha。不过,在 SurfaceFlinger 跟踪记录中,被覆盖的层对于 SurfaceFlinger 后方的层来说会显示为可见:

在这里插入图片描述

图 3. SurfaceFlinger 上被覆盖的层。

注意:透明层支持半透明像素。如果层内容完全不透明,那么其后方的层不会显示在界面上。

注意:如果某个层被一个或多个不透明层遮盖,或者被一个包含不透明像素的半透明层覆盖,则该层可能会被视为可见,但不会显示在界面上。

几何图形和效果

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

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

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

缓冲区

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

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

层次结构

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

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

输入

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

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

英文版本参考:

https://source.android.google.cn/docs/core/graphics/winscope/analyze/sf

更多framework实战开发,请关注下面“千里马学框架”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值