首页 > 其他分享 >Android WMS概览

Android WMS概览

时间:2024-11-19 10:14:16浏览次数:3  
标签:分发 窗口 动画 WMS 概览 事件 WindowManagerService Android

WMS(WindowManagerService)是 Android 系统的核心服务,负责管理应用和系统的窗口,包括窗口的创建、销毁、布局、层级管理、输入事件分发以及动画显示等。它通过协调 InputManager 和 SurfaceFlinger 实现触摸事件处理和窗口渲染,是连接应用界面和底层显示硬件的关键桥梁。

在这里插入图片描述

目录

  1. WindowManagerService 简介
  2. WMS 的架构设计
  3. WMS 的启动过程
  4. 窗口的管理和层级关系
  5. 窗口的创建流程
  6. 输入事件的分发
  7. 动画和屏幕刷新
  8. 关键源码解析
  9. 总结

1. WindowManagerService 简介

WindowManagerService (简称 WMS) 是 Android Framework 中负责管理窗口的核心服务。其主要功能包括:

  • 窗口的创建与销毁: 管理应用程序的窗口生命周期。
  • 窗口的层级管理: 根据 Z-order 和类型对窗口进行排列。
  • 输入事件的分发: 协同 InputManagerService 分发触摸和键盘事件。
  • 动画与过渡: 处理窗口的进入、退出动画。
  • 屏幕显示与布局: 控制屏幕分辨率、方向、屏幕分割等。
  • 多窗口支持: 在新版 Android 中支持多窗口模式。
    WMS 的实现位于 frameworks/base/services/core/java/com/android/server/wm 目录下,是系统中最复杂的服务之一。

在这里插入图片描述

2. WMS 的架构设计

WMS 的架构分为以下几个核心模块:

2.1 核心类

  • WindowManagerServiceWMS 的主类,负责窗口的创建、删除、层级管理和其他服务交互。
  • WindowState表示一个窗口的状态,每个窗口都对应一个 WindowState 对象。
  • WindowToken 和 AppWindowToken用于管理窗口的生命周期,一个 WindowToken 通常表示一个窗口集合(如应用的主窗口和其子窗口)。
  • DisplayContent管理物理屏幕上所有的窗口和布局信息。
  • Session每个应用都有一个对应的 Session,用于进程间通信。

2.2 辅助模块

  • InputManagerService协助处理输入事件。
  • SurfaceFlinger与底层硬件交互,负责最终窗口的显示。
  • ActivityManagerService (AMS) 管理窗口与应用的生命周期。

在这里插入图片描述

3. WMS 的启动过程

WMS 的启动由 SystemServer 触发,其流程如下:

  1. 启动 SystemServerSystemServer 初始化系统服务,包括 WMS。
  2. 调用 startOtherServicesSystemServer.javastartOtherServices() 方法中启动 WMS:
wm = WindowManagerService.main(context, inputManager, !mFirstBoot, mOnlyCore, new UiThread());
  1. 创建 WindowManagerService 实例WindowManagerService.main() 方法中初始化:
public static WindowManagerService main(Context context, InputManagerService inputManager, 
        boolean showBootMsgs, boolean onlyCore, Handler uiHandler) {
    WindowManagerService service = new WindowManagerService(context, inputManager, showBootMsgs, onlyCore, uiHandler);
    service.onInitReady();
    return service;
}
  1. 注册到 ServiceManager将 WMS 注册为系统服务,供其他组件调用。

在这里插入图片描述

4. 窗口的管理和层级关系

WMS 管理窗口的层级,遵循以下原则:

  1. 按照窗口类型分层
  • 应用窗口 (Application Window):如 Activity 的主窗口。
  • 系统窗口 (System Window):如状态栏、导航栏。
  • 子窗口 (Sub Window):附属于主窗口,如对话框。
  1. Z-order 排序窗口的绘制顺序由 Z-order 决定。
  2. 层级结构窗口层级通过 DisplayContentWindowToken 实现树形管理。
    在这里插入图片描述

5. 窗口的创建流程

应用程序请求窗口创建时的流程如下:

  1. 应用调用 WindowManager应用通过 WindowManager.addView() 方法请求添加窗口。
WindowManager wm = getWindowManager();
wm.addView(view, layoutParams);
  1. 通过 Binder 传递到 WMS请求通过 Session 传递到 WMS 的 addWindow() 方法。
  2. 创建 WindowState 对象addWindow() 中为新窗口创建 WindowState 实例。
  3. 绑定 SurfaceWMS 调用 SurfaceFlinger 分配绘制区域,关联 SurfaceControl
  4. 完成添加窗口加入 DisplayContent 的管理树,完成绘制和显示。

6. 输入事件的分发

WMS 协同 InputManagerService 完成输入事件的分发。流程如下:

  1. 输入事件捕获输入事件由 InputManager 捕获后传递给 WMS。
  2. 窗口的焦点判断WMS 根据焦点窗口确定事件目标。
  3. 分发事件通过 IPC 将事件发送到目标窗口所在的应用。
    输入事件分发的核心方法是 deliverPointerEvent()

7. 动画和屏幕刷新

WMS 的动画处理包括窗口的打开、关闭、过渡动画,主要由 WindowAnimator 处理。

屏幕刷新由 Choreographer 协调,确保动画流畅显示。

8. 关键源码解析

8.1 addWindow 源码解析

WindowManagerService.addWindow 是窗口创建的核心方法:

public int addWindow(Session session, IWindow client, int seq, 
        WindowManager.LayoutParams attrs, int viewVisibility, int displayId, 
        Rect outContentInsets, Rect outStableInsets, DisplayCutout.ParcelableWrapper outDisplayCutout, 
        InputChannel outInputChannel) {
    
    synchronized(mGlobalLock) {
        WindowState win = new WindowState(this, session, client, attrs, seq, viewVisibility);
        // 校验窗口合法性
        // 创建 Surface
        // 加入到 WindowList
        ...
    }
    return WindowManagerGlobal.ADD_OKAY;
}

8.2 输入事件分发

在 WMS 中,输入事件分发的核心方法是 processPointerEvent()

public void processPointerEvent(MotionEvent event) {
    synchronized(mGlobalLock) {
        WindowState focusedWindow = mFocusedWindow;
        if (focusedWindow != null) {
            focusedWindow.deliverInputEvent(event);
        }
    }
}

9. 总结

WindowManagerService 是 Android 系统中最重要的服务之一。它不仅连接了应用、系统和硬件,还实现了复杂的窗口管理、动画效果、输入分发等功能。通过深入理解 WMS 的架构和源码,可以帮助开发者更好地优化应用的性能和用户体验。

标签:分发,窗口,动画,WMS,概览,事件,WindowManagerService,Android
From: https://blog.csdn.net/wudexiaoade2008/article/details/143868701

相关文章

  • Android 应用检测设备是否被root
    publicclassPropertyUtils{privatestaticfinalStringROOT_DEVICE="0";privatestaticfinalStringNON_ROOT_DEVICE="1";privatestaticvolatileMethodget=null;privatestaticStringgetProperty(Stringprop......
  • Android SELinux权限
    Android使用安全增强型Linux(SELinux)对所有进程强制执行强制访问控制(MAC),其中包括以Root/超级用户权限运行的进程(Linux功能)。工作模式宽容模式-仅记录但不强制执行SELinux安全政策。强制模式-强制执行并记录安全政策。如果失败,则显示为EPERM错误。可以通过ge......
  • 【Android、IOS、Flutter、鸿蒙、ReactNative 】绘制空心圆圈
    Androidjava绘制圆圈自定义CircleViewpackagecom.java.circle;importandroid.content.Context;importandroid.graphics.Canvas;importandroid.graphics.Paint;importandroid.view.View;publicclassCircleViewextendsView{privatePaintpaint;......
  • QT 6.8 安卓 Android 环境安装配置,你踩了几个坑,我教你跳出来,早看不入坑… …
    安装了QT6.8最新版本,在线安装,用了数天后,想开始写一个Android程序,发现还在配置环境才可以继续,于是就开始配置: 菜单:编辑-->preferences-->设备-->Android         [界面没有完全本地化,部分会是英文,无紧要,看习惯了一样] 因为之前己安装了java开发环境,所以JDK......
  • Android 10.0 Service启动流程分析一
    1.概述在10.0的系统rom开发中,app中对于Service的使用也是非常常见的,但是在系统framework中同样需要了解service的启动流程,看下service具体是怎么样启动的,这样就可以方便解决一些服务相关问题2.Service启动流程分析一的核心类frameworks\base\core\java\android\app\Contex......
  • 如何在Mac上直接编辑Android设备上的文件?推荐使用MacDroid Pro
    MacDroidPro是一款功能强大、易于使用的跨平台文件传输与管理软件。它能够实现Mac电脑与Android设备之间的无缝连接和传输,提供全面的文件管理和同步功能,并具备直观易用的界面和安全可靠的数据保障。 MacDroidPro通过以下步骤实现Mac电脑与Android设备之间的文件传输:下载......
  • 【Android Studio 2022软件下载与安装教程】
    1、安装包AndroidStudio2022:链接:https://pan.quark.cn/s/9821141ab2c7提取码:aTaw2、安装教程1)       解压下载安装包,双击Setup.exe安装,弹窗安装对话框  2)       点击下一步  3)       默认,点击下一步  4)       选择安......
  • 如何从 Android 图库中恢复误删除的照片
    如果您正在阅读这篇文章,那么您肯定意外地从Android设备中删除了照片。并且您正在寻找一种简单的方法来恢复Android图库中已删除的照片。从图库恢复已删除的照片随着技术的进步,现在使用单个设备(即Android手机),您就可以捕捉图像、根据需要编辑图像、高效管理图像、存储图......
  • Android Studio 2023搭建Flutter开发环境
    1、安装PluginsFlutter,搜索出来,就点击Install。安完之后重启AndroidStudio。            2、再到Plugins查看Installed,是否安装成功了Flutter和Dart。3、安装FlutterSDK,下载地址:https://docs.flutter.dev/get-started/install/windows/mobile4......
  • android脱壳 细节源码解析
    加固和脱壳加固:在Android中,应用的代码是通过DEX文件存储的,DEX(DalvikExecutable)文件包含了用于在Dalvik或ART虚拟机中执行的字节码。这些DEX文件通常是应用的核心代码,包含了类、方法、字段等信息。DEX文件通常被压缩或加密,以防止直接提取和反编译。加壳通常是通过......