安卓WMS层面分析窗口的位置变化-安卓framework实战开发

Android Framework转型指南:从应用开发到系统服务理解 Android Framework是应用运行的底层契约,涵盖Activity管理、权限校验与窗口合成等核心机制。其原理基于服务协同(如AMS/PMS/WMS)与跨进程通信(Binder),技术价值在于保障稳定性、安全性和性能一致性。典型应用场景包括ANR分析、权限适配、窗口异常调试及后台保活优化。对应用开发者而言,掌握dumpsys命令、systrace追踪和系统日志解读,比通读AOSP源码更高效实用;通过adb shell工具链定位问题现象,再反向理解Framework服务交互逻辑,是实现从API调用者到 阅读详情

背景:

在悬浮窗口开发过程中,窗口往往都不是铺满整个屏幕,一般都是一个小窗口,这个时候往往会加上一个自由拖动的功能,例如如下图所示:
在这里插入图片描述
毫秒表就可以上下自由移动,那么大家有没有想过这个自由移动功能是如何实现的呢?原理到底是啥呢?

窗口位置变化dumpsys分析:

首先针窗口想过位置移动,最先想到应该是通过dumpsys window windows和dumps SurfaceFlinger来查看
dumpsys window windows
在这里插入图片描述在这里插入图片描述可以看到这里的mAttrs的Y值都变大的。

dumpsys SurfaceFlinger来看看情况
在这里插入图片描述
在这里插入图片描述可以看到sf的layer中也是可以看出图层是有y方向的位移

上面就得出了window移动实际就是sf的layer中matrix有位移的变化,从而可以移动窗口,本质就是对surfacecontrol进行了位移设置。

应用修改窗口位置代码:

在这里插入图片描述
可以看到主要是通过mWindowManager.updateViewLayout改变WindowManager.LayoutParams 的x,y的值

那么这个updateViewLayout又是如何体现到上面的SurfaceFlinger的Layer中呢?

追踪如何影响到SurfaceControl

首先可以从SurfaceControl开始打堆栈:
在这里插入图片描述打印如下

在这里插入图片描述

可以看出是windowstate的updateSurfacePosition触发的SurfaceControl位置变化
frameworks/base/services/core/java/com/android/server/wm/WindowState.java
在这里插入图片描述
在这里插入图片描述
可以看到这里实际上是mSurfacePosition的值作为最后影响,接下来看看mSurfacePosition谁影响的。

在这里插入图片描述
可以看到主要是这里transformFrameToSurfacePosition会对它进行设置

在这里插入图片描述
主要靠mWindowFrames.mFrame这个参数影响,那么这个mWindowFrames.mFrame又是哪里来的?
这里就是setFrames方法
在这里插入图片描述
那么setFrames又是谁调用的呢?
看看如下堆栈
在这里插入图片描述
上面堆栈就展示的非常清楚,主要核心流程就是如下:
在这里插入图片描述
这里核心就是layoutWindowLw方法来计算的
在这里插入图片描述
layoutWindowLw核心就是如下这个计算方法

 mWindowLayout.computeFrames(attrs, win.getInsetsState(), displayFrames.mDisplayCutoutSafe,
                win.getBounds(), win.getWindowingMode(), requestedWidth, requestedHeight,
                win.getRequestedVisibleTypes(), win.mGlobalScale, sTmpClientFrames);

这里有attrs里面带了relayout传递来的值,在computeFrames会使用它进行计算最后影响mWindowFrames.mFrame值,computeFrames方法就不展开了,可以去frameworks/base/core/java/android/view/WindowLayout.java查看。

更多framework技术干货,请关注下面“千里马学框架”

2022 | Android大厂面试必问之FrameWork——Binder、Handler、WMS、AMS核心原理解析 通常作为一个Android APP开发者,我们并不关心Android的源代码实现,不过随着Android开发者越来越多,企业在筛选Android程序员时越来越看中一个程序员对于Android底层的理解和思考,这里的底层主要就是Android Framewok中各个组件的运行原理。 这里分享一份**《Android Framework 开发揭秘》**,深入Android底层原理的探索。内容包括:系统启动流程分析、Binder 解析、Handler解析、AMS 解析、WMS解析、PKMS Android10.. 阅读详情

相关推荐

Android Framework学习二:Activity创建及View绘制流程

当一个应用程序创建一个窗口(例如 Activity 的界面)时,它会向 WMS 发送请求。根据窗口的属性(如大小、位置、层级等)将其添加到窗口管理列表中。每个窗口都有一个或多个 Surface 与之关联。当应用程序需要绘制窗口的内容时,它会通过 Surface 来获取绘图的上下文,然后使用图形库(如 OpenGL)在 Surface 上进行绘制。 Activity包含PhoneWindow、DecorView、ViewRootImpl等 其创建流程如下

zmlovelx(帅得不敢出门 程序员群31843264) 1903

安卓窗口window无法移除屏幕外超过屏幕边界?-wms源码层面深入剖析

这里看看是不是应用层面还是哪里限制了,可以通过wms的Relayout的Attribute属性看看,明显看到有负数坐标,即app层面已经把移除屏幕的x坐标传递到了wms,但是最后wms并没有让这个传递来的坐标生效。已经尽力把窗口想要拖到屏幕外面,但是一直拖到不生效,只能在屏幕内部进行移动,这个到其实很奇怪,因为对于LayoutParam的x,y坐标是有进行设置的,为啥设置了就不生效呢?这里再查阅代码发现有个二fitToDisplay,即这里看着有个适配屏幕操作,也会改变这个坐标,这里也加入一下打印。

learnframework的博客 1189

Android Framework 核心解密:深入探索 ViewRootImpl 与 WMS 的通信桥梁

本文深入解析了Android系统中ViewRootImpl与WindowManagerService(WMS)之间的通信机制。ViewRootImpl作为应用进程内窗口管理的核心,通过WindowManagerGlobal建立的IWindowSession会话与WMS进行跨进程通信,完成窗口添加(relayoutWindow)、布局更新(addToDisplay)、绘制完成通知(finishDrawing)等关键操作。WMS则通过IWindow回调通知窗口状态变化(resized)、分发输入事件等。

郑伟强dev的专栏 69

异形屏手机开启挖空刘海配置

异形屏,挖空刘海

amecb897421536的博客 898

雷赛控制卡全方位使用指南:从硬件连接到高级应用

雷赛控制卡以其接口简单、编程便捷、性价比高的特点,成为中小自动化设备的理想选择。使用时需注意:硬件连接需注重抗干扰设计(屏蔽线、接地);软件开发需合理配置运动参数(脉冲当量、加减速);调试阶段需充分利用 DMCStudio 工具验证性能。通过本文介绍的方法,可快速实现从硬件搭建到复杂运动控制的全流程开发,满足雕刻、切割、装配等多场景的自动化需求。

品质生活,极致编程。 3779

手把手教你解决uniapp中esbuild版本冲突问题(Mac版专属指南)

本文是针对Mac平台uniapp开发者的专属指南,详细解析了运行项目时常见的`Cannot start service`错误,即esbuild的Host版本与binary版本不匹配问题。文章从错误根源入手,提供了从快速应急处理到彻底根治的完整解决方案,包括手动替换二进制文件、锁定依赖版本、清理缓存及优化工具链配置,旨在帮助开发者高效解决版本冲突,恢复并稳定开发环境。

i0j1k2l3m的博客 460

android自定义窗口层级(自定义车载系统中倒车影像显示层级)

并且,Overscan的具体值也没有一个明确的标准,不同的电视机厂家的Overscan的值也各不相同。在车载系统或者TV系统中,通过WindowManager添加一个窗口时,又由于存在多个应用添加窗口,且用的同一窗口层级,会出现相互覆盖的情况。display---->mDisplayFrame,默认情况下是指整个显示屏幕,也就是屏幕的大小。注解注解后可以在android提供的工具Monitor(或已经废弃的DDMS)中的HierarchyViewer中调试View的属性。定义WindowType,在。...

分享技术与经验的博客 3719

【清华大学软院】15-19年推免试题历年整理

整理的题目为清软预推免机试(外校)硕士机考题目。 年代 题目1 题目2 题目3 2019 质因数分解 二叉搜索树 区间DP(折叠字符串) 2018 日期转换 高精度模拟 区间DP(戳气球) 2017 进制素数 被遗漏的数字 DP(收集苹果) 2016 大数运算 DP DFS 2015 进制素数: http://acm.hdu.edu.cn/showproblem.php?pid=1230 2017年题目(这个是找的最准确的题目): 1题见【链接】 2题见【链接】

云端筑梦师 2256

Android车载双屏移动的实现(源码)

Android车载多屏互动交互解决方案

ocreativityo的博客 1804

多GPU时代的虚拟内存革命:CUDA VMM API的跨设备协同设计哲学

本文深入探讨了NVIDIA CUDA VMM API在多GPU系统中的虚拟内存管理革命,解决了传统Peer Access的显存碎片化和同步开销问题。通过地址-内存解耦、按需映射和精细权限控制,VMM API为分布式训练提供了高效的内存协同方案,显著提升大模型训练性能。

weixin_29251337的博客 538

【通信协议】I2C总线(一主多从)

I2C总线(一主多从)之软件模拟代码详解

m0_75090944的博客 9847

Android Surface创建

转载请标注来处: http://www.jianshu.com/p/64e5c866b4ae 一、 OverView Android Surface的创建涉及三个进程 App 进程 Surface本质上是一个Native Window, 并且保存着需要在屏幕上显示的数据(buffer), 它通常包含 triple-buffers 以防止Jank。 那么谁要创建Surface呢? 当然...

JIH488的专栏 923

Python+Tableau 全流程数据分析实战:从数据清洗到商业洞察可视化

本文通过Python+Tableau完整演示电商销售数据分析流程。首先使用Python进行数据清洗(缺失值处理、异常值过滤等)和探索性分析(商品类别、时间趋势等),然后导入Tableau创建交互式可视化仪表盘。分析发现电子产品销售额最高但利润率低,美妆类利润率最优,东部地区销售表现最好。最终提出优化供应链、加强美妆推广等商业建议,展示了Python数据处理与Tableau可视化的高效配合。所有代码可直接运行,适合数据分析初学者和从业者实战参考。

weixin_44520581的博客 338

android wms对壁纸的处理,Android Framework 窗口子系统 (05)窗口布局说...

系列文章解读&说明:Android Framework 窗口子系统 的 分析主要分为以下部分:(01)WindowMangerService基础知识(02)应用进程和WindowManagerService之间的关系(03)窗口显示次序(04)确定窗口尺寸(05)窗口布局说明(06)窗口动画之Choreographer机制(07)窗口动画之Animation & Animator(...

weixin_39722563的博客 542

macOS安装Cplex+yalmip

macOS安装Cplex+yalmip

DS 4250

家庭路由器从入门到精通:连接设置、优化排障全指南

路由器作为家庭网络的核心枢纽,其工作原理基于NAT(网络地址转换)和DHCP(动态主机配置协议)两大关键技术。NAT负责将公网IP转换为多个内网IP,实现多设备共享上网;DHCP则自动为接入设备分配IP地址,简化网络配置。这些技术共同构建了稳定、安全的局域网环境,其价值在于为智能家居、在线办公、高清影音和游戏娱乐等场景提供可靠的网络基础。理解路由器的物理连接、后台设置与故障排查逻辑,是优化Wi-Fi信号覆盖、提升网络性能、保障家庭网络安全的关键。本文以路由器配置与排障为核心,详细解析从WAN/LAN口区分、

weixin_33393017的博客 406

Android窗口焦点机制:从WMS到InputDispatcher的完整链路

窗口焦点是Android窗口管理中的核心概念,决定了系统按键事件、物理按键和软键盘输入的分发归属。在Android体系中,WindowManagerService负责计算焦点窗口,InputDispatcher根据焦点信息将输入事件派发给指定窗口,而应用层则通过onWindowFocusChanged感知焦点变化。对于开发者而言,理解窗口焦点与触摸目标的本质区别至关重要,FLAG_NOT_FOCUSABLE 是控制窗口是否参与焦点竞争的关键标志。实际开发中,悬浮窗、Dialog、PopupWindow、软键

weixin_34015336的博客 374

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Android窗口焦点机制详解:从WMS到实战避坑指南

在Android应用开发中,输入事件能否准确分发、软键盘是否按预期弹出,背后都依赖一套系统级的裁决机制——窗口焦点。窗口焦点由WindowManagerService统一管理,决定当前哪个窗口能接收按键与触摸事件。理解mCurrentFocus与mFocusedApp的区别,掌握FLAG_NOT_FOCUSABLE等关键Flag的用法,是解决悬浮窗抢焦点、Dialog关闭后按键失灵、软键盘异常弹出等高频问题的核心前提。同时,onWindowFocusChanged与onResume的时序差异、分屏与画中画场

weixin_34198881的博客 421

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

如今Android的行情如何?是否应该死磕Framework?

随着Android 开发是市场的成熟,市场的招聘需求也在不断提升,以前常说的是Android 初级市场已饱和,但现在看来中级市场也在渐渐步入了饱和阶段,相信现在还有不少Android 开发在家待业找工作中,并不是他们找不到工作,而是给的价格太低不愿意去,价格给的高但技术要求达不到公司的标准,形成了高不成低不就的状态。再加上最近互联网上铺天盖地都是鸿蒙的消息,整的很多开发者都非常的心动,想要转行去学习鸿蒙。

m0_59162559的博客 1127

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Android Framework 窗口子系统 (05)窗口布局说明

系列文章解读&说明: Android Framework 窗口子系统 的 分析主要分为以下部分: Android Framework 窗口子系统 (01)WindowMangerService基础知识 Android Framework 窗口子系统 (02) 应用进程和WMS之间的关系 Android Framework 窗口子系统 (03) 窗口显示次序 Android Fra...

wangdsh的博客 3243

Android_Framework_WindowManagerService_总述

1.1概述 WindowManagerService 是android 系统的窗口管理员的身份,管理着Android系统中的“窗口”,“窗口”可以理解为Android显示系统界面的基本属性,任何东西只有在窗口里,才有可能被显示出来跟用户进行交互。android的窗口管理服务WindowManagerService(下面简称WMS),管理着窗口的创建和销毁,布局和大小,焦点的控制等等。 WMS

李云轩的专栏 709

Android窗口焦点机制全解析:从WMS到ViewRootImpl的焦点分发与排查

在Android开发中,焦点机制是影响按键事件、输入法交互和窗口层级的关键体系。与触摸事件依赖坐标命中不同,焦点决定了键盘、遥控器、手柄等无坐标事件的唯一接收者。系统侧由WindowManagerService维护mFocusedWindow,InputDispatcher持有焦点窗口句柄;应用侧则由ViewRootImpl和View树同步焦点状态,两层通过异步消息协同。理解这一机制对排查输入框无法唤起软键盘、按键事件丢失、焦点乱跳等常见问题至关重要。开发中常通过FLAG_NOT_FOCUSABLE控制窗口

weixin_34319374的博客 379

【窗口】分层角度来整体地理解 Android 窗口系统

HWComposer 是硬件抽象层的模块,由 SoC 厂商实现(通常是 GPU/显示控制驱动),提供硬件加速的 Layer 合成能力。所处的位置,以及 App → Framework → SurfaceFlinger → HWC 的整个链路。SurfaceFlinger 是一个独立的系统服务进程,负责所有 Layer(图层)的最终合成与输出到显示屏。,把这些类和作用按层直观地连起来,你觉得要画吗?逐层讲解涉及的主要类和它们的作用,并把它们串成一个完整的流程。如果你愿意,我可以帮你画一个。

疯子与天才就在一念之间 953

为什么要深入探索Android Framework?

简单来说,它就像是Android系统的“骨架”,支撑着整个系统的运行。只有了解了这个“骨架”是怎么工作的,我们才能更好地优化我们的应用,解决在开发过程中遇到的问题。那么,如何学习Android Framework呢?这就需要我们深入去学习它的源码,去理解它是如何被调用的,以及它是如何执行我们的代码的。只有真正理解了这些,我们才能算是真正掌握了Android开发的核心技术。此外,学习Framework还有助于我们更好地进行模块化、组件化等先进的架构设计。这对于提升应用的性能、优化用户体验都是非常重要的。

Android 开发架构 839
上一篇: aosp源码导入android studio无法跳转-学员答疑
下一篇: 安卓窗口window无法移除屏幕外超过屏幕边界?-wms源码层面深入剖析
千里马学框架
博客等级 码龄6年 1万+粉丝 651原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

千里马学框架

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

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

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

打赏作者

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

抵扣说明:

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

余额充值