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

Android 屏幕录制时去除悬浮窗 最近在用Android8.0开发一个屏幕录制的功能,要求录制的视频不能有录屏的控制悬浮窗。 录屏方案使用的是MediaRecorder、MediaProjection、VirtualDisplay。 Android支持多个屏幕:主显、外显、虚显,虚显就是VirtualDisplay。 VirtualDisplay的使用场景很多,比如录屏,WED显示等。其作用就是抓取屏幕上显示的内容。 录屏... 阅读详情

背景:
在马哥付费课群里技术讨论时候,有一个学员朋友提出一个问题,那就是录屏时候他提到了,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干货请关注“千里马学框架”

SurfaceFlinger详解 Surface进行merge可以采用两种方式,一种就是采用软件的形式来merge,还一种就是采用硬件的方式,软件的方式就是我们的SurfaceFlinger,而硬件的方式就是Overlay。 SurfaceFlinger 是一个独立的Service, 它接收所有Window的Surface作为输入,根据ZOrder, 透明度,大小,位置等参数,计算出每个Surface在最终合成图像中的位置,然后交由HWComposer或Ope... 阅读详情

相关推荐

Android 13 骁龙相机点击录像流程分析

录像的流程大概分为几个阶段:进行预览、点击开始录像(跳过)、点击按钮结束录像、数据库保存生成uri、根据uri保存左下角缩略图、将uri保存内存中、点击左下角进入相册,下面我们一步一步进行分析。

龚礼鹏的博客 1225

安卓14.0的root方法

用Magisk获取Root权限的办法是,你需要下载OTA包或者你所安装的手机系统的boot.img,这个是系统的内核。把它放在手机里比如/sdcard/downlaod目录,接着用手机上的Magisk对内核进行装订修改,生成获取Root权限的内核,一般会在同目录/sdcard/downlaod中生成 patched boot image,也就是破解的内核,然后把这个破解的内核在电脑上用fastboot命令行刷回手机,获取Root权限。有人问,都什么年代了,还有人刷Root干嘛?

bugsycrack的博客 1万+

你的App合规吗?手把手教你用Camille生成隐私调用报告给老板看

本文详细介绍了如何使用开源工具Camille进行Android App隐私合规检测,并生成高管易懂的隐私调用报告。通过动态插桩技术和多维度分析,Camille能有效识别高风险API调用,并将其映射到具体法律条款,帮助技术团队与法务、产品等非技术部门高效沟通,确保App符合《个保法》等法规要求。

weixin_33726318的博客 422

SurfaceFlinger实战dump获取单个Layer图像方案及成果展示-千里马学框架

今天来给大家分享一下如何实现单独获取某个Layer的图片,而不是整个屏幕的图片。

learnframework的博客 3018

ArcGIS实战:手把手教你用DEM和灾害点数据,5步搞定地质灾害风险区划图

本文详细介绍了使用ArcGIS进行地质灾害风险评估的完整流程,从DEM和灾害点数据出发,通过五步标准化操作生成专业风险区划图。重点讲解了信息量模型的应用,帮助读者掌握GIS技术在地质灾害易发性评价中的实践方法,提升风险评估效率与准确性。

weixin_30696427的博客 426

贝塞尔曲线原理--曲线生成--路径规划--matlab代码

贝塞尔曲线有着很多特殊的性质, 在图形设计和路径规划中应用都非常广泛, 在路径规划中贝塞尔曲线完全由其控制点决定其形状, n个控制点对应着n-1阶的贝塞尔曲线,并且可以通过递归的方式来绘制.

bob595078694的博客 1万+

【Android】从SurfaceFlinger中获取各layer图片(1)

Surfaceflinger进程提供一个入口来实现对各进程的surface画面进行合并处理,也就是说,Surfaceflinger进程中保存有各进程的图像,(即layer),这里尝试获取各layer图像数据,来加深对surface的理解。 图像保存方法,参考screencap里的截屏实现, int writePNG(char* fileName, char*base, int w,...

aaajj的专栏 4596

人工智能学习之机器人路径规划优化

A* AStar 人工智能 机器人路径规划优化

RongLin02的博客 7073

hal/SurfaceFlinger/perfetto实战需求问题探讨作业-千里马framework开发

截图分享可以选定某个特定窗口进行,这个和上面的录屏其实基本上类似一个场景,就是截图时候有会存在只需要截图固定窗口window的,不需要其他window的情况,同样游戏主播进行直播这个情况,截图时候希望只有游戏画面就可以,游戏画面上面的其他app的窗口不希望在截图中。经常分析一些显示问题时候,会想要dumpsys各个图层,但是dumpsys SurfaceFlinger命令一般来说只是有相关的图层信息,是文本类的信息,所以有时候黑屏或者显示 异常情况就比较难看出来是不是自己图层本身上帧有问题。

learnframework的博客 1498

Cryptomatte For Nuke的安装

进入官网https://github.com/Psyop/Cryptomatte,下载文件代码。 将Cryptomatte/nuke里的文件内容复制粘贴到 .nuke文件夹内。 在我们复制粘贴的内容中可以看到两个文件。 同时,我们进入nuke的下载目录,打开plugins文件夹,看到和插件中一样python文件——init.py和menu.py。 我们将Cryptomatte里的init.py和menu.py里的python代码复制粘贴到Nuke/plugins下的init...

qq_41627587的博客 9062

北斗导航 | 2023 PTTI会议论文 2023 ITM会议论文 2022 ION GNSS+ 会议论文下载:ION 美国导航学会

2023 国际技术会议(ITM) 2023 精密时间和时间间隔系统和应用会议(PTTI) 2022 美国导航学会国际会议(ION GNSS +)

尘世冰封的专栏 4613

SurfaceFlinger中各个layer的排序

在layer排序的时候,首先是通过layerstack进行筛选,接着是按照z-index对layer进行排序,最后按照sequence排序

scpcaicai的专栏 3405

Python爬虫实战:利用Selenium与反反爬技术高效爬取企查查工商信息

本文将详细介绍如何使用Python最新爬虫技术(包括Selenium、Playwright、智能代理池等)爬取企查查工商信息数据。文章包含完整的代码实现、反反爬策略、数据解析与存储方案,以及法律合规性讨论,共计约8000字。企查查作为国内领先的企业信息查询平台,收录了超过2亿家企业的工商信息、司法信息、知识产权等数据。这些数据对于市场分析、商业决策等具有重要价值。法律边界提示禁止大规模爬取导致服务器过载不得绕过付费接口获取数据数据使用需遵守《个人信息保护法》商业用途需获得授权。

2201_76125261的博客 2236

SurfaceFlinger中Layer的修改 - 安卓R

1

SSSxCCC的博客 5429

DaVinci配置DID之二:工具链配置

本系列主要基于DaVinCi工具链来展开具体DID读写的配置以及最终实现。1,CDD准备2,工具链配置3,代码实现4,验证结果本文讲述流程2话不多说,走你~博主也是AutoSar小白,如果哪里表达的有问题,还请大佬们指点指点哈。接下来,让我们在下章关于代码具体实现的博文再相会哈~

weixin_48498880的博客 5741

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Android 录屏报错

录屏的时候报错: java.io.IOException: prepare failed. java.lang.IllegalStateException: failed to get surface 解决办法: 设置有效的,宽高,且宽高不能是奇数 mediaRecorder.setVideoSize(width, height);

qq_33601179的博客 1075

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Android 14 root完全指南:从入门到精通全面解析

Android 14 root是一项能够解锁设备全部潜能的高级技术操作,通过获取系统最高权限,用户可以实现深度定制、性能优化和功能扩展。本指南将从基础认知到进阶应用,全面覆盖Android 14 root的工具选型、操作流程、安全配置、功能扩展及问题解决,帮助进阶用户安全高效地完成root操作,打造个性化的Android体验。 ## 一、认知:Android 14 root核心原理与价值 ##

gitblog_00066的博客 689

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

通过 dumpsys SurfaceFlinger 分析Android 系统图层

一、通过 dumpsysSurfaceFlinger 分析Android 系统图层: 从下面的dumpsys log看出当前系统有三个图层(红色部分是每个图层的坐标和大小),从最底层到上层分别是ImageWallpaper(壁纸), SurfaceView(视频小窗口), launcher(桌面)。其中视频小窗口用Overlay的方式独立输出到视频层,这样的话只有壁纸层和桌面层通过GPU混合后输

haima1998的专栏 1万+

试验SurfaceFlinger 中Source Crop

在创建图层时,我们可以通过设置组件的 SurfaceHolder 或者 SurfaceTexture 等对象的 Source Crop 属性来指定图层的裁剪区域,从而实现对图层的缩放和裁剪等操作。需要注意的是,在设置 Source Crop 属性时,我们使用了 SurfaceHolder 的 setFixedSize() 方法来指定目标区域的尺寸。通过setFixedSize可以设置绘制的大小,这里我们进行测试,在一个activity中准备3个按钮,点击按钮来绘制不同大小的画布,看看效果。

aaajj的专栏 2572

安卓刷ROOT

你就可以使用比如 adb install 、 push 、 reboot 等等指令在电脑上控制手机了。当上述的步骤全部完成之后, Magisk 板块内的「当前」就会从「无法读取」变成 Magisk app 的版本号,表明已经取得 root 权限,同时下方也会显示「卸载 Magisk 」的按钮。我们所需的 adb 配置文件会以压缩包的形式下载,将它解压成一个文件夹、保存在你常用的位置即可。

weixin_52407519的博客 2848

Android高通 12/13 录屏流程代码位置

3、RecordingService 中实现开始录屏功能 代码如下图所示。4、ScreenMediaRecorder 调用start方法开始录屏。5、ScreenMediaRecorder停止录屏 调用代码路径。

郑敏 1009

Android14 使用Magisk apk获取root权限

摘要:这是一组Android设备解锁bootloader和获取root权限的操作步骤。首先使用adb和fastboot命令解锁bootloader,包括获取识别令牌、生成签名文件等过程。然后通过adb获取boot分区镜像,安装Magisk应用获取root权限。操作涉及设备重启、禁用验证、重新挂载系统分区等关键步骤。整个过程需要谨慎操作,不当使用可能导致设备故障或数据丢失。(149字)

ruidongren的专栏 1051

android surfaceflinger 代码,Android SurfaceFlinger服务(三) ----- 本地图层Layer创建(示例代码)...

在上一篇文章中,主要分析了Surface的创建过程,对于Layer图层的创建并没有深入跟踪分析。这篇文章将分析Layer图层的创建,并分析handle gbp这两个变量的来源。在SurfaceFlinger中会根据flags的值创建不同的layer。这里主要以创建普通layer为例进行分析。status_t SurfaceFlinger::createNormalLayer(const sp&am...

weixin_42411003的博客 352

systrace学习笔记

7.渲染线程首先需要从BufferQueue里面取一个Buffer(dequeueBuffer),进行数据处理之后,调用OpenGL相关的函数,真正地进行渲染操作,然后将这个渲染好的Buffer还给BufferQueue(queueBuffer),SurfaceFlinger在Vsync-SF到了之后,将所有准备好的Buffer取出进行合成(这个流程在讲SurfaceFlinger的时候会提到)6.第六阶段:最终合成好的数据放到屏幕对应的FrameBuffer中,固定刷新的时候就可以看到了。

梦风心雨的博客 1671
上一篇: lineageos 21/aosp14环境搭建小米,nubia手机差异补充
下一篇: ActivityRecordInputSink深入剖析全网独家分析
千里马学框架
博客等级 码龄6年 1万+粉丝 650原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

千里马学框架

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

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

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

打赏作者

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

抵扣说明:

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

余额充值