Android系统中WindowManagerService的初始化流程

Android 9.0系统源码_窗口管理(三)WindowManagerService对窗口的管理过程 通过Android9系统源码分析WindowManagerService对窗口的管理过程 阅读详情

WMS简介:

WindowManagerService,即窗口管理服务,简称WMS。顾名思义,主要用于进行窗口的管理,通过WMS的数据成员就可以看出来;除了管理窗口外,WMS还要对事件进行管理和分发。

WMS可以作为一个系统服务,可以说是系统服务中最复杂的一个服务了,和AMS(ActivityManagerService)称为Android系统框架“双子星”。掌握了这两个服务的原理和使用方法,可以说,就掌握了Android系统框架的95%了。

WMS类图:

代码位置:

framworks/base/services/java/com/android/server/wm/WindowManagerService.java:

其中,只列出WMS部分数据成员和成员函数,说明如下:

//所有当前激活的客户端sessions,正是这些session来请求WMS的资源
    final HashSet<Session> mSessions = new HashSet<Session>();

    //真正的窗口对象
    final HashMap<IBinder, WindowState> mWindowMap = new HashMap<IBinder, WindowState>();

    //已经完成启动的应用列表
    final ArrayList<AppWindowToken> mFinishedStarting = new ArrayList<AppWindowToken>();

    //渐变窗口列表
    final ArrayList<FakeWindowImpl> mFakeWindows = new ArrayList<FakeWindowImpl>();

    //正在改变尺寸的窗口列表
    final ArrayList<WindowState> mResizingWindows = new ArrayList<WindowState>();

    //动画结束并且马上被移除的窗口列表
    final ArrayList<WindowState> mPendingRemove = new ArrayList<WindowState>();

    //surface马上要被释放的窗口列表
    final ArrayList<WindowState> mDestroySurface = new ArrayList<WindowState>();

    //失去输入焦点并且等待新的焦点的窗口列表
    ArrayList<WindowState> mLosingFocus = new ArrayList<WindowState>();

onTransact():用于进程间通信。作为服务,怎么能少了onTransact呢。 

WMS的初始化:

和其它Framework层的许多service一样,WMS也是在system_server进程中启动的,WMS启动代码:

framworks/base/services/java/com/android/server/SystemServer.java:

wm = WindowManagerService.main(context, power,
                    factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL,
                    !firstBoot, onlyCore);
            ServiceManager.addService(Context.WINDOW_SERVICE, wm);

创建WMS实例,并且添加到service管理器中。注意,这段代码是在ServerThread的run函数中进行的,而且,wm是ServerThread线程的一个数据成员。整个AndroidFramework层的很多组件,都是ServerThread的数据成员,ServerThread是Framework的核心,而组成这个核心的是各个service。

WMS的实现:

framworks/base/services/java/com/android/server/wm/WindowManagerService.java:

从main函数开始来看:

public static WindowManagerService main(Context context,
            PowerManagerService pm, boolean haveInputMethods, boolean allowBootMsgs,
            boolean onlyCore) {
        WMThread thr = new WMThread(context, pm, haveInputMethods, allowBootMsgs, onlyCore);
        thr.start();

        synchronized (thr) {
            while (thr.mService == null) {
                try {
                    thr.wait();
                } catch (InterruptedException e) {
                }
            }
            return thr.mService;
        }
    }

 main函数返回的是本身这个对象,而且是通过线程WMThread返回的,也即WMThread这个线程创建的对象拥有WindowManagerService的实例的句柄。那么,主要看WMThread这个线程的实现(在源码中w,紧接着main函数的下面):w

static class WMThread extends Thread {
        WindowManagerService mService;

        private final Context mContext;
        private final PowerManagerService mPM;
        private final boolean mHaveInputMethods;
        private final boolean mAllowBootMessages;
        private final boolean mOnlyCore;

        public WMThread(Context context, PowerManagerService pm,
                boolean haveInputMethods, boolean allowBootMsgs, boolean onlyCore) {
            super("WindowManager");
            mContext = context;
            mPM = pm;
            mHaveInputMethods = haveInputMethods;
            mAllowBootMessages = allowBootMsgs;
            mOnlyCore = onlyCore;
        }

        @Override
        public void run() {
            Looper.prepare();
            //Looper.myLooper().setMessageLogging(new LogPrinter(
            //        android.util.Log.DEBUG, TAG, android.util.Log.LOG_ID_SYSTEM));
            WindowManagerService s = new WindowManagerService(mContext, mPM,
                    mHaveInputMethods, mAllowBootMessages, mOnlyCore);
            android.os.Process.setThreadPriority(
                    android.os.Process.THREAD_PRIORITY_DISPLAY);
            android.os.Process.setCanSelfBackground(false);

            synchronized (this) {
                mService = s;
                notifyAll();
            }

            // For debug builds, log event loop stalls to dropbox for analysis.
            if (StrictMode.conditionallyEnableDebugLogging()) {
                Slog.i(TAG, "Enabled StrictMode logging for WMThread's Looper");
            }

            Looper.loop();
        }
    }

可以看到,WHThread是一个静态内部类,有一个WindowManagerService的数据成员。在这个线程的run方法中,调用了WindowManagerService的构造函数(哦,原来是在这里创建的WindowManagerService的实例),创建完成后,把这个实例就保存起来:

            synchronized (this) {
                mService = s;
                notifyAll();
            }

 注意,这里用同步,一定得等到WindowManagerService的实例s被创建好之后,才能进行以上代码的执行。

接着,来看WindowManagerService的构造函数:

    private WindowManagerService(Context context, PowerManagerService pm,
            boolean haveInputMethods, boolean showBootMsgs, boolean onlyCore) {
        mContext = context;
        mHaveInputMethods = haveInputMethods;
        mAllowBootMessages = showBootMsgs;
        mOnlyCore = onlyCore;
        mLimitedAlphaCompositing = context.getResources().getBoolean(
                com.android.internal.R.bool.config_sf_limitedAlpha);
        mHeadless = "1".equals(SystemProperties.get(SYSTEM_HEADLESS, "0"));

        mPowerManager = pm;
        mPowerManager.setPolicy(mPolicy);
        PowerManager pmc = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
        mScreenFrozenLock = pmc.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                "SCREEN_FROZEN");
        mScreenFrozenLock.setReferenceCounted(false);

        mActivityManager = ActivityManagerNative.getDefault();
        mBatteryStats = BatteryStatsService.getService();

        // Get persisted window scale setting
        mWindowAnimationScale = Settings.System.getFloat(context.getContentResolver(),
                Settings.System.WINDOW_ANIMATION_SCALE, mWindowAnimationScale);
        mTransitionAnimationScale = Settings.System.getFloat(context.getContentResolver(),
                Settings.System.TRANSITION_ANIMATION_SCALE, mTransitionAnimationScale);
        mAnimatorDurationScale = Settings.System.getFloat(context.getContentResolver(),
                Settings.System.ANIMATOR_DURATION_SCALE, mTransitionAnimationScale);

        // Track changes to DevicePolicyManager state so we can enable/disable keyguard.
        IntentFilter filter = new IntentFilter();
        filter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED);
        mContext.registerReceiver(mBroadcastReceiver, filter);

        mHoldingScreenWakeLock = pmc.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK
                | PowerManager.ON_AFTER_RELEASE, "KEEP_SCREEN_ON_FLAG");
        mHoldingScreenWakeLock.setReferenceCounted(false);

        mInputManager = new InputManagerService(context, mInputMonitor);
        mAnimator = new WindowAnimator(this, context, mPolicy);

        PolicyThread thr = new PolicyThread(mPolicy, this, context, pm);
        thr.start();

        synchronized (thr) {
            while (!thr.mRunning) {
                try {
                    thr.wait();
                } catch (InterruptedException e) {
                }
            }
        }

        mInputManager.start();

        // Add ourself to the Watchdog monitors.
        Watchdog.getInstance().addMonitor(this);
        mFxSession = new SurfaceSession();

        Surface.openTransaction();
        createWatermark();
        Surface.closeTransaction();
    }

在WindowManagerService的构造函数中,大部分代码都是在进行数据成员的初始化。WindowManagerService声明了大量的系统框架类的实例,例如:

mContext:运行环境上下文;

mPowerManager:电源管理相关;

mActivityManager:用于管理activity管理;

mInputManager:输入法相关;

mBatteryStats:电池状态相关;

除了初始化这些数据成员外,构造函数中,比较重要的代码如下:

注册了receiver:

IntentFilter filter = new IntentFilter();
//用于接收设备状态的变化        filter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED);
        mContext.registerReceiver(mBroadcastReceiver, filter);

//用于接收电源状态的变化

        mHoldingScreenWakeLock = pmc.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK
                | PowerManager.ON_AFTER_RELEASE, "KEEP_SCREEN_ON_FLAG");
        mHoldingScreenWakeLock.setReferenceCounted(false);
 

还创建了一个线程PolicyThread :

PolicyThread thr = new PolicyThread(mPolicy, this, context, pm);
        thr.start();

和WMThread类似,这个线程也是一个静态内部类,它主要的作用是配合WindowManagerPolicy来完成整个Service功能的实现。

        mInputManager.start(); //开启输入法

        Surface.openTransaction(); //打开surface事务
 

至此,整个WMS就初始化完成了。

可以说,真个初始化过程要比上面的流程复杂的多,不可能面面俱到,仅抛砖引玉。

WMS的使用:

在Android应用程序开发时,是通过WindowManager来访问WMS提供的服务的。

例如,获取WindowManager的代码如下:

WindowManager wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE);

 给一个Activity动态添加一个Button的代码如下:

        WindowManager wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
        Button btnView = new Button(this);
        btnView.setText("Hello WM!");
        WindowManager.LayoutParams mParams = new WindowManager.LayoutParams();
        wm.addView(btnView, mParams);


Android R WindowManagerService模块(1) WMS整体架构及启动过程 DisplayArea是Android R上新添加的容器,目的就是将复杂的窗口层级管理简单化、低耦合。而在树结构中,各个容器结构如下:可以看到,在树结构中,根节点为RootWindowContainer,叶子节点为WindowState。正是通过这种结构,WMS中将系统中所有的窗口显示管理得井井有条,并将所有窗口以Surface的形式送到SurfacaFlinger中进行合成和显示。 阅读详情

相关推荐

Android R WindowManagerService模块(1) WMS整体架构及启动过程(1),2024年Android网络编程总结篇

【Android 详细知识点思维脑图(技能树)】我个人是做Android开发,已经有十来年了,目前在某创业公司任职CTO兼系统架构师。虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。

2401_84148981的博客 1014

Android WindowManagerService

WindowManagerService是Android系统中的一个系统服务,它负责管理和控制窗口的显示和操作。它是WindowManager的实现类,用于处理窗口的添加、删除和更新等操作。WindowManagerService的主要职责包括:窗口的添加和删除:WindowManagerService负责跟踪和管理所有的窗口,当应用程序请求添加一个新的窗口时,WindowManagerService会负责将该窗口添加到屏幕上,并在窗口不再需要时将其删除。

liuning1985622的博客 1491

Android WindowManagerService的分析与编程

在上述示例代码中,我们首先在onCreate方法中获取WindowManager对象,并使用WindowManager.LayoutParams定义了悬浮窗口的布局参数。WindowManagerService是Android系统中负责窗口管理的关键组件,通过了解其原理和使用方法,可以更好地理解和开发Android应用中与窗口相关的功能。首先,根据窗口的Binder对象从mWindowMap中找到对应的WindowState对象,并从mWindowList和mWindowMap中移除。

PixelLogic的博客 346

Service 使用 WindowManager addView

Service使用WindowManager addView

weixin_46987432的博客 1217

WMS(WindowManagerService)之一:WMS启动流程

本文详细解析了Android WindowManagerService(WMS)的启动流程。WMS启动分为三个阶段:1)通过main()方法创建实例,包括初始化显示设备、窗口动画管理器和输入系统;2)调用displayReady()初始化显示信息;3)通过systemReady()完成系统准备。同时分析了WMS.Handler的核心消息处理逻辑,包括焦点变化报告、窗口冻结超时、应用转场超时、强制GC、屏幕启用等20多种消息类型。这些消息处理机制体现了WMS作为窗口管理核心服务对显示系统、输入事件和窗口动画等

1086

EB配置输入捕获ICU模块----基于S32K3

基于S32K311芯片,EB配置ICU输入捕获(Emios 和Siul)

weixin_43586400的博客 1772

【Android12】WindowManagerService架构分析

WindowManagerService(以下简称WMS) 是Android的核心服务。WMS管理所有应用程序窗口(Window)的Create、Display、Update、Destory。 因为Android系统中只有一个WMS(运行在SystemServer进程),可以称其为全局的WMS。其主要的任务有两个:

林多 3254

【R语言】富集分析可视化代码(整理版)

分别介绍了如何使用DAVID在线分析工具对基因进行GO/KEGG功能富集分析、使用R ggplot包对获得的基因GO/KEGG功能富集结果进行可视化、使用R clusterProfiler包和R AnnotationHub包对基因进行GO/KEGG功能富集分析、OrgDb包制作以及结果可视化等。故,我重新整理了一波,并补充了可对多个分组的富集结果进行可视化以及富集结果绘制圈图等的代码。关注“在打豆豆的小潘学长”公众号,发送“富集分析3”获得完整代码包和演示数据。一、单组富集结果可视化。

weixin_54004950的博客 1万+

WindowManagerService之启动篇

WMS启动

gary_qing的博客 535

10行代码搞定QMT实盘交易:手把手教你用Python自动化买卖股票(附完整源代码)

本文提供了一份详尽的QMT实盘交易教程,手把手教你使用Python构建自动化交易系统。内容涵盖环境配置、账户连接、查询与下单等核心代码,并附有完整的源代码示例,帮助开发者快速掌握从零到实盘的完整流程,实现安全可靠的股票自动化买卖。

weixin_29214335的博客 439

08-SD卡-TF卡硬件电路设计

SD卡-TF卡硬件电路设计

weixin_66510961的博客 8258

WindowManagerService启动流程简析

    WindowManagerService 就是位于 Framework 层的窗口管理服务,它的职责就是管理系统中的所有窗口。    Android中的窗口概念:屏幕上一块用于绘制各种UI元素并可以响应用户输入的一块矩形区域。从原理上来看,窗口的概念是独自占有一个Surface实例的显示区域。如Dialog、Activity的界面、壁纸、状态栏以及Toast等都是窗口。    WindowM...

white_wt的博客 1502

【无线通信】射频杂散(RF Spurious Emissions)

射频杂散(RF Spurious Emissions)是指在无线通信系统中,除了在指定频率范围内的预期信号之外,任何不需要的或非预期的射频信号。这些杂散信号可能会干扰其他通信系统,降低系统性能,并违反无线电通信法规。射频杂散通常包括谐波、次谐波、互调产物和其他非线性失真所产生的信号。

qq_38801607的博客 5423

android 初始化类,Android Display的初始化

本文从Android Java层讲解Android Display相关类的初始化。整体流程如下:Display Device Discover1. DisplayAdapter获得DisplayDeviceDisplayManagerService中取得DisplayDeviceLocalDisplayAdapter从BUILT_IN_DISPLAY_IDS_TO_SCAN中获得DISPLAY I...

weixin_42718924的博客 1108

Surface Pro 4/5/6/7保姆级黑苹果安装:从Windows分区到OC引导配置全流程(含EFI文件替换避坑)

本文详细介绍了在Surface Pro 4/5/6/7上安装黑苹果的全流程,包括Windows分区、OC引导配置和EFI文件替换等关键步骤。通过实战经验分享,帮助用户避开常见陷阱,实现Windows与macOS双系统完美共存,特别适合对黑苹果安装感兴趣的Surface Pro用户。

weixin_30300225的博客 1359

Python 中 dpkt 库的详细使用指南(强大的 Python 数据包解析库)

dpkt 是一个功能强大的 Python 网络数据包解析库,支持解析和构造以太网、IP、TCP/UDP 等多种协议的数据包。其核心功能包括解析各层协议头部、读写 pcap 文件、构造自定义数据包及分析 HTTP 流量等。dpkt 提供简单易用的 API,适用于网络分析、安全研究和流量监控场景。优化技巧包括数据包过滤、批量处理和选择性解析以提高性能,常见问题如数据不完整或协议识别错误可通过异常处理和字段验证解决。典型应用场景涵盖协议分析、网络调试和自定义数据包生成。

数据知道的博客 1万+

start of WindowManagerService

start of WindowManagerService frameworks/base/services/java/com/android/server/SystemServer.java class ServerThread extends Thread {      ......        @Override      public void run() {

llrraa2010的专栏 1628

Statistics and Machine Learning Toolbox

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

android-wms-初始化流程

Android。

summerkissyou1987的专栏 873

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...

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

WindowManagerService (WMS)

方面描述角色窗口的大管家,负责管理所有窗口的秩序(层级、布局、焦点、动画、输入)启动由在阶段,在专用的中创建,并注册到 ServiceManager通信通过 Binder 机制()与客户端 App 交互核心对象(服务端窗口对象),Session(应用进程连接),(显示设备管理)协作服务AMS(管理Activity生命周期),(合成渲染Surface),(分发输入事件)核心流程添加窗口布局动画输入事件分发Surface 分配与管理可以把 WMS 想象成舞台剧的导演,而每个 App 窗口是演员。

w2064004678的博客 732

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Android源码笔记--WindowManagerService

WindowManagerService              WindowManagerService(WMS)是Android中图形用户接口的引擎,它管理着所有窗口.这里说的管理是指“创建,添加,删除”,以及将某个窗口设置为焦点窗口(正在与用户交互的窗口)。在WMS中,窗口由两部分内容构成的,一部分是描述该窗口的类WindowState,另一部分是该窗口在屏幕上对应的界面Surface....

ljt2724960661的博客 931

Android待机锁屏流程分析

... 启动SystemServer之前在这里省略 SystemServer.java 1. main() //系统服务的入口函数 2. main会调用init1()本地方法 This method is called from Zygote to initialize the system. This will cause the native services (Surfac

androiddeveloper的专栏 4714

android+wms+map,Android_WMS_启动流程

本文主要是基于android10.0.0来讲述下WMS的启动流程1:概述WMS作为系统的一个关键服务其是在SystemServer.java::startOtherServices中启动的WMS主要有下面几个作用1:应用程序通过WMS向SurfaceFinger申请surface,surface代表的是绘图表面,应用程序绘制都必须在绘图表面上2:管理窗口的层级,一个窗口一般在WMS端都是一个Win...

weixin_34769715的博客 794

WindowManager窗口添加管理流程分析一

WindowManagerService窗口添加管理流程分析Api中窗口定义与使用WindowManagerService初始化新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 Api中窗口定义与使用 我们知道Android

luoluofeixia的博客 566

android input 事件传递主要流程

1.  WindowManagerService frameworks/base/services/java/com/android/server/WindowManagerService.java 依赖 InputManager  mInputManager;    在初始化的时候生成,并mInputManager.start() 启动   2. InputManager fram

darling757267的专栏 1693

Android启动研究(三)

Android FrameWork分析研究

程序人生,奋斗人生! 2965
上一篇: Android源码分析-ActivityManagerService(AMS)源码分析
下一篇: java中的callback
liranke
博客等级 码龄20年 4939粉丝 594原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

liranke

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值