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

AOSP13与14版本间VirtualDisplay镜像层差异:从录屏技术探讨

背景:
在马哥付费课群里技术讨论时候,有一个学员朋友提出一个问题,那就是录屏时候他提到了,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问题前后版本出现与不出现的原因搞清楚了,整体其实探索出来了结果后并不是很复杂,但是如果要自己去探索还是有一定的难度的。虽然有难度,马哥还是希望大家平时遇到相关的技术疑问时候不要轻易放弃或者完全不管,应该努力用自己学习知识应用起来,结合起来,去分析实际开发中遇到一些问题。只有这样不断探索,技术才会不断成长,成长到有一天你发现你对这个模块理解深入程度基本上也不输给任何人的时候,你就是这方面的顶级专家。

更多framework干货请关注“千里马学框架”

`.repo/repo/main.py` 是 AOSPAndroid Open Source Project)中 `repo` 工具的核心执行脚本之一,主要负责初始化和管理仓库项目的命令行接口。该文件作为 `repo` 命令的入口点,承担了解析用户输入、调用相应子命令模块以及处理全局配置等职责。 在 Android 13AOSP 环境中,`main.py` 文件通常包含以下关键功能: - **命令解析与分发**:`main.py` 负责解析用户通过命令行传入的参数,并根据这些参数决定调用哪个子命令模块(如 `init`、`sync`、`forall` 等),从而实现对整个代码库的管理[^1]。 - **环境初始化**:在执行具体操作之前,`main.py` 会进行必要的环境初始化工作,包括加 `.repo` 目中的配置信息、清单文件(manifest.xml)以及确定当前工作目是否符合 repo 工具的要求[^3]。 - **版本兼容性控制**:由于 `repo` 工具本身依赖于 Python 解释器运行,`main.py` 中通常会指定使用 Python 3 的 shebang 行(例如 `#!/usr/bin/env python3`),以确保语法兼容性和避免因 Python 2 与 Python 3 的差异导致的错误(如 `SyntaxError`)[^1]。 - **异常处理与日志输出**:`main.py` 还包含了基础的异常捕获机制,用于在执行过程中捕捉并报告错误信息,同时支持将调试信息输出到标准错误流(`sys.stderr`),以便开发者定位问题。 如果在使用 `repo` 命令时遇到类似 `SyntaxError: invalid syntax` 的错误,这通常是由于系统默认使用的 Python 版本不匹配所致。解决此类问题的方法之一是确保使用 Python 3 来执行 `repo` 命令,或者替换为兼容 Python 3 的 `repo` 可执行文件[^1]。 ### 示例:检查 main.py 的 shebang 行 ```python #!/usr/bin/env python3 ``` ### 示例:手动指定 Python 3 执行 repo 命令 ```bash python3 .repo/repo/main.py sync ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

千里马学框架

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

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

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

打赏作者

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

抵扣说明:

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

余额充值