一、WindowManagerService介绍
WindowManagerService是Android系统中的一个系统服务,它负责管理和控制窗口的显示和操作。它是WindowManager的实现类,用于处理窗口的添加、删除和更新等操作。
WindowManagerService的主要职责包括:
-
窗口的添加和删除:WindowManagerService负责跟踪和管理所有的窗口,当应用程序请求添加一个新的窗口时,WindowManagerService会负责将该窗口添加到屏幕上,并在窗口不再需要时将其删除。
-
窗口的更新:当窗口的内容或属性发生变化时,WindowManagerService会负责更新窗口的显示,例如窗口的位置、大小、透明度等。
-
窗口的焦点管理:WindowManagerService负责管理窗口的焦点,确保用户可以正确地与窗口进行交互。
-
窗口的层级管理:WindowManagerService负责管理窗口的层级关系,确保窗口按照正确的顺序显示在屏幕上。
-
窗口的事件分发:WindowManagerService负责将用户的触摸事件、按键事件等分发给相应的窗口,以便窗口可以正确地响应用户的操作。
总之,WindowManagerService是Android系统中负责管理和控制窗口的重要组件,它通过与WindowManagerGlobal和其他相关组件的协作,实现了窗口的添加、删除、更新和事件分发等功能。
二、WindowManagerService相关类
WindowManagerService
负责管理和控制窗口的显示和操作
WindowManagerService文件路径:
frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java
WindowManagerService定义:
public class WindowManagerService extends IWindowManager.Stub
implements Watchdog.Monitor, WindowManagerPolicy.WindowManagerFuncs {}
StartingSurfaceController
StartingSurfaceController是一个类,它在Android系统中的WindowManagerService中起着重要的作用。它负责处理应用程序的启动过程中的启动画面(Splash Screen)的显示和管理。
StartingSurfaceController类中的createSplashScreenStartingSurface()方法用于创建启动画面的Surface,并将其添加到窗口管理器中。这个方法接收一个ActivityRecord对象作为参数,以及一些其他的参数,如应用程序的包名、主题、标签等。
在createSplashScreenStartingSurface()方法中,它会调用WindowManagerService中的mStartingSurfaceController对象的createSplashScreenStartingSurface()方法来创建启动画面的Surface。这个方法会根据传入的参数来创建一个StartingSurface对象,并将其返回。
StartingSurfaceController类的主要作用是管理应用程序启动过程中的启动画面,它负责创建和管理启动画面的Surface,并将其显示在屏幕上。这样可以提供更好的用户体验,让用户在应用程序启动过程中看到一个漂亮的启动画面。
StartingSurfaceController文件路径:
frameworks/base/services/core/java/com/android/server/vm/StartingSurfaceController.java
StartingSurfaceController定义:
public class StartingSurfaceController {
private static final class DeferringStartingWindowRecord {}
final class StartingSurface {}
}
WindowSurfaceController
WindowSurfaceController是Android系统中用于控制窗口表面的一个关键组件,它在SurfaceComposerClient和SurfaceFlinger之间起着重要的桥梁作用,负责管理和维护窗口表面的状态的属性,并向SurfaceFlinger服务发送通知和请求。WindowSurfaceController的作用主要包括:
-
窗口表面状态管理:WindowSurfaceController类通过与SurfaceFlinger服务通信,不断更新窗口表面的状态,包括表面大小、位置、缩放比例、透明度等属性。同时,WindowSurfaceController还负责窗口表面状态发生改变时向SurfaceFlinger发送通知,以触发界面的刷新和重绘。
-
窗口表面属性管理:WindowSurfaceController类还负责管理和维护窗口表面的其他属性,如缓冲区大小、格式、像素格式、内存映射等。开发人员可以使用WindowSurfaceController提供的接口函数来设置和控制这些属性,以实现复杂的图形效果和交互体验。
-
异步提交:WindowSurfaceController类使用异步提交的方式,向SurfaceFlinger服务发送窗口表面状态的更改。这种方式可以避免CPU和GPU之间的资源竞争和冲突,提供了系统的效率和稳定性。
WindowSurfaceController代码位于:
frameworks/base/service/java/com/android/server/wm/WindowSurfaceController.java
WindowSurfaceController的定义:
class WindowSurfaceController {}
WindowContainer
Defines common functionality for classes that can hold windows directly or through their children in a hierarchy form.
窗口容器,定义类的通用功能,这些类可以直接或通过其子级在层次结构形式中保存窗口。
WindowContainer代码位于:
frameworks/base/service/java/com/android/server/wm/WindowContainer.java
WindowContainer的定义:
class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<E>
implements Comparable<WindowContainer>, Animatable, SurfaceFreezer.Freezable,
InsetsControlTarget {}
WindowState
WindowState类是WindowManagerService管理所有窗口的基本操作单元,每个WindowState对象都代表一个窗口。状态包括窗口的大小、位置和可见性等信息,并且包含此窗口的绘制表面的处理逻辑和其他相关资源。
每个WindowState类都与一个Surace对象管理,用于在屏幕上显示窗口内容。Surface对象是Android UI系统中最基本的对象之一,是由窗口管理器维护的,并且用于限制在屏幕上绘制窗口内容时的访问权限。通过Surface对象,窗口管理器可以设置或更新窗口的位置、大小和透明度等属性,还可以根据需求决定在哪里绘制窗口的内容。
WindowState还由一个LayoutParams属性,用于描述如何布局和显示显示窗口。包括窗口的大小、位置、透明度、z轴顺序、层级等信息,并可以根据需要进行更改以使窗口满足更改的需求。
WindowState代码位于:
frameworks/base/service/java/com/android/server/wm/WindowState.java
WindowState的定义:
public final class extends WindowContainer<WindowState> implements WindowManagerPolicy.WindowState{}
WindowStateAnimator
WindowStateAnimator类是WindowManagerService中处理WindowState窗口的转换动画。每一个WindowState对应一个WindowStateAnimator,用于管理WindowState窗口的动画状态和过渡效果,并确保所有动画的正确执行。
WindowStateAnimator内部持有了三个Animation对象,分别对应窗口的进入、退出和变换效果,这些Animator对象是用于控制视图的位置、大小和透明度等属性的,以便在屏幕上显示动画效果。其中,变换动画效果是指窗口缩放、移动或选择等效果,可以应用于多个状态。
WindowStateAnimator代码位于:
frameworks/base/service/java/com/android/server/wm/WindowStateAnimator.java
WindowStateAnimator的定义:
class WindowStateAnimator {}
WindowToken
代表一个窗口的标识符,用于唯一标识一个窗口。每个WindowToken都对应着一个具体的窗口,包含窗口的一些基本属性,如类型、标识等。
WindowToken代码位于:
frameworks/base/service/java/com/android/server/wm/WindowToken.java
WindowToken的定义:
class WindowToken extends WindowContainer<WindowState>{}
Session
wm.Session是Android系统中一个系统级别的服务组件,它负责管理和维护应用程序与系统窗口之间的通信和协作。wm.Session通常是在WindowManagerService组件中实现的,wm.Session提供了一系列接口,用于创建、更新、销毁窗口,以及获取窗口的位置、大小、状态等信息:
-
addToDisplay():将一个VIew添加到指定的Display中
-
remoe():从此Session中删除所有窗口并结束会话。
-
updateSurfacePosition():在此Session中更新SurfaceControl位置。
-
updateSurfaceSize():在此Session中更新SurfaceControl的大小。
-
relayout():重新布局一个窗口。
Session代码位于:
frameworks/base/service/java/com/android/server/wm/Session.java
Session的定义:
class Session extends IWindowSession.Stub implements IBinder.DeathRecipient {}
InputMonitor
InputMonitor是一种用于监控输入事件的Windows管理器功能。它允许应用程序或系统组件监视和响应用户输入,例如键盘按键、鼠标移动和点击等。
通过使用wm InputMonitor,应用程序可以注册一个回调函数来处理输入事件。当用户执行输入操作时,系统会将相应的输入事件传递给注册的回调函数进行处理。这使得应用程序能够实时地获取和响应用户的输入。
InputMonitor代码位于:
frameworks/base/service/java/com/android/server/wm/InputMonitor.java
InputMonitor的定义:
final class InputMonitor {}
三、WindowManagerService相关流程分析
WindowManagerService addWindow流程分析
Android13 WindowManagerService addWindow流程分析-CSDN博客
WindowManagerService relayoutWindow
Android13 WindowManagerService relayoutWindow流程分析-CSDN博客
WindowManagerService finishDrawingWindow流程分析
Android13 WindowManagerService finishDrawingWindow流程分析-CSDN博客