背景
在学习马哥的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实战开发带学干货资料获取,请关注下面“千里马学框架”
1746

被折叠的 条评论
为什么被折叠?



