wms中对屏幕进行修改wm size设置屏幕宽高原理剖析

背景:

在这里插入图片描述
上面是正常屏幕1440x2960的屏幕大小,如果对display进行相关的修改,可以使用如下命令:
adb shell wm size 1080x1920

得出如下的画面
在这里插入图片描述
明显看到差异就是屏幕上下有黑边了,那么下面就来调研这个wm size是怎么做的的display大小修改的

相关命令调研方式

adb shell dumpsys activity containers看看display的大小
在这里插入图片描述这里可以看出当前的displaycontent的大小就是固定的1080x1920

adb shell am stack list可以看到activity的configration大小也是1080x1920

RootTask id=1 bounds=[0,0][1080,1920] displayId=0 userId=0configuration={1.0 310mcc260mnc [zh_CN_#Hans,en_US] ldltr sw309dp w309dp h501dp 560dpi nrml port finger qwerty/v/v dpad/v winConfig={ mBounds=Rect(0, 0 - 1080, 1920) mAppBounds=Rect(0, 0 - 1080, 1836) mMaxBounds=Rect(0, 0 - 1080, 1920) mDisplayRotation=ROTATION_0 mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=home mAlwaysOnTop=undefined mRotation=ROTATION_0} s.125 fontWeightAdjustment=0}taskId=654: com.android.launcher3/com.android.launcher3.uioverrides.QuickstepLauncher bounds=[0,0][1080,1920] userId=0 visible=true topActivity=ComponentInfo{com.android.launcher3/com.android.launcher3.uioverrides.QuickstepLauncher}RootTask id=3 bounds=[0,0][1080,1920] displayId=0 userId=0configuration={1.0 310mcc260mnc [zh_CN_#Hans,en_US] ldltr sw309dp w309dp h501dp 560dpi nrml port finger qwerty/v/v dpad/v winConfig={ mBounds=Rect(0, 0 - 1080, 1920) mAppBounds=Rect(0, 0 - 1080, 1836) mMaxBounds=Rect(0, 0 - 1080, 1920) mDisplayRotation=ROTATION_0 mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=undefined mAlwaysOnTop=undefined mRotation=ROTATION_0} s.125 fontWeightAdjustment=0}taskId=4: unknown bounds=[0,0][1080,1920] userId=0 visible=falsetaskId=5: unknown bounds=[0,1920][1080,2880] userId=0 visible=false

分析角度dumpsys SurfaceFlinger:

可以看到Layer的buffer大小确实只是1080x1920的

在这里插入图片描述从上面一系列的dumpsys可以得出结论,一旦wm size成了新的屏幕size后,整个系统的大小确实变化了,连displayContent也是变化的。

那么这里大家肯定有疑问,难道真的一个命令真的就可以随意改变我们手机硬件屏幕的分辨率么?

当然不是哈,其实上面的displaycontent大小只是软件层面东西,真正手机屏幕大小其实一点没有变化。
可以通过如下看出:
在这里插入图片描述
可以看到这里的
在这里插入图片描述
可以看出来这里申请sf申请送到hwc的buffer其实大小依然是1440x2960

那么sf是怎么做到把二者不同的屏幕大小统一的呢?

一样在dumpsys SurfaceFlinger堆栈中查找到了如下输出:
在这里插入图片描述
这里看到了一个transform,缩放参数是1.3333
这里刚好是1440 / 1080 = 1.3333
所以这里其实就是最核心的transform,有了它就可以把自定义的屏幕size和屏幕本身size进行统一,让1440x2960大小屏幕可以显示1080x1920屏幕大小内容。
同时注意这里里面其实有一个参数layerStackSpace这里就是代表了自定义屏幕的大小rect参数
他是如何设置呢?看如下堆栈
堆栈:
在这里插入图片描述

到此基本上就对wm size进行了相关的解密,解释清楚了为啥wm size可以任意改变屏幕大小

本文章更多详细代码和资料需要购买课程获取
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.mzph.cn/news/847240.shtml

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

相关文章

matlab中添加子文件夹路径以及结构体

添加子文件夹路径举例 addpath(./functions);结构体使用举例: 首先对结构体初始化,貌似matlab中不需要提前声明。 para para_init();function [para] para_init() %Construct a struct of the initial values for all the parameters % [values] …

(10)svelte 教程:Slots

(10)svelte 教程:Slots 什么是 Slots Slots 是 Svelte 框架中的一种特性,用于在组件中定义插槽,以便父组件可以向子组件传递任意的内容。这种机制使得组件更具灵活性和可复用性,因为你可以在组件内部插入…

水库大坝安全监测系统建设方案

一、背景 随着自动化技术的进步,大部分水库大坝不同程度地实现了安全监测自动化。但仍存在以下问题: 1、重建轻管,重视安全监测系统建设,不够重视运行维护。 2、缺乏系统性、综合性及相关性的资料分析功能。 3、软件大多为数据…

harbor 只读模式修改

The system is in read only mode. Any modification is prohibited。 使用harbor时,做了一个定时清理任务,可能是因为任务失败或者某种原因导致的,系统一直处于只读模式,以为是要看一些表结构,然后去修改参数&#xf…

2.2数据的表示和运算--原码、反码、补码、移码

2.数据的表示和运算 2.2原码、反码、补码、移码 🔺问题:真值与对应的原码、反码、补码变换规则? 答: 正数:原码、反码、补码都一样。 负数:原码不变、反码除符号位其它各位取反、补码在反码基础上再加…

结合视差补偿与3D数据处理的盲光场图像质量评价

摘要:与传统的2D图像相比,光场图像记录了场景中光线的强度和方向信息,在多媒体技术应用领域中占据着重要的地位。但在光场图像的产生、传输等处理过程中会不可避免地引入失真,影响用户视觉体验,因而需构建有效、准确的…

英语口语中though的用法(even though、as though)

文章目录 英语口语中 "though" 的用法详解1. "Though" 作为转折连词的用法1.1 基本用法示例句子: 1.2 位置灵活性示例句子: 2. "Though" 作为副词的用法2.1 表示对比或转折示例句子: 2.2 强调前述观点示例句子…

从 0 到 1 带你认识 Git 在个人和企业开发中的原理及应用

文章目录 学习目标Git 初识提出问题如何解决?—— 版本控制器注意事项 Git 安装Linux CentOSLinux UbuntuWindows Git 基本操作创建 Git 本地仓库配置 Git 认识工作区、暂存区、版本库添加文件——场景一查看 .git 文件 添加文件——场景二 修改文件版本回退 学习目…

FPGA verilog入门案例笔记一

Verilog 是一种硬件描述语言(HDL),广泛应用于电子系统级(ESL)到寄存器传输级(RTL)的数字系统建模。 1. 模块(Module) Verilog 代码的基本单位是模块,它代表了…

浏览器渲染优--防抖节流懒加载

合理选择css选择器 相比于.content-title-span,使用.content .title span时,浏览器计算样式所要花费的时间更多。使用后面一种规则,浏览器必须遍历页面上所有 span 元素,先过滤掉祖先元素不是.title的,再过滤掉.title…

SpringBoot接口防抖(防重复提交)

TOC 啥是防抖 所谓防抖,一是防用户手抖,二是防网络抖动。在Web系统中,表单提交是一个非常常见的功能,如果不加控制,容易因为用户的误操作或网络延迟导致同一请求被发送多次,进而生成重复的数据记录。要针对…

日语日期相关词汇

传统新式何月なんがつ何時なんじ何分なんぶん何秒なんびょういち一月いちがつ1時いちじ1分いっぷん1秒いちびょうに二月にがつ2時にじ2分にふん2秒にびょうさん三月さんがつ3時さんじ&#xff1…

学习小心意——python的构造方法和析构方法

构造方法和析构方法分别用于初始化对象的属性和释放类占有的资源 构造方法_init_() 语法格式如下: class 类名:def __init__(self, 参数1, 参数2, ...):# 初始化代码self.属性1 参数1self.属性2 参数2# ... 示例代码如下 class Student:def __init__(self):s…

如何利用CXL技术突破内存墙?-2

为了解决这些问题,业界正积极寻求新的技术和标准,比如Compute Express Link (CXL),它旨在通过提供标准化的高速互连来提高内存带宽、降低延迟,并简化内存扩展的软件集成,从而有效地打破内存墙的限制。 通过使用CXL&am…

【POSIX】使用regex进行正则匹配

正则表达式是很关键的一个工具&#xff0c;各种编程语言中均通用&#xff0c;务必掌握 给出Linux中man page给出的一个示例&#xff1a; #include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <regex.h>#define ARRAY_SIZE(arr) (s…

Spring的@Async注解及其用途

Spring 的 Async 注解是 Spring Framework 4.2 版本引入的功能&#xff0c;它用于支持异步方法执行。当一个方法标注了 Async&#xff0c;Spring 会在一个单独的线程中调用该方法&#xff0c;从而不会阻塞主线程的执行。 Async 注解的用途&#xff1a; 提高性能&#xff1a;通…

uniapp3步使用goeasy完成本地消息推送

1.注册登录goeasy&#xff0c;下载测试demo 2.替换demo中main.js中的key 3.打包一个H5&#xff0c;一个自定义基座。 h5发消息&#xff0c;app收消息&#xff0c;然后创建消息通知就好了。记得打开app的消息通知 demo很简单&#xff0c;demo都跑通了&#xff0c;在搬到自己项目…

NAVICAT从MYSQL链接到ORCAL数据库

1、工具-选线 2、环境&#xff0c;将原有的mysql的oci.dll文件改为oracle的 3、新建连接 填写对应数据

axios拦截器

定义 在客户端通过axios发送请求或响应被 then 或 catch 处理前拦截它们。顾名思义&#xff0c;在axios发送请求之前在请求数据内添加条件或者验证&#xff0c;并通过函数返回错误。在收到服务器的响应数据进行返回&#xff0c;遇到无法响应的情况在catch之前拦截错误信息进行…

国产高边驱动HD70202Q替换英飞凌BTS7040-2

高边驱动也称之为高边开关&#xff0c;主要用于车内负载的驱动与开关&#xff0c;并对负载进行保护和诊断。高边驱动以高可靠性、灵活性、低功耗以及小型轻量等特点&#xff0c;正逐渐替代传统的保险丝、继电器等方案。 RAMSUN提供的HD70202Q车规级双通道智能高边驱动的输入控…