当前位置: 首页 > news >正文

Android SurfaceFlinger layer层级

壁纸作为显示的最底层窗口它是怎么显示的

1. SurfaceFlinger layer层级

 锁屏状态dump SurfaceFlinger ,adb shell dumpsys SurfaceFlinger

Display 0 (active) HWC layers:
---------------------------------------------------------------------------------------------------------------------------------------------------------------Layer nameZ |  Window Type |  Layer Type |  Comp Type |  Transform |   Disp Frame (LTRB) |          Source Crop (LTRB) |     Frame Rate (Explicit) (Seamlessness) [Focused]
---------------------------------------------------------------------------------------------------------------------------------------------------------------Wallpaper BBQ wrapper#58rel      0 |            0 |            0 |     CLIENT |          0 |    0    0 1080 2408 |    0.0    0.0 1080.0 2408.0 |                                              [ ]
---------------------------------------------------------------------------------------------------------------------------------------------------------------StatusBar#105rel      0 |         2000 |           21 |     CLIENT |          0 |    0    0 1080   76 |    0.0    0.0 1080.0   76.0 |                                              [ ]
---------------------------------------------------------------------------------------------------------------------------------------------------------------NotificationShade#656rel      0 |         2040 |           17 |     CLIENT |          0 |    0    0 1080 2408 |    0.0    0.0 1080.0 2408.0 |                                              [*]
---------------------------------------------------------------------------------------------------------------------------------------------------------------NavigationBar0#101rel      0 |         2019 |           21 |     CLIENT |          0 |    0 2364 1080 2408 |    0.0    0.0 1080.0   44.0 |                                              [ ]

 可以看到壁纸layer显示在最底层,其上依次是状态栏layer,锁屏layer,导航栏窗口layer。

void SurfaceFlinger::dumpHwcLayersMinidumpLockedLegacy(std::string& result) const {for (const auto& [token, display] : mDisplays) {const auto displayId = HalDisplayId::tryCast(display->getId());if (!displayId) {continue;}StringAppendF(&result, "Display %s (%s) HWC layers:\n", to_string(*displayId).c_str(),displayId == mActiveDisplayId ? "active" : "inactive");Layer::miniDumpHeader(result);const DisplayDevice& ref = *display;mDrawingState.traverseInZOrder([&](Layer* layer) { layer->miniDumpLegacy(result, ref); });result.append("\n");}
}

mDrawingState是按照Layer.z属性排序的

frameworks/native/services/surfaceflinger/LayerVector.cppint LayerVector::do_compare(const void* lhs, const void* rhs) const
{// sort layers per layer-stack, then by z-order and finally by sequenceconst auto& l = *reinterpret_cast<const sp<Layer>*>(lhs);const auto& r = *reinterpret_cast<const sp<Layer>*>(rhs);const auto& lState = l->getDrawingState();const auto& rState = r->getDrawingState();const auto ls = lState.layerStack;const auto rs = rState.layerStack;if (ls != rs)return (ls > rs) ? 1 : -1;int32_t lz = lState.z;int32_t rz = rState.z;if (lz != rz)return (lz > rz) ? 1 : -1;
}

 2. system_server窗口层级

  通常我们看到的窗口层级如下

frameworks/base/services/core/java/com/android/server/policy/WindowManagerPolicy.java default int getWindowLayerFromTypeLw(int type, boolean canAddInternalSystemWindow,boolean roundedCornerOverlay) {// Always put the rounded corner layer to the top most.if (roundedCornerOverlay && canAddInternalSystemWindow) {return getMaxWindowLayer();}if (type >= FIRST_APPLICATION_WINDOW && type <= LAST_APPLICATION_WINDOW) {return APPLICATION_LAYER;}switch (type) {case TYPE_WALLPAPER:// wallpaper is at the bottom, though the window manager may move it.return  1;
}
/frameworks/base/services/core/java/com/android/server/wm/WindowState.java mBaseLayer = mPolicy.getWindowLayerLw(this)* TYPE_LAYER_MULTIPLIER + TYPE_LAYER_OFFSET;

 大概层级

DisplayArea添加到DisplayContent

frameworks/base/services/core/java/com/android/server/wm/DisplayAreaPolicyBuilder.javavoid instantiateChildren(DisplayArea<DisplayArea> parent, DisplayArea.Tokens[] areaForLayer,int level, Map<Feature, List<DisplayArea<WindowContainer>>> areas) {mChildren.sort(Comparator.comparingInt(pendingArea -> pendingArea.mMinLayer));for (int i = 0; i < mChildren.size(); i++) {final PendingArea child = mChildren.get(i);final DisplayArea area = child.createArea(parent, areaForLayer);if (area == null) {// TaskDisplayArea and ImeContainer can be set at different hierarchy, so it can// be null.continue;}parent.addChild(area, WindowContainer.POSITION_TOP);if (child.mFeature != null) {areas.get(child.mFeature).add(area);}child.instantiateChildren(area, areaForLayer, level + 1, areas);}
}

 创建37个layer并添加进displayContent中

frameworks/base/services/core/java/com/android/server/policy/WindowManagerPolicy.javadefault int getMaxWindowLayer() {return 36;
}frameworks/base/services/core/java/com/android/server/wm/DisplayAreaPolicyBuilder.javaprivate void build(@Nullable List<HierarchyBuilder> displayAreaGroupHierarchyBuilders) {final WindowManagerPolicy policy = mRoot.mWmService.mPolicy;final int maxWindowLayerCount = policy.getMaxWindowLayer() + 1;final DisplayArea.Tokens[] displayAreaForLayer =new DisplayArea.Tokens[maxWindowLayerCount];...root.instantiateChildren(mRoot, displayAreaForLayer, 0, featureAreas);// Notify the root that we have finished attaching all the DisplayAreas. Cache all the// feature related collections there for fast access.mRoot.onHierarchyBuilt(mFeatures, displayAreaForLayer, featureAreas);}

 通过assignLayer来设置surfacecontrol的layer属性及(LayerState的z属性)

frameworks/base/services/core/java/com/android/server/wm/WindowContainer.javavoid assignChildLayers(Transaction t) {int layer = 0;// We use two passes as a way to promote children which// need Z-boosting to the end of the list.for (int j = 0; j < mChildren.size(); ++j) {final WindowContainer wc = mChildren.get(j);wc.assignChildLayers(t);if (!wc.needsZBoost()) {wc.assignLayer(t, layer++);}}for (int j = 0; j < mChildren.size(); ++j) {final WindowContainer wc = mChildren.get(j);if (wc.needsZBoost()) {wc.assignLayer(t, layer++);}}if (mOverlayHost != null) {mOverlayHost.setLayer(t, layer++);}}

 

 3. 通过SurfaceComposerClient 传递到SurfaceFlinger ( sf->setTransactionState)

frameworks/native/libs/gui/SurfaceComposerClient.cppSurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setLayer(const sp<SurfaceControl>& sc, int32_t z) {layer_state_t* s = getLayerState(sc);if (!s) {mStatus = BAD_INDEX;return *this;}s->what |= layer_state_t::eLayerChanged;s->what &= ~layer_state_t::eRelativeLayerChanged;s->z = z;registerSurfaceControlForCallback(sc);return *this;
}

相关文章:

Android SurfaceFlinger layer层级

壁纸作为显示的最底层窗口它是怎么显示的 1. SurfaceFlinger layer层级 锁屏状态dump SurfaceFlinger &#xff0c;adb shell dumpsys SurfaceFlinger Display 0 (active) HWC layers: -----------------------------------------------------------------------------------…...

spark-sql配置教程

1.前期准备 &#xff08;1&#xff09;首先要把hadoop集群&#xff0c;hive和spark等配置好 hadoop集群&#xff0c;hive的配置可以看看这个博主写的博客 大数据_蓝净云的博客-CSDN博客 或者看看黑马程序员的视频 黑马程序员大数据入门到实战教程&#xff0c;大数据开发必…...

生成表格pdf格式

1. 添加依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>kernel</artifactId><version>7.2.5</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>layout…...

C++ 游戏开发的前沿趋势:从光线追踪到人工智能的全新挑战

随着游戏行业的快速发展&#xff0c;技术的不断进步为游戏开发带来了前所未有的机遇和挑战。从逼真的光影效果到复杂的物理模拟&#xff0c;再到智能化的非玩家角色&#xff08;NPC&#xff09;行为和玩家交互&#xff0c;现代游戏的技术需求已经超越了传统的图形渲染与场景搭建…...

微信小程序3-显标记信息和弹框

感谢阅读&#xff0c;初学小白&#xff0c;有错指正。 一、实现功能&#xff1a; 在地图上添加标记点后&#xff0c;标记点是可以携带以下基础信息的&#xff0c;如标题、id、经纬度等。但是对于开发来说&#xff0c;这些信息还不足够&#xff0c;而且还要做到点击标记点时&a…...

EasyNVR中HTTP-FLV协议无法播放怎么解决?

在科技日新月异的今天&#xff0c;摄像头作为公共安全领域的重要一环&#xff0c;其技术的不断提升正显著地改变着社会的安全格局。从最初的简单监控到如今的高清智能分析&#xff0c;我们可以对特定区域进行实时监控和记录&#xff0c;为社会的安全稳定提供了强有力的保障。 问…...

spring cloud之ribbon复习回顾

其实在项目中直接使用ribbon时不多&#xff0c;大多是使用feign的&#xff0c;其实feign底层也是通过ribbon构建的&#xff0c;主要记忆一下计算规则&#xff0c;ribbon的源码还是很不错的&#xff0c;还是值得学习的。 1、添加pom <dependency><groupId>org.spr…...

RFT 强化微调

OpenAI在今天发布的新技术&#xff0c;RFT结合了SFT和RL的优化算法&#xff0c;与传统的监督微调不同&#xff0c;强化微调旨在通过任务训练让模型掌握复杂推理能力&#xff0c;而不仅仅是“记住答案”。 什么是强化微调 强化微调是通过高质量任务数据和参考答案优化大语言模型…...

SpringBoot教程(三十二) SpringBoot集成Skywalking链路跟踪

SpringBoot教程&#xff08;三十二&#xff09; | SpringBoot集成Skywalking链路跟踪 一、Skywalking是什么&#xff1f;二、Skywalking与JDK版本的对应关系三、Skywalking下载四、Skywalking 数据存储五、Skywalking 的启动六、部署探针 前提&#xff1a; Agents 8.9.0 放入 …...

分布式搜索引擎Elasticsearch

Elasticsearch是一个基于Lucene库的开源分布式搜索引擎&#xff0c;它被设计用于云计算中&#xff0c;能够实现快速、near-real-time的搜索&#xff0c;并且可以进行大规模的分布式索引。 以下是一个简单的Python代码示例&#xff0c;展示如何使用Elasticsearch的Python客户端…...

在Vue.js中生成二维码(将指定的url+参数 生成二维码)

在Vue.js中生成二维码&#xff0c;你可以使用JavaScript库如qrcode或qr.js。以下是一个简单的例子&#xff0c;展示如何在Vue组件中使用qrcode库将指定的URL加上参数生成二维码。 首先&#xff0c;你需要安装qrcode库。如果你使用的是npm或yarn&#xff0c;可以通过命令行安装…...

统信桌面专业版部署postgresql-14.2+postgis-3.2方法介绍

文章来源&#xff1a;统信桌面专业版部署postgresql-14.2postgis-3.2方法介绍 | 统信软件-知识分享平台 应用场景 CPU架构&#xff1a;X86&#xff08;海光C86-3G 3350&#xff09; OS版本信息&#xff1a;1070桌面专业版 软件信息&#xff1a;postgresql-14.2postgis-3.2 …...

数字图像处理(16):RGB与HSV互转

&#xff08;1&#xff09;HSV颜色模型&#xff1a;HSV颜色模型&#xff0c;又称为六角锥体模型&#xff0c;以色调&#xff08;H&#xff09;、饱和度&#xff08;S&#xff09;、亮度&#xff08;V&#xff09;为基础&#xff0c;能够更加自然地表现和处理颜色&#xff0c;因…...

web组态可视化编辑器

随着工业智能制造的发展&#xff0c;工业企业对设备可视化、远程运维的需求日趋强烈&#xff0c;传统的单机版组态软件已经不能满足越来越复杂的控制需求&#xff0c;那么实现web组态可视化界面成为了主要的技术路径。 行业痛点 对于软件服务商来说&#xff0c;将单机版软件转…...

数组 - 八皇后 - 困难

************* C topic: 面试题 08.12. 八皇后 - 力扣&#xff08;LeetCode&#xff09; ************* Good morning, gays, Fridary angin and try the hard to celebrate. Inspect the topic: This topic I can understand it in a second. And I do rethink a movie, …...

【分布式】Redis分布式缓存

一、什么是Redis分布式缓存 Redis分布式缓存是指使用Redis作为缓存系统来存储和管理数据的分布式方案。在分布式系统中&#xff0c;多台服务器共同对外提供服务&#xff0c;为了提高系统的性能和可扩展性&#xff0c;通常会引入缓存来减轻数据库的压力。Redis作为一种高性能的…...

Ubuntu——extrepo添加部分外部软件源

extrepo 是一个用于 Ubuntu 和其他基于 Debian 的系统的工具&#xff0c;它的主要作用是简化和管理外部软件源&#xff08;repositories&#xff09;的添加和更新。通过使用 extrepo&#xff0c;用户可以方便地添加、删除和管理第三方软件源&#xff0c;而不需要手动编辑源列表…...

评估大语言模型(LLM)在分子预测任务能够理解分子几何形状性能

摘要 论文地址&#xff1a;https://arxiv.org/pdf/2403.05075 近年来&#xff0c;机器学习模型在各个领域越来越受欢迎。学术界和工业界都投入了大量精力来提高机器学习的效率&#xff0c;以期实现人工通用智能&#xff08;AGI&#xff09;。其中&#xff0c;大规模语言模型&a…...

如何查看电脑刷新率

Windows 系统 通过显示设置查看&#xff1a; 右键点击桌面空白处&#xff0c;选择 “显示设置”。在打开的窗口中&#xff0c;找到 “高级显示设置”。点击 “显示适配器属性”。在弹出的窗口中&#xff0c;选择 “监视器” 选项卡&#xff0c;即可看到当前的屏幕刷新率。使用 …...

mysql集群MHA方式部署

1. 基本信息 部署机器角色部署路径192.168.242.71MySQL-Mater MHA-NodeMySQL: /alidata1/mysql-8.0.28192.168.242.72MySQL-Slave MHA-NodeMHA-Node: /alidata1/admin/tools/mha4mysql-node-0.58192.168.242.73MySQL-Slave MHA-Node192.168.242.74MHA-ManagerMHA-Manager: …...

第十七章 使用 MariaDB 数据库管理系统

1. 数据库管理系统 数据库是指按照某些特定结构来存储数据资料的数据仓库。在当今这个大数据技术迅速崛起的年代&#xff0c;互联网上每天都会生成海量的数据信息&#xff0c;数据库技术也从最初只能存储简单的表格数据的单一集中存储模式&#xff0c;发展到了现如今存储海量…...

rabbitmq 安装延时队列插件rabbitmq_delayer_message_exchange(linux centOS 7)

1.插件版本 插件地址&#xff1a;Community Plugins | RabbitMQ rabbitmq插件需要对应的版本&#xff0c;根据插件地址找到插件 rabbitmq_delayer_message_exchange 点击Releases 因为我rabbitmq客户端显示的版本是&#xff1a; 所以我选择插件版本是&#xff1a; 下载 .ez文…...

Unity性能优化---动态网格组合(一)

网格组合是将 Unity 中的多个对象组合为一个对象的技术。因此&#xff0c;在多物体的场景中&#xff0c;使用网格组合&#xff0c;会有效的减少小网格的数量&#xff0c;最终将得到一个包含许多小网格的大网格游戏对象&#xff0c;这将提高游戏或模拟器的性能。在Unity 的 “St…...

Appium:安装uiautomator2失败

目录 1、通过nmp安装uiautomator2&#xff1a;失败 2、通过 Appium 的平台直接安装驱动程序 3、通过pip 来安装 uiautomator2 1、通过nmp安装uiautomator2&#xff1a;失败 我先是通过npm安装的uiautomator2&#xff0c;也显示已经安装成功了&#xff1a; npm install -g …...

电子信息工程自动化 单片机彩灯控制

摘要 随着社会经济和科学技术的不断进步&#xff0c;人们在保持发展的同时&#xff0c;环境带给人类的影响已经不足以让我们忽视&#xff0c;所以城市的美化问题慢慢的进入了人们的眼帘&#xff0c;PLC的产生给带电子产品带来了巨大变革&#xff0c;彩灯的使用在城市的美化中变…...

word poi-tl 表格功能增强,实现表格功能垂直合并

目录 问题解决问题poi-tl介绍 功能实现引入依赖模版代码效果图 附加&#xff08;插件实现&#xff09;MergeColumnData 对象MergeGroupData 类ServerMergeTableData 数据信息ServerMergeTablePolicy 合并插件 问题 由于在开发功能需求中&#xff0c;word文档需要垂直合并表格&…...

LSTM-CNN-BP-RF-SVM五模型咖喱融合策略混合预测模型

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 LSTM-CNN-BP-RF-SVM五模型咖喱融合策略混合预测模型 Matlab代码注释清晰。 程序设计 完整程序和数据获取方式&#xff1a;私信博主回复LSTM-CNN-BP-RF-SVM五模型咖喱融合策略混合预测模型&#xff08;Matlab&#…...

《鸿蒙开发-答案之书》 怎么设置Json字段的别名

《鸿蒙开发-答案之书》 怎么设置Json字段的别名 Android设置别名用的是SerializedName(“msg”)&#xff0c;那鸿蒙用的是啥&#xff0c;有点懵不知道。 鸿蒙得引入第三方库&#xff1a;ohpm install class-transformer 然后用Expose({ name: ‘first-name’ }) 示例代码&…...

ftp服务器搭建-安装、配置及验证

ftp服务器搭建-安装、配置及验证 #安装 sudo apt-get install vsftpd #配置文件 cat > /etc/vsftpd.conf << "EOF" listenNO listen_ipv6YES anonymous_enableNO local_enableYES write_enableYES dirmessage_enableYES use_localtimeYES xferlog_enable…...

鸿蒙应用获取wifi连接的ip地址(官方文档获取的格式转换成192.168.1.xxx格式)

目录 一.背景 二.官网流程 wifiManager.getLinkedInfo9+ 三.转换成192.168.xxx.xxx格式 一.背景 本次来学习如何获取到鸿蒙设备连接wifi后的ip地址,由于官网文档中获取的ip地址和我们平时看到的192:168:xxx:xxx有所不同,需要进行下转换,所以记录下,如下的流程是在OpenH…...