SurfaceFlinger中Layer泄露如何排查解决?-vip学员作业

背景

在学习马哥的wms/ams深入专题课程时,马哥有布置的一个课外作业:大概就是我们修改闪黑问题时候可能会引入一个Bpq对应的Layer会泄漏的情况,要求大家进行修复。针对这个问题很多学员也积极去完成这个作业,而且也都完成的比较好,在这里对这些认真学习的学员提出表扬。

但是也有更加细心同学提出一个Android原生的壁纸会Layer内存泄漏的bug,具体如下:
在这里插入图片描述
就是在wms课程作业壁纸bug问题修复时候发现一直有ImageWallpaper Layer的泄漏,具体可以看dumpsys SurfaceFlinger的OffScreen的Layer情况:

在这里插入图片描述

其实这个ImageWallpaper的Layer泄漏属于安卓13原生就有的bug,这个我也让学员先自行探索原因然后修复。

在这里插入图片描述

复现问题环境

图层Layer泄漏问题影响:

在这里插入图片描述如果图层过多超过最大值4096,那么就无法再创建新的图层。

static constexpr size_t MAX_LAYERS = 4096;
系统环境:

aosp 13 r6

复现步骤:

1、桌面任意切换壁纸若干次

2、然后使用dumpsys SurfaceFlinger查看OffScreen部分是否有没有释放的图层,比如可以看到如下截图情况。

在这里插入图片描述

什么是OffScreenLayer

mOffscreenLayers 是 SurfaceFlinger 中定义的一个 std::unordered_set<Layer*>,用于存储已从屏幕移除但仍需要管理的 Layer。

何时添加到 Offscreen
当一个 Layer 被移除且没有父层时,会被添加到 offscreen 集合:

// SurfaceFlinger.cpp:3485-3490
// If the layer has been removed and has no parent, then it will not be reachable
// when traversing layers on screen. Add the layer to the offscreenLayers set to
// ensure we can copy its current to drawing state.
if (!l->getParent()) {
    mOffscreenLayers.emplace(l.get());
}

作业布置

本次作业主要就以以下几个点来进行:

1、遇到这种layer泄漏的问题,请问你是如何排查的,说出你的流程

2、为啥会有ImageWallpaper的layer泄漏呢?请剖析出原因

3、请问为啥就ImageWallpaper有泄漏,其他正常的窗口没泄漏呢?

4、给出相关的优化修复方案,并进行验证

相关作业讨论及答案公布,请关注vip学员关注群消息

原文地址:
https://mp.weixin.qq.com/s/yiQH4iPJKTH153Pn40Xu0A

更多framework实战开发带学干货资料获取,请关注下面“千里马学框架”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

千里马学框架

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

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

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

打赏作者

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

抵扣说明:

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

余额充值