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

修复OpenFDE14缩放窗口时标题栏与应用窗口的宽度不同步的问题

1.问题描述在OpenFDE 14上缩放应用窗口大小时会出现标题栏宽度与应用窗口宽度无法保持同步变化的问题在一些简单布局的应用缩放场景下同步效果比较好但对于较复杂布局的应用场景下不同步的现象就比较明显如下图所示。2.原因分析从Android 14开始自由窗口模式下缩放窗口CaptionWindow被放到SystemUI进程中刷新应用窗口还是在应用进程中刷新由于CaptionWindow的布局非常简单只有几个Button控件所以layout速度非常快而对于Actvitity来说会选择合适的时机进行刷新图层信息因此Activity窗口的刷新频率远远跟不上CaptionWindow的刷新频率且两者之间没有任何同步机制所以在拖动时标题栏与Acitivity窗口的宽度就无法保持一致。既然是由于Activity窗口刷新太慢导致那么只能让标题栏窗口去同步Activity窗口大小这样改动带来的副作用是最小的这里我们从SurfaceFlinger的角度进行分析因为所有图层都会由SurfaceFlinger提交给hwc显示那么我们可以在SurfaceFlinger中对标题栏窗口和应用窗口进行一次宽度同步防止标题栏宽度显示超出应用窗口。根据dumpsys SurfaceFlinger信息可以看到应用窗口和标题栏窗口的layer的关系如下所示。ROOT ├─ Display 0 name内置屏幕#1 │ ├─ WindowedMagnification:0:31#2 │ │ ├─ HideDisplayCutout:0:14#3 │ │ │ └─ OneHanded:0:14#4 │ │ │ ├─ FullscreenMagnification:0:12#5 │ │ │ │ ├─ DefaultTaskDisplayArea#7 │ │ │ │ │ └─ Task224#326 │ │ │ │ │ ├─ ActivityRecord{bdc594a u0 com.tencen[...]ntv2.activity.MainActivity t224}#339 │ │ │ │ │ │ ├─ 942c0bb ActivityRecordInputSink com.[...]ssistantv2.activity.MainActivity#342 │ │ │ │ │ │ └─ d666f1 com.tencent.android.qqdownloa[...]ssistantv2.activity.MainActivity#343 │ │ │ │ │ │ └─ com.tencent.android.qqdownloader/com[...]ssistantv2.activity.MainActivity#344 │ │ │ │ │ └─ Decor container of Task224#334 │ │ │ │ │ ├─ TaskInputSink of Surface(nameDecor container of Task224)/0x54597fa#338 │ │ │ │ │ └─ Caption container of Task224#335 │ │ │ │ │ └─ Caption of Task224Leash#336 │ │ │ │ │ └─ Caption of Task224#337其中com.tencent.android.qqdownloader/com[...]ssistantv2.activity.MainActivity#344就是应用窗口的layerCaption of Task224#337则是标题栏的layer他们存在一个相同的父layer即Task224#326那么每一次更新LayerSnapshot时会从上至下遍历更新所有需要更新的layer即会先更新应用窗口的layerBounds然后再更新标题栏的layerBounds所以我们可以根据顶层Activity的包名先计算出应用窗口的宽度最后在更新标题栏时重设其geomLayerBounds的值这样就可以保证每一次提交给hwc的图层中CaptionWindow和Activity窗口宽度一致。3.解决方案3.1.确定需要更新的Activity窗口和标题栏窗口在WindowDecoration中当CaptionWindow触发relayout时记录下当前的标题栏名称顶层应用包名父layer的名称这3个属性将提供给SurfaceFlinger来查找对应layer的关键字。同时可以同步SurfaceFlinger计算出来的真实的标题栏宽度。参考修改如下fix caption and window are not synchronized when window is scaling by pngcui · Pull Request #82 · openfde/lineageos_android_frameworks_base3.2.SurfaceFlinger同步窗口宽度在LayerSnapshotBuilder中当调用updateLayerBounds时根据顶层应用名包的geomLayerBounds来计算出最终窗口总宽度这里需要考虑多窗口并排显示的场景所以需要对窗口宽度进行累加多窗口场景的SurfaceFlinger信息如下所示ROOT ├─ Display 0 name内置屏幕#1 │ ├─ WindowedMagnification:0:31#2 │ │ ├─ HideDisplayCutout:0:14#3 │ │ │ └─ OneHanded:0:14#4 │ │ │ ├─ FullscreenMagnification:0:12#5 │ │ │ │ │ └─ Task226#108 │ │ │ │ │ ├─ TaskFragment{6bfc908 modefreeform}#124 │ │ │ │ │ │ └─ ActivityRecord{a55c0bb u0 com.android.settings/.Settings t226}#121 │ │ │ │ │ │ ├─ 2de39d8 ActivityRecordInputSink com.[...]omepage.SettingsHomepageActivity#123 │ │ │ │ │ │ └─ 351bf02 com.android.settings/com.android.settings.Settings#127 │ │ │ │ │ │ └─ com.android.settings/com.android.settings.Settings#131 │ │ │ │ │ ├─ TaskFragment{31938a1 modefreeform}#125 │ │ │ │ │ │ └─ ActivityRecord{e845ac6 u0 com.androi[...]s$NetworkDashboardActivity t226}#126 │ │ │ │ │ │ ├─ d272a87 ActivityRecordInputSink com.[...]ettings$NetworkDashboardActivity#130 │ │ │ │ │ │ └─ abbecb2 com.android.settings/com.and[...]ettings$NetworkDashboardActivity#128 │ │ │ │ │ │ └─ com.android.settings/com.android.set[...]ettings$NetworkDashboardActivity#132 │ │ │ │ │ └─ Decor container of Task226#113 │ │ │ │ │ ├─ TaskInputSink of Surface(nameDecor container of Task226)/0xf9bc044#120 │ │ │ │ │ └─ Caption container of Task226#114 │ │ │ │ │ └─ Caption of Task226Leash#116 │ │ │ │ │ └─ Caption of Task226#117当被查找的layer图层的父layer名称与WindowDecoration标记的父layer名称一致时表示此layer是当前Activity的有效图层需要记录下他的宽度直到所有图层都遍历完当更新的layer是标题栏时则把记录下来的最终宽度值设置到标题栏的geomLayerBounds数据结构中并把该值同步给WindowDecoration模块参考修改如下fix caption and window are not synchronized when window is scaling by pngcui · Pull Request #4 · openfde/lineageos_android_frameworks_nativefix x11-windows and captionbar are not synchronized during window scaling by pngcui · Pull Request #5 · openfde/lineageos_android_frameworks_nativefix captionbar appears too short by pngcui · Pull Request #17 · openfde/lineageos_android_frameworks_native4.方案不足之处4.1.多应用并排显示场景对于双Activity类的应用当2个Activity分别属于不同的包名时此方案无法精准识别完整的标题栏宽度此时会丢弃本次优化此场景的SurfaceFlinger信息如下所示ROOT ├─ Display 0 name内置屏幕#1 │ ├─ WindowedMagnification:0:31#2 │ │ ├─ HideDisplayCutout:0:14#3 │ │ │ └─ OneHanded:0:14#4 │ │ │ ├─ FullscreenMagnification:0:12#5 │ │ │ │ │ └─ Task243#117 │ │ │ │ │ ├─ TaskFragment{fafa2f1 modefreeform}#133 │ │ │ │ │ │ └─ ActivityRecord{c208d76 u0 com.android.settings/.Settings t243}#122 │ │ │ │ │ │ ├─ 43a5f77 ActivityRecordInputSink com.[...]omepage.SettingsHomepageActivity#132 │ │ │ │ │ │ └─ d47c986 com.android.settings/com.android.settings.Settings#136 │ │ │ │ │ │ └─ com.android.settings/com.android.settings.Settings#140 │ │ │ │ │ ├─ TaskFragment{e6f7587 modefreeform}#144 │ │ │ │ │ │ └─ ActivityRecord{9f85b75 u0 com.androi[...]ustomizationPickerActivity t243}#150 │ │ │ │ │ │ ├─ c1ac70a ActivityRecordInputSink com.[...]cker.CustomizationPickerActivity#152 │ │ │ │ │ │ └─ 5249d0d com.android.wallpaper/com.an[...]cker.CustomizationPickerActivity#153 │ │ │ │ │ │ └─ com.android.wallpaper/com.android.wa[...]cker.CustomizationPickerActivity#154 │ │ │ │ │ └─ Decor container of Task243#126 │ │ │ │ │ ├─ TaskInputSink of Surface(nameDecor container of Task243)/0xa589666#130 │ │ │ │ │ └─ Caption container of Task243#127 │ │ │ │ │ └─ Caption of Task243Leash#128 │ │ │ │ │ └─ Caption of Task243#1294.2.录屏场景由于Android14上录屏是录制的虚拟屏会把录制的窗口映射到虚拟屏上导致在虚拟屏上存在同样的一份Layer信息所以SurfaceFlinger在计算窗口宽度时会重复计算2次导致异常针对这种情况也只能丢弃本次优化相关修改如下fix captionbar appears too long when srceenrecording by pngcui · Pull Request #14 · openfde/lineageos_android_frameworks_native

相关文章:

修复OpenFDE14缩放窗口时标题栏与应用窗口的宽度不同步的问题

1.问题描述 在OpenFDE 14上缩放应用窗口大小时,会出现标题栏宽度与应用窗口宽度无法保持同步变化的问题,在一些简单布局的应用缩放场景下,同步效果比较好,但对于较复杂布局的应用场景下,不同步的现象就比较明显&#…...

控制面容灾实战:别让“不处理业务请求“的系统拖死全站

控制面容灾实战:别让"不处理业务请求"的系统拖死全站 前言 控制面是分布式系统里最隐蔽也最致命的单点故障源。 注册中心、配置中心、证书系统、观测后端,这些系统看似"不处理任何业务请求",但一旦不可用,…...

AI研究代理基准测试工具autoresearch-adal:自动化对比AdaL与Claude Code

1. 项目概述与核心价值如果你和我一样,经常在多个AI研究工具之间切换,试图找出哪个模型在解决复杂的、需要多步推理的研究任务上更胜一筹,那么你肯定体会过那种繁琐和低效。手动设置不同的API环境、编写重复的测试脚本、整理散落在各处的输出…...

Flag MCP:终结AI编程猜测循环,实现人类在环的精准控制

1. 项目概述:当AI助手遇到“选择困难症”在AI辅助编程的日常里,我猜你和我一样,都经历过类似的场景:你让AI助手去实现一个功能,比如“给这个用户列表加个搜索框”,然后满怀期待地等着。结果它吭哧吭哧写了一…...

Deep Multiview Clustering by Contrasting Cluster Assignments

通过对比不同的聚类分配实现深度多视图聚类摘要深度学习在大规模多视图聚类上表现好,但是该领域如何学习不同视图的潜在表示仍是一个问题。作者认为不同视图之间应该对齐的不是中间层特征,而是最后的聚类分配结果。因此提出 CVCL,通过对比不同…...

从AceForge看一体化AI平台:如何实现模型部署与运维的平民化

1. 项目概述:从“AceForge”看开源AI工具链的平民化革命最近在GitHub上闲逛,发现一个叫“AceForge”的项目,作者是sudokrang。点进去一看,简介写得挺有意思,大意是说这是一个“一站式、开箱即用的AI应用开发与部署平台…...

Taotoken控制台的用量看板如何帮助团队管理API成本

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken控制台的用量看板如何帮助团队管理API成本 对于项目负责人或技术管理者而言,透明可控的支出至关重要。在集成多…...

系统化交易资源宝库:从入门到实战的量化学习路径

1. 项目概述与核心价值如果你对量化交易、系统化投资感兴趣,并且正在寻找一个能帮你快速入门、避免重复造轮子的资源宝库,那么paperswithbacktest/awesome-systematic-trading这个项目绝对值得你花上几个小时好好研究。这个项目本质上是一个由社区驱动的…...

基于MCP协议与AI的智能收据处理服务器:从OCR到结构化提取实战

1. 项目概述:一个专为收据处理而生的MCP服务器如果你经常需要处理各种格式的收据、发票或账单,无论是个人记账、公司报销,还是财务审计,那么你肯定对“数据录入”这个繁琐环节深恶痛绝。一张张纸质或电子收据,上面的关…...

避坑指南:Vivado FIR Compiler IP核配置的那些‘坑’(从MATLAB系数到FPGA实现)

Vivado FIR滤波器IP核实战避坑手册:从MATLAB系数到FPGA部署的12个关键检查点 当MATLAB的完美频响曲线遇上Vivado的硬件实现,FIR滤波器设计往往会遭遇理想与现实的落差。本文不重复基础操作流程,而是聚焦于那些让工程师深夜加班的典型问题场景…...

JESD204B协议在5G MIMO基站中的关键应用与优化

1. JESD204B协议在MIMO基站中的核心价值 现代无线通信系统正经历着从传统单天线向大规模MIMO(多输入多输出)架构的转型。作为5G基站的核心技术,Massive MIMO系统通常需要处理64T64R甚至更大规模的天线阵列,这对数据转换器&#xf…...

Meta与斯坦福:字节级AI实现逐字节生成瓶颈突破与速度提升能力

这项由Meta人工智能基础研究团队(FAIR at Meta)与斯坦福大学、华盛顿大学联合开展的研究,于2026年5月发表,论文预印本编号为arXiv:2605.08044v1。感兴趣的读者可以通过该编号在arXiv平台上查阅完整论文。现代语言模型的工作方式&a…...

开发者知识管理工具CodingIT:架构设计与应用实践

1. 项目概述:一个面向开发者的“一站式”知识管理工具最近在整理个人技术笔记和项目文档时,我发现自己陷入了典型的“信息碎片化”困境:代码片段散落在Gist、笔记软件、本地文件甚至聊天记录里;项目文档要么是简陋的README&#x…...

德克萨斯大学奥斯汀分校研究出新型“轻量级“数据压缩神经网络

这项由德克萨斯大学奥斯汀分校系统机器学习实验室完成的研究,以预印本形式于2026年5月7日发布在arXiv平台,论文编号为arXiv:2605.06628,研究方向属于信号处理与深度学习的交叉领域。有兴趣深入了解的读者可以通过上述编号在arXiv上检索完整论…...

Next.js全栈开发模板:PostgreSQL+NextAuth+Tailwind一站式解决方案

1. 项目概述:一个现代化的全栈开发起点如果你最近在寻找一个能快速启动全栈Web应用开发的模板,那么由Vercel官方维护的这个“Next.js Postgres NextAuth Tailwind CSS”模板,很可能就是你一直在找的那个“瑞士军刀”。这不仅仅是一个简单的…...

为什么“忘记密码“只能重置不能找回?背后藏着一个精妙的数学秘密

99%的人每天都在用它,却从来不知道它的存在你一定遇到过这种事:忘了某个网站的密码,点击"找回密码",结果网站只让你"重置密码"——它为什么不能直接告诉你原来的密码是什么?答案可能出乎你的意料&…...

AI智能体开发实战:从AwesomeClaw看开源框架与工具集成

1. 项目概述:从“AwesomeClaw”看开源AI智能体的进化最近在GitHub上看到一个挺有意思的项目,叫“AwesomeClaw”。初看这个名字,你可能会联想到“Awesome”系列——那些汇集了某个领域优质资源的清单。但“Claw”(爪子)…...

本地视频怎么去水印?2026实测去水印方法汇总,本地视频去水印软件推荐

本地视频怎么去水印?2026实测去水印方法汇总,本地视频去水印软件推荐 视频里的水印是很多人在整理或剪辑素材时遇到的高频问题。有时是平台在视频上自动打上的 Logo,有时是录屏工具留下的品牌标识,还有时是拍摄 App 在画面角落打的…...

OpenClaw数据备份实战:基于Synology NAS的增量备份与安全恢复方案

1. 项目概述与核心价值如果你和我一样,把OpenClaw当作一个重要的生产力工具,用它来管理项目、运行自动化任务,甚至托管一些关键的业务逻辑,那么数据安全就成了一个绕不开的话题。我见过太多因为硬盘突然挂掉、云服务商出问题&…...

基于RAG架构的企业级AI知识库:从原理到部署实战

1. 项目概述:一个AI驱动的企业级知识管理新范式最近在探索企业知识库与AI结合的实际落地方案时,我注意到了GitHub上一个名为akshata29/entaoai的项目。这个项目名称本身就是一个很好的线索:“entao” 很容易让人联想到 “Enterprise AI”&…...

抖音去水印免费版哪个好用?2026实测推荐与软件对比

抖音去水印免费版哪个好用?2026实测推荐与软件对比 刷到一条有意思的视频想保存下来发给朋友,下载后却发现左上角顶着一串"用户名"水印;好不容易找到一段适合做素材的内容,画面边缘那行字怎么裁都裁不干净。这几乎是每个…...

2026 年 5 月 CERT 发布 dnsmasq 六个严重安全漏洞,2.93 版本或一周左右发布

消息基本信息西蒙凯利在 2026 年 5 月 11 日,周一,协调世界时 17:18:25 发布消息,上一条消息(按线程)是[[Dnsmasq 讨论组] DHCP 请求中电路 ID 匹配问题],下一条消息(按线程)是[[Dns…...

Verse MCP:基于MCP协议为AI智能体构建安全工具箱的实践指南

1. 项目概述:Verse MCP,一个为AI智能体赋能的“工具箱”连接器最近在折腾AI智能体开发的朋友,估计都绕不开一个词:MCP。全称是Model Context Protocol,你可以把它理解为一套标准化的“插座”和“插头”规范。它要解决的…...

量子退火在锂离子电池材料优化中的应用与原理

1. 量子退火技术原理与材料优化应用概述量子退火(Quantum Annealing)是一种基于量子力学原理的优化算法,它通过模拟量子系统的绝热演化过程来寻找复杂问题的全局最优解。与传统模拟退火算法相比,量子退火利用量子隧穿效应而非热涨…...

Rust GraphQL实战:async-graphql深度解析

Rust GraphQL实战:async-graphql深度解析 引言 在Rust开发中,GraphQL是构建灵活API的重要技术。作为一名从Python转向Rust的后端开发者,我深刻体会到async-graphql在构建GraphQL服务方面的优势。async-graphql提供了类型安全的Schema定义和异…...

3分钟掌握缠论可视化:通达信智能技术分析插件终极指南

3分钟掌握缠论可视化:通达信智能技术分析插件终极指南 【免费下载链接】Indicator 通达信缠论可视化分析插件 项目地址: https://gitcode.com/gh_mirrors/ind/Indicator 还在为复杂的缠论理论头疼吗?还在手工画线分析K线图吗?CZSC缠论…...

基于大语言模型的信息抽取实战:从提示工程到生产部署

1. 项目概述:当信息抽取遇上大语言模型最近在信息抽取这个老行当里,很多同行都在讨论一个开源项目:pkuserc/ChatGPT_for_IE。乍一看标题,你可能觉得这又是一个“用ChatGPT API做点事”的玩具项目,但如果你像我一样&…...

Seelen UI定制化桌面

链接:https://pan.quark.cn/s/0d0312d1a6d1Seelen UI是适用于 Windows 10/11的第一个基于 Web 的完全可定制的桌面环境,提供了一种直观而强大的方式来管理和自定义您的工作区。提升工作效率与体验,满足不同用户的需求。...

强力解密RPG Maker加密文件:新手快速上手指南

强力解密RPG Maker加密文件:新手快速上手指南 【免费下载链接】RPGMakerDecrypter Tool for decrypting and extracting RPG Maker XP, VX and VX Ace encrypted archives and MV and MZ encrypted files. 项目地址: https://gitcode.com/gh_mirrors/rp/RPGMakerD…...

LeAgent多智能体协作框架:从任务规划到实战部署的完整指南

1. 项目概述:当AI学会“派活”,一个智能体协作框架的诞生最近在折腾AI智能体(Agent)开发的朋友,估计都绕不开一个核心痛点:单个智能体能力再强,面对复杂任务也常常力不从心。比如,你…...