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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/267394.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#入门:简单数据类型和强制类型转换

本文由 简悦 SimpRead 转码, 原文地址 mp.weixin.qq.com 本期来讲讲 unity 的脚本语言 —C#,C# 的简单数据类型及范围和强制类型转化的方法。这可是 unity 游戏开发必备技能。 1. 简单数据类型 各个类型的范围: byte -> System.Byte (字节…

手动实现一个简单的 HTTP 请求

本文我们通过 Socket,写一个 HTTP 协议,直观的感受一下上篇文章中的请求和响应。 定义 socket server 通过上篇文章,我们知道 HTTP 协议底层是通过 Socket 实现的,所以我们先通过 socket 定义一个 server import socket#初始化 …

Thread多线程(创建,方法,安全,通信,线程池,并发,并行,线程的生命周期)【全详解】

目录 1.多线程概述 2.多线程的创建 3.Thread的常用方法 4.线程安全 5.线程同步 6.线程通信 7.线程池 8.其它细节知识:并发、并行 9.其它细节知识:线程的生命周期 1.多线程概述 线程是什么? 线程(Thread)是一个程序内部的一条执行…

day04_拦截器Apifox角色管理(登录校验,API接口文档,权限管理说明,角色管理,添加角色,修改角色,删除角色)

文章目录 1. 登录校验1.1 需求说明1.2 实现思路1.3 ThreadLocal1.4 AuthContextUtil1.5 拦截器使用1.5.1 拦截器开发1.5.2 拦截器注册 1.6 代码优化1.6.1 配置优化1.6.2 代码优化1.6.3 前端修改 2. API接口文档2.1 Apifox接口管理平台2.1.1 接口管理平台简介2.1.2 Apifox简介2.…

Python读取hbase数据库

1. hbase连接 首先用hbase shell 命令来进入到hbase数据库,然后用list命令来查看hbase下所有表,以其中表“DB_level0”为例,可以看到库名“baotouyiqi”是拼接的,python代码访问时先连接: def hbase_connection(hbase…

mysql 远程不允许连接 1130 -Host ‘‘ is not allowed to connect to this MySQL server

1、docker 进入mysql 命令 sudo docker exec -it 0c58 /bin/bash 2、连接mysql mysql -u root -ppwd 3、 use mysql; 4、更改表所有root用户都可以连接 update user set host ‘%’ where user‘root’; 5、刷新权限 flush privilege; ok解决;

【前端素材】推荐优质后台管理系统网页Hyper平台模板(附源码)

一、需求分析 1、系统定义 后台管理系统是一种用于管理和控制网站、应用程序或系统的管理界面。它通常被设计用来让网站或应用程序的管理员或运营人员管理内容、用户、数据以及其他相关功能。后台管理系统是一种用于管理网站、应用程序或系统的工具,通常由管理员使…

二维码门楼牌管理系统技术服务的深度解析

文章目录 前言一、标准地址名称的定义与重要性二、二维码门楼牌管理系统的核心技术三、标准地址名称在二维码门楼牌管理中的应用四、二维码门楼牌管理系统的优势与挑战五、展望未来 前言 在数字化浪潮中,二维码门楼牌管理系统以其高效、便捷的特性,正逐…

windows 11 前后端项目部署

目录 1.准备环境: 2.安装jdk 测试:winr 输入cmd 3.安装tomcat 4.安装mysql 远程导入数据: 外部后台访问:192.168.232.1:8080/crm/sys/loginAction.action?usernamezs&password123 5.安装nginx 前后端部署&#xff1…

Mysql 的高可用详解

Mysql 高可用 复制 复制是解决系统高可用的常见手段。其思路就是:不要把鸡蛋都放在一个篮子里。 复制解决的基本问题是让一台服务器的数据与其他服务器保持同步。一台主库的数据可以同步到多台备库上,备库本身也可以被配置成另外一台服务器的主库。主…

C++——模版

前言:哈喽小伙伴们好久不见,这是2024年的第一篇博文,我们将继续C的学习,今天这篇文章,我们来习一下——模版。 目录 一.什么是模版 二.模版分类 1.函数模版 2.类模板 总结 一.什么是模版 说起模版,我们…

flutter 加密安全

前言:数据安全 数据的加密解密操作在 日常网络交互中经常会用到,现在密码的安全主要在于 秘钥的安全,如论 DES 3DES AES 还是 RSA, 秘钥的算法(计算秘钥不固定) 和 保存,都决定了你的数据安全;…

【重温设计模式】享元模式及其Java示例

享元模式的介绍 在编程世界中,我们常常面临着如何有效管理系统资源的挑战。这就好比我们在生活中,面对有限的物质资源,如何做到既满足需求又节约使用,是一门艺术。在设计模式中,有一种模式,恰如其分地解决…

Android之UI Automator框架源码分析(第九篇:UiDevice获取UiAutomation对象的过程分析)

前言 学习UiDevice对象,就需要看它的构造方法,构造方法中有UiDevice对象持有一些对象,每个对象都是我们分析程序的重点,毕竟UiDevice对象的功能,依赖这些组合的对象 备注:当前对象持有的对象,初…

leedcode刷题--day7(字符串)

23 文章讲解 力扣地址 C class Solution { public:void reverseString(vector<char>& s) {int left 0;int right s.size() - 1; // right 应该初始化为 s.size() - 1while (left < right) {swap(s[left], s[right]); // 直接交换 s[left] 和 s[right] 的值lef…

蓝桥杯-单片机组基础5——外部中断与LED的控制(附小蜜蜂课程代码)

蓝桥杯单片机组备赛指南请查看这篇文章&#xff1a;戳此跳转蓝桥杯备赛指南文章 本文章针对蓝桥杯-单片机组比赛开发板所写&#xff0c;代码可直接在比赛开发板上使用。 型号&#xff1a;国信天长4T开发板&#xff08;绿板&#xff09;&#xff0c;芯片&#xff1a;IAP15F2K6…

Excel常用公式总结非常实用

16个最实用的Excel万能公式 1、多条件判断 IF(And(条件1,条件2..条件N),条件成立返回值) IF(or(条件1,条件2..条件N),条件成立返回值) 2、多条件查找 Lookup(1,0/((条件1*条件2*...条件N)),返回值区域&#xff09; 3、多条件求和 Sumifs(值区域,判断区域1,条件1,判断区域2,条…

1_SQL

文章目录 前端复习SQL数据库的分类关系型数据库非关系型数据库&#xff08;NoSQL&#xff09; 数据库的构成软件架构MySQL内部数据组织方式 SQL语言登录数据库数据库操作查看库创建库删除库修改库 数据库中表的操作选择数据库创建表删除表查看表修改表 数据库中数据的操作添加数…

GO—函数

Go 语言支持普通函数、匿名函数和闭包&#xff0c;从设计上对函数进行了优化和改进&#xff0c;让函数使用起来更加方便。 Go 语言的函数属于“一等公民”&#xff08;first-class&#xff09;&#xff0c;也就是说&#xff1a; 函数本身可以作为值进行传递。支持匿名函数和闭…

Android 混淆是啥玩意儿?

什么是混淆 Android混淆&#xff0c;是伴随着Android系统的流行而产生的一种Android APP保护技术&#xff0c;用于保护APP不被破解和逆向分析。简单的说&#xff0c;就是将原本正常的项目文件&#xff0c;对其类、方法、字段&#xff0c;重新命名a,b,c…之类的字母&#xff0c…