Android解析WindowManagerService(一)WMS的诞生

本文详细解析了Android系统服务WindowManagerService(WMS)的诞生过程,包括WMS的职责,如窗口管理、窗口动画、输入系统和Surface管理。WMS在SystemServer进程的startOtherServices方法中启动,通过DisplayThread的Handler实例在"android.display"线程中创建。此外,文章还探讨了与WMS交互的其他关键服务,如InputManagerService(IMS)和Watchdog的监控机制。
摘要由CSDN通过智能技术生成

title: “Android解析WindowManagerService(一)WMS的诞生”
date: 2017-10-3 00:16
tag:

  • Android框架层
  • Android系统服务
  • WindowManagerService
    categories:
  • Android框架层

本文首发于微信公众号「刘望舒」

[外链图片转存失败(img-RnfAajqW-1563381456221)(https://s2.ax1x.com/2019/05/28/VexTxI.jpg)]

关联系列
Android系统启动系列
Android深入四大组件系列
Android应用进程启动过程系列
Android解析WindowManager系列

前言

此前我用多篇文章介绍了WindowManager,这个系列我们来介绍WindowManager的管理者WMS,首先我们先来学习WMS是如何产生的。本文源码基于Android 8.0,与Android 7.1.2相比有一个比较直观的变化就是Java FrameWork采用了Lambda表达式。

1.WMS概述

WMS是系统的其他服务,无论对于应用开发还是Framework开发都是重点的知识,它的职责有很多,主要有以下几点:

窗口管理

WMS是窗口的管理者,它负责窗口的启动、添加和删除,另外窗口的大小和层级也是由WMS进行管理的。窗口管理的核心成员有DisplayContent、WindowToken和WindowState。

窗口动画

窗口间进行切换时,使用窗口动画可以显得更炫一些,窗口动画由WMS的动画子系统来负责,动画子系统的管理者为WindowAnimator。

输入系统的中转站

通过对窗口的触摸从而产生触摸事件,InputManagerService(IMS)会对触摸事件进行处理,它会寻找一个最合适的窗口来处理触摸反馈信息,WMS是窗口的管理者,因此,WMS“理所应当”的成为了输入系统的中转站。

Surface管理

窗口并不具备有绘制的功能,因此每个窗口都需要有一块Surface来供自己绘制。为每个窗口分配Surface是由WMS来完成的。

WMS的职责可以简单总结为下图。

[外链图片转存失败(img-dQZmmKDp-1563381456222)(https://s2.ax1x.com/2019/05/28/VexIGd.png)]

2.WMS的诞生

WMS的知识点非常多,在了解这些知识点前,我们十分有必要知道WMS是如何产生的。WMS是在SyetemServer进程中启动的,不了解SyetemServer进程的可以查看在Android系统启动流程(三)解析SyetemServer进程启动过程这篇文章。
先来查看SyetemServer的main方法:
frameworks/base/services/java/com/android/server/SystemServer.java

public static void main(String[] args) {
   
       new SystemServer().run();
}

main方法中只调用了SystemServer的run方法,如下所示。
frameworks/base/services/java/com/android/server/SystemServer.java

  private void run() {
   
         try {
   
            System.loadLibrary("android_servers");//1
            ...
            mSystemServiceManager = new SystemServiceManager(mSystemContext);//2
            mSystemServiceManager.setRuntimeRestarted(mRuntimeRestart);
            LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
            // Prepare the thread pool for init tasks that can be parallelized
            SystemServerInitThreadPool.get();
        } finally {
   
            traceEnd();  // InitBeforeStartServices
        }
        try {
   
            traceBeginAndSlog("StartServices");
            startBootstrapServices();//3
            startCoreServices();//4
            startOtherServices();//5
            SystemServerInitThreadPool.shutdown();
        } catch (Throwable ex) {
   
            Slog.e("System", "******************************************");
            Slog.e("System", "************ Failure starting system services", ex);
            throw ex;
        } finally {
   
            traceEnd();
        }
    ...
    }
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值