ServiceManagerService

270 阅读1分钟

一、概述

surface:画布

WMS:添加Window的过程主要是添加surface,管理所有的surface布局,以及Z轴的顺序问题。

SurfaceFinger:将Surface按次序混合并显示到物理屏幕上。

二、wms的整体概述

  • WMS继承于IWindowManager.Stub, 作为Binder服务端;

  • WMS的成员变量mSessions保存着所有的Session对象,Session继承于IWindowSession.Stub, 作为Binder服务端;

  • 成员变量mPolicy: 实例对象为PhoneWindowManager,用于实现各种窗口相关的策略;

  • 成员变量mChoreographer: 用于控制窗口动画,屏幕旋转等操作;

  • 成员变量mDisplayContents: 记录一组DisplayContent对象,这个跟多屏输出相关;

  • 成员变量mTokenMap: 保存所有的WindowToken对象; 以IBinder为key,可以是IAppWindowToken或者其他Binder的Bp端;

    另一端情况:ActivityRecord.Token extends IApplicationToken.Stub
    
  • 成员变量mWindowMap: 保存所有的WindowState对象;以IBinder为key, 是IWindow的Bp端;

    另一端情况: ViewRootImpl.W extends IWindow.Stub
    
  • 一般地,每一个窗口都对应一个WindowState对象, 该对象的成员变量mClient用于跟应用端交互,成员变量mToken用于跟AMS交互.

三、WMS启动过程

整个启动过程涉及3个线程: system_server主线程, “android.display”, “android.ui”, 整个过程是采用阻塞方式(利用Handler.runWithScissors)执行的. 其中WindowManagerService.mH的Looper运行在 “android.display”进程,也就意味着WMS.H.handleMessage()在该线程执行。 流程如下:

image.png