安卓14/aosp14相比安卓13录屏多了MirrorRoot深入剖析解密-千里马android framework实战开发

213 阅读4分钟

背景: 在马哥付费课群里技术讨论时候,有一个学员朋友提出一个问题,那就是录屏时候他提到了,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 mp.weixin.qq.com/s/LbVLnu1ud… 在这里插入图片描述

私聊作者+v(androidframework007)

其他课程七件套专题:在这里插入图片描述 点击这里 mp.weixin.qq.com/s/Qv8zjgQ0C…

视频试看: www.bilibili.com/video/BV1wc…