第八章 WindowManagerService.md

1178

8.1 WMS 的职责

image20211002212318673.png

  1. 窗口管理

    核心成员有 DisplayContent、WindowToken 和 WindowState,负责窗口的启动、添加和删除以及大小和层级。

  2. 窗口动画

    动画子系统的管理者是 WindowAnimator

  3. 输入系统的中转站

    InputManagerService 会对触摸事件进程处理,一般为将事件交给 WMS 来获取反馈。

  4. Surface 管理

    为每个窗口分配 Surface

8.2 WMS 的创建过程

这里涉及到三个线程的关系:

image20211002213438615.png

分为三个步骤:

  1. 在 system_server 线程中执行 SystemServer 的 startOtherServices 方法,在 startOtherServices 方法中会调用 WMS 的 main 方法,main 方法会创建 WMS,创建过程在 android.display 线程中实现。而创建过程中 system_server 线程一直处于阻塞状态等待 WMS 创建完毕。
  2. 在 WMS 创建过程中会调用 WMS 的 initPolicy 方法,其中又会调用 PWM.init (WindowManagerPolicy) 方法,该方法在 android.ui 线程中执行,PWN.init() 方法执行过程中 android.display 线程处于阻塞状态
  3. PWM 的 init 方法执行后,android.display 线程停止阻塞,WMS 创建完毕,system_server 线程停止阻塞,继续执行之后的 WMS.display() 方法来初始化屏幕显示信息。

8.3 WMS 的重要成员

这里给出部分成员变量:

  1. mPoilicy : WindowManagerManagerPolicy

    WMP 是窗口管理策略的接口类,代表一个策略。其具体实现类为 PhoneWindowManager,该实现类在 WMS 创建时创建,WMP 允许定制窗口层级和特殊窗口类型以及关键的调度和布局。

  2. mSessions : ArraySet<Session>

    主要用于进程通讯,具体看之前的 WindowManager 与 WMS 通讯

  3. mWindowMap : WindowHashMap

    WindowHashMap 继承与 HashMap,设定了 key 为 IBinder 类型,value 为 WindowState 类型。mWindowMap 就是用来保存 WMS 中各种窗口的集合

  4. mFinishedStarting : ArrayList<AppWindowToken>

    AppWindowToken 继承于 WindowToken。其中 WindowToken 主要有两个作用:

    • 窗口令牌,当应用程序需要向 WMS 申请新创建一个窗口,则需要向 WMS 出示有效的 WindowToken。AppWindowToken 主要用来描述应用程序的 WindowToken 结构,应用程序中每个 Activity 都对应一个 AppWindowToken
    • WindowToken 也用于标记一组 WindowState 属于同个组件( Activity ),只要他们创建的时候出示同一个 AppWindowToken
  5. mResizingWindows : ArrayList<WindowState>

    用来储存正在调整大小的窗口的列表,同样的还有各种其他的容器,用于存储在内存耗尽时需要强制删除的 Surface,或者需要被销毁的 Surface,或者等待销毁的 Surface。在窗口正在调整大小时,旧的 Surface 需要一直保持,直到新的 Surface 完成绘制,这里需要一种缓冲。

  6. mAnimator : WindowAnimator

    用于管理窗口动画

  7. mH : H

    系统的 Handler 类

  8. mInputManager : InputManagerService

    输入系统的管理者。IMS 会对触摸事件进行管理,会在 WMS 中寻找合适的窗口处理该事件。

8.4 Window 的添加过程 (PASS)

总结:

  • 对所有添加的窗口进行检查,如果不满足一些条件,则添加失败
  • WindowToken 相关的处理,有的窗口类型需要提供 WindowToken,有的窗口类型需要由 WMS 隐式创建 WindowToken
  • WindowState 的创建和相关处理,将 WindowToken 与 WindowState 相关联
  • 创建和配置 DisplayContent,完成窗口添加到系统前的准备工作

8.5 Window 的删除过程 (PASS)

总结

  • 检查删除线程的正确性
  • 从 ViewRootImpl 列表、布局参数列表和 View 列表中删除与 V 对应的元素
  • 判断是否可以直接执行删除操作,如果不能就推迟删除操作
  • 执行删除操作,清理和释放与 V 有关的一切资源