android 13 WMS/AMS系统开发-WindowManagerService相关添加Window操作

Android Framework转型指南:从App代码逆向追踪AMS/WMS/PMS Android Framework并非独立新领域,而是应用层API(如startActivity、getWindow)背后封装的系统运行机制。其核心由AMS(Activity调度)、WMS(窗口管理)、PMS(包与权限管控)构成协同服务网络,依托Binder实现跨进程通信。理解这些组件的职责边界与交互逻辑,是定位启动卡顿、黑屏、ANR等系统级问题的技术基础。通过Logcat日志分析(如START/Displayed/Screen frozen)、Systrace性能追踪及Android Studio远程调试 阅读详情
AI摘要

该代码段详细描述了在Android13系统中,WindowManagerService如何处理添加Window的操作,包括使用WindowToken,检查权限,调整窗口参数,以及与InputDispatcher的交互。如果缺少必要的token,系统会创建新的WindowToken。同时,代码还涉及到了窗口类型检查、权限验证以及输入通道的打开等步骤。

android 13 WMS/AMS系统开发-WindowManagerService相关添加Window操作

frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java
更多内容qqun:422901085 https://ke.qq.com/course/5992266#term_id=106217431

public int addWindow(Session session, IWindow client, LayoutParams attrs, int viewVisibility,
            int displayId, int requestUserId, InsetsVisibilities requestedVisibilities,
            InputChannel outInputChannel, InsetsState outInsetsState,
            InsetsSourceControl[] outActiveControls) {
       //ignore

            ActivityRecord activity = null;
            final boolean hasParent = parentWindow != null;
            // Use existing parent window token for child windows since they go in the same token
            // as there parent window so we can apply the same policy on them.
            WindowToken token = displayContent.getWindowToken(
                    hasParent ? parentWindow.mAttrs.token : attrs.token);
            // If this is a child window, we want to apply the same type checking rules as the
            // parent window type.
            final int rootType = hasParent ? parentWindow.mAttrs.type : type;

            boolean addToastWindowRequiresToken = false;

            final IBinder windowContextToken = attrs.mWindowContextToken;

            if (token == null) {//系统窗口我们在app层面没有设置对应的token故为null
                if (!unprivilegedAppCanCreateTokenWith(parentWindow, callingUid, type,
                        rootType, attrs.token, attrs.packageName)) {
                    return WindowManagerGlobal.ADD_BAD_APP_TOKEN;
                }
                if (hasParent) {
                 //ignore
                } else if (mWindowContextListenerController.hasListener(windowContextToken)) {
                 //ignore
                } else {//最后进入这里
                    final IBinder binder = attrs.token != null ? attrs.token : client.asBinder();
                    token = new WindowToken.Builder(this, binder, type)//构造对应的WindowToken容器
                            .setDisplayContent(displayContent)
                            .setOwnerCanManageAppTokens(session.mCanAddInternalSystemWindow)
                            .setRoundedCornerOverlay(isRoundedCornerOverlay)
                            .build();
                }
            } 
             //ignore
             //基于token构造对应WindowState
            final WindowState win = new WindowState(this, session, client, token, parentWindow,
                    appOp[0], attrs, viewVisibility, session.mUid, userId,
                    session.mCanAddInternalSystemWindow);
          
            //校验一些策略
            final DisplayPolicy displayPolicy = displayContent.getDisplayPolicy();
            displayPolicy.adjustWindowParamsLw(win, win.mAttrs);
            attrs.flags = sanitizeFlagSlippery(attrs.flags, win.getName(), callingUid, callingPid);
            attrs.inputFeatures = sanitizeSpyWindow(attrs.inputFeatures, win.getName(), callingUid,
                    callingPid);
            win.setRequestedVisibilities(requestedVisibilities);
            //检验是否有权限加入
            res = displayPolicy.validateAddingWindowLw(attrs, callingPid, callingUid);
            if (res != ADD_OKAY) {
                return res;
            }
           //开枪与inputdispatcher通信的socketpair
            final boolean openInputChannels = (outInputChannel != null
                    && (attrs.inputFeatures & INPUT_FEATURE_NO_INPUT_CHANNEL) == 0);
            if  (openInputChannels) {
                win.openInputChannel(outInputChannel);
            }

            //ignore
            win.attach();
            mWindowMap.put(client.asBinder(), win);//装入容器,后面可以根据binder直接获取winstate
            win.initAppOpsState();
   			//ignore

            win.mToken.addWindow(win);
            displayPolicy.addWindowLw(win, attrs);
            displayPolicy.setDropInputModePolicy(win, win.mAttrs);
               //ignore
           
        }

        Binder.restoreCallingIdentity(origId);

        return res;
    }

总结addWindow主要干了以下几件事:
在这里插入图片描述

基于Android13的系统启动流程分析(三)之FirstStageMain阶段 init进程是Android系统中用户空间的第一个进程,作为第一个进程,它被赋予了很多极其重要的工作职责,比如创建zygote(孵化器)和属性服务等。init进程是由多个源文件共同组成的,这些文件位于源码目录system/core/init1. Bootloader 引导当按下设备电源键时,最先运行的就是 bootloader(固化在ROM的程序),bootloader 的主要作用就是硬件设备(如 CPU、flash、内存)的初始化并加载到RAM,通过建立内存空间映射,为装载 Linux 内核做好准备,。 阅读详情

相关推荐

Android Launcher启动过程深度解析:从系统就绪到首帧渲染

Launcher是Android系统中承载用户交互入口的核心Activity组件,其启动并非简单Intent触发,而是由ActivityManagerService在systemReady后主动调度的系统级行为。理解其基于MAIN+HOME intent-filter的识别机制、AMS-PMS-WMS三重校验流程,以及进程级与Activity级双重生命周期,对解决冷启动卡顿、桌面图标异常、Home键失效等典型问题至关重要。结合Systrace性能分析、Logcat精准过滤和AOSP源码调试,开发者可定位从A

weixin_34175509的博客 430

android 13 WMS/AMS系统开发-WindowManagerService相关relayout操作

主要就有2个最关键步骤:1、创建对应Window的SurfaceControl2、计算出对应的window区域等,把inset和config传递回去。

learnframework的博客 1885

Android Framework学习路线:从Binder到SystemServer的系统进阶指南

Android系统架构中,应用层与底层之间的桥梁是Framework,它承载着跨进程通信、消息驱动与系统服务调度等关键机制。其中,Binder作为Android核心IPC通信骨架,依靠mmap实现一次拷贝,为应用与系统服务的高效交互提供基础;Handler消息循环则保障了单线程模型下任务的有序执行,是主线程稳定运行的根基。理解这些原理,不仅有助于优化应用性能,更是掌握系统定制与问题定位的前提。从应用启动到视图绘制,从触摸事件分发到画面合成,Framework贯穿始终。本文将结合实际工程视角,系统梳理从Bin

weixin_34209851的博客 352

Android Window、WindowManager、WMS

1.窗口Window 在Android中显示一个界面,首先想到的是Activity、Dialog或Toast。但是在有些情况下,比如悬浮球,用Activity显然多余,这个时候可以使用窗口来实现。 整个Android的窗口机制是基于WindowManager接口的,这个接口可以添加view到屏幕,也可以从屏幕删除view。它面向的对象一端是屏幕,另一端就是View,直接忽略Activity或Dialog(其实Activity和Dialog的底层实现也是通过WindowManager)。 WindowM

zenmela2011的专栏 2418

android13 WindowManager-Shell.jar

android13 WindowManager-Shell.jar

Eureka自我保护机制

Eureka自我保护机制 默认情况下,当eureka server在一定时间内没有收到实例的心跳,便会把该实例从注册表中删除(默认是90秒),但是,如果短时间内丢失大量的实例心跳,便会触发eureka server的自我保护机制,比如在开发测试时,需要频繁地重启微服务实例,但是我们很少会把eureka server一起重启(因为在开发过程中不会修改eureka注册中心),当一分钟内收到的心跳数大量减少时,会触发该保护机制。可以在eureka管理界面看到Renews threshold和Renews(last

Soul_Ming的博客 543

【Android 14源码分析】WMS-窗口显示-第一步:addWindow

本篇开始真正看 addWindow 流程,首先从结果上对比下应用启动后窗口的区别来确认本篇的目的:Task其中 Task 和 ActivityRecord 是如何挂载上去的在【Activity启动流程】已经介绍了,当前要分析的 addWindow 流程最重要的目标就是分析窗口对应的 WindowState 是如何创建并且挂载到窗口树中的。也就是这一变化:应用端 Activity 执行到 onResume 说明 Activity 已经可见,下面就需要处理可见的内容。

隔壁小王的博客 2029

FreeRTOS CLI实战:5分钟搞定GD32串口终端移植(附LED控制源码)

本文详细介绍了如何在GD32芯片上快速移植FreeRTOS CLI(Command Line Interface)终端,实现串口交互式调试。通过DMA+空闲中断配置和LED控制命令实战,开发者可在5分钟内构建高效嵌入式调试工具,显著提升现场维护效率。

weixin_28707365的博客 450

深入理解WindowManager

WindowManager 我们知道Window是通过WindowManager来管理的,而与WindowManager对应的还有一个WMS(WindowManagerService)那么他们两者到底是怎么工作的呢?接下来我们就来具体分许一下 这篇文章我们重点分析WindowManager的基本知识脉络,而不去看具体的实现细节,我们只关心WindowManager和WindowManagerS...

小黄人的博客 3308

DDR5内存ODT模式全解析:5种状态与实战配置指南(附时序图)

本文深入解析DDR5内存的片上终端电阻(ODT)机制,详细阐述了其五种核心状态(终结电阻禁用、RTT_WR、RTT_NOM_RD、RTT_NOM_WR、RTT_PARK)的定义、切换时序与工作原理。通过解读JESD79-5规范中的时序图,并提供基于模式寄存器的实战配置指南与代码示例,帮助硬件工程师和系统开发者优化信号完整性,解决高负载下的稳定性问题,并实现性能与功耗的最佳平衡。

weixin_29221753的博客 563

FFmpeg魔改指南:让RTMP协议完美兼容H265的三种方法(含SRS适配技巧)

本文详细介绍了三种让RTMP协议兼容H265编码的FFmpeg魔改方案,包括基于官方补丁的标准改造、Intel的SVT-HEVC集成方案以及金山云的自定义扩展方案。文章重点解析了各方案的实现原理与适配技巧,并提供了在SRS 6.0服务器上进行深度配置和性能调优的完整实战指南,帮助开发者解决H265推流至传统RTMP服务器的兼容性问题。

weixin_29290947的博客 195

Android系统服务-WMS

Android系统服务-WMS

菜鸡一只 877

Android音频输出流实战:从AudioFlinger到HAL层的完整调用链解析

本文深入解析了Android音频输出流的完整调用链,从应用层的AudioTrack和AAudio API,到系统服务AudioFlinger的混音调度,最终抵达硬件抽象层(HAL)。文章结合实战经验,探讨了如何利用底层机制优化音频延迟、处理设备切换,并提供了性能调优与问题排查的具体方法,是开发高性能音频应用的实用指南。

weixin_29208327的博客 252

AndroidT(13) WMS启动流程

再看启动流程之前,我们先来了解一下WMS,他的全称是WindowManagerService。顾名思义,也就是窗口管理的服务类。

m0_53696288的博客 1503

图片边界矢量化-地理配准

无地理和投影信息的JPG图片,通过ArcGIS进行地理配准(Georeferencing)完成数字化边界。

u012727861的博客 1907

CATIA二次开发一一一获取属性的几种方法

这些方法覆盖了CATIA CAA开发中属性操作的典型场景,开发者可通过类型判断实现递归遍历、跨文档关联等复杂逻辑。此方法用于遍历对象的所有属性,获取属性键后可通过类型判断选择后续处理方式。适用于处理嵌套对象或关联对象的场景(如几何特征关联制造特征)。适用于简单属性值的直接读取(如版本号、状态标识等)。用于处理多值属性(如多选参数、装配体子件列表等)。用于处理跨文档引用(如零件关联图纸文件)。

工业软件开发 431

「安卓framework基础篇7」从WMS到BufferQueue第一篇 - WMS层级树的初始化过程(基于AOSP13)

上一篇文章分析了Vsync的基本工作过程,最终Vsync信号会派发给订阅Vsync信号的APP进程,那APP进程收到Vsync信号后,会做哪些事情呢?本篇咱们就来探讨一下APP进程收到Vsync信号后会做的事,本篇主要用画图的形式将构造WMS层级树的算法执行过程直观得向大家解释清楚,如果有空,看本篇前强烈建议先了解一下什么是有序多叉树和有序多叉树的前序遍历算法,WMS层级树就是一棵有序多叉树。

geyang55xu的博客 211

操作系统权限提升(十五)之绕过UAC提权-基于白名单DLL劫持绕过UAC提权

先将操作在本地执行,使用procmon进行监控,过滤DLL和 NAME NOT FOUND ,寻找可以替换的DLL文件,注意文件的权限是否可以在目录写入,可以看到在C盘的tools目录的文件中有一个srrstr.dll被调用,但是没有加载,我们生成恶意的DLL文件看看是否可以被劫持。在Windows中许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库文件,即dll文件,放置于系统中,个人理解类似于我们编程中引入的模块。将我们生成的DLL文件改名为我们要劫持的DLL文件名。

把自己活成一道光,因为你不知道,谁会借着你的光,走出了黑暗。请保持心中的善良,因为你不知道,谁会借着你的善良,走出了绝望。请保持你心中的信仰,因为你不知道,谁会借着你的信仰,走出了迷茫。请相信自己的力量,因为你不知道,谁会因为相信你,开始相信了自己.... 1873

android-wms-初始化流程

Android。

summerkissyou1987的专栏 873

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

android WMS 详解

android WMS 详解

maoning20080808的专栏 272

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Android 知识体系

Android归档前言 前言 感谢: Gityuan:Android系统架构开篇 刘望舒的博客:知识体系

许浑的博客 8199

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

深入理解WMS

一个WindowToken就代表一个应用组件,应用组件包括Activity,InputMethod等。先有个模糊的过程:用户定义的layout在启动activity时通过setContentView加载,此过程会把xml布局“翻译”成具体的view,客户端通知WMS添加此view,WMS构建个此“窗口”,这里有可能有多个应用同时显示,比如状态栏,导航栏,所以wms可能同时构建几个要显示的“窗口”,就需要把这几个窗口做个合并,哪个窗口再哪里显示,拼接出来的数据再通知SurfaceFlinger去显示。

qq_15915161的博客 730

Android框架开发核心技术解析与实践指南

Android框架开发是构建系统级功能的核心技术,涉及AMS、WMS等关键组件的深度定制。通过Binder跨进程通信机制,系统服务如ActivityManagerService管理着应用生命周期等核心功能。掌握框架层开发能显著提升应用性能与系统兼容性,尤其在定制ROM或系统级功能扩展场景中价值突出。本文以AOSP源码编译和自定义系统服务为例,详解如何通过修改Activity启动流程等实战案例进行框架定制,并分享Logcat过滤、Systrace等调试工具的使用技巧,帮助开发者解决内存泄漏、Binder调用超

weixin_33788244的博客 420

各类wiki文章总结

https://blog.youkuaiyun.com/qq_38679144/article/details/142656826 */*/【Android 14源码分析】WMS-窗口显示-第三步:finishDrawingWindow。==================启动systrace类=========================================启动systrace类=======================

tianshi4851的专栏 497
上一篇: android 13 WMS/AMS系统开发-系统窗口添加app层demo源码分析
下一篇: android 13 WMS/AMS系统开发-WindowManagerService相关relayout操作
千里马学框架
博客等级 码龄6年 1万+粉丝 650原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

千里马学框架

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

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

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

打赏作者

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

抵扣说明:

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

余额充值