背景:
在马哥付费课群里技术讨论时候,有一个学员朋友提出一个问题,那就是录屏时候他提到了,aosp14会使用到一个Mirror对应图层的情况,针对录屏需要对录屏这个虚拟的display进行mirror原来的display。
可以用如下图来表示一下:
录屏过程中有两个Display,多了一个Virtual Display,而且在aosp14平台,这个display上还有很多个primary display一一对应的Mirror Layer。
但是针对学员提出这样一个背景,我多少感觉还是非常疑惑,我印象中在aosp13平台并没有发现Virtual Display上有挂载任何的Mirror Layer,所有的Layer都是共用primary Layer,根本没有额外创建新的Mirror Layer
验证差异
验证方式:
同样都在安卓aosp13和安卓14手机上都使用screenrecord命令进行录制,录制过程中(切勿停止中断)进行
dumpsys SurfaceFlinger | grep Mirror查看结果是否有对应的Mirror图层
aosp13的版:
在安卓13上面确实发现,录屏过程中dumpsys结果来看,一个Mirror的图层都没有
aosp14版本:
展示结果如下,可以看到确实在aosp 14上有大量的Mirror图层产生,这些Mirror图层绘制到了录屏的Virtual Display上去了
剖析原因
背景知识:
首先每个Display都一般会有自己的Layer的,录屏时候也就相当于Virtual Display也是需要有自己的Layer,不然怎么录屏就不会绘制到Display即屏幕显示空白。所以说Virtual Display上面显示一堆的Mirror Layer来和主屏幕保持一致其实是完全可行的方案。即primary display和Virtual display都有各自的Layer,各自layer都合成到各自display。
知道了上面的表面情况后,那么问题也来了,为啥安卓13和安卓14一个没有出现Mirror,一个出现了Mirror都可正常的录屏运行呢?
要解释这个问题其实就得看看dumpsys SurfaceFlinger中Display的详细情况才可以得出结论:
先来看看aosp13没有Mirror Layer可以成果的情况:
Display 0 (physical, "Primary display")Composition Display State:isEnabled=false isSecure=true usesDeviceComposition=true usesClientComposition=true flipClientTarget=false reusedClientComposition=true layerFilter={layerStack=4294967295 toInternalDisplay=true }transform (ROT_0) (IDENTITY)
Display 11529215049921755628 (virtual, "ScreenRecorder")Composition Display State:isEnabled=true isSecure=false usesDeviceComposition=false usesClientComposition=true flipClientTarget=false reusedClientComposition=false layerFilter={layerStack=4294967295 toInternalDisplay=false }
明显可以看到这里的两个display的layerstack都是4294967295,是相等的,所以说在判断Layer属于哪个一个display时候,那么就是一个layer可以属于primary display,同时也是属于Virtual display,因为他们的layerstack是相等的
再来看看aosp14的dumpsys SurfaceFlinger的display情况下
主屏幕的display对应layerstack是0
Display 4619827259835644672 (physical, "EMU_display_0")Composition Display State:isEnabled=true isSecure=true usesDeviceComposition=true usesClientComposition=false flipClientTarget=false reusedClientComposition=false layerFilter={layerStack=0 toInternalDisplay=true }transform (ROT_0) (IDENTITY)
Virtual display对应的layerstack是1804289383
Display 11529215049690836775 (virtual, "ScreenRecorder")Composition Display State:isEnabled=true isSecure=false usesDeviceComposition=false usesClientComposition=true flipClientTarget=false reusedClientComposition=false layerFilter={layerStack=1804289383 toInternalDisplay=false }transform (ROT_0) (SCALE TRANSLATE)
这里明显可以看出两个display的layerstack是不相等的,所以本身属于primary的Layer根本就不可以直接被Virtual display使用。
查询代码差异:
有了上面的知识背景后,也知道了本质原因是因为新版本aosp14的layerstack不一样。那么这个不一样到代码端呢?
aosp13代码情况如下:
aosp14代码情况如下:
总结感悟:
到这里,就把学员提出的录屏时候Mirror问题前后版本出现与不出现的原因搞清楚了,整体其实探索出来了结果后并不是很复杂,但是如果要自己去探索还是有一定的难度的。虽然有难度,马哥还是希望大家平时遇到相关的技术疑问时候不要轻易放弃或者完全不管,应该努力用自己学习知识应用起来,结合起来,去分析实际开发中遇到一些问题。只有这样不断探索,技术才会不断成长,成长到有一天你发现你对这个模块理解深入程度基本上也不输给任何人的时候,你就是这方面的顶级专家。
本文章更多详细代码和资料需要购买课程获取
hal+perfetto+surfaceflinger
https://mp.weixin.qq.com/s/LbVLnu1udqExHVKxd74ILg
私聊作者+v(androidframework007)
其他课程七件套专题:
点击这里
https://mp.weixin.qq.com/s/Qv8zjgQ0CkalKmvi8tMGaw
视频试看:
https://www.bilibili.com/video/BV1wc41117L4/