基于Android10.0,分析WMS的启动过程
一、概述
WindowManagerService作为Android系统中重要的服务,管理所有的窗口和输入事件的中转站,其相关类如下。
1.1 WMS类族
WMS继承于IWindowManager.Stub,作为Binder服务端
成员变量mSessions保存所有的Session对象,Session继承于IWindowSession.Stub,作为Binder服务端
成员变量mPolicy,实例是PhoneWindowManager,用于实现各种窗口相关的策略
成员变量mWindowMap,保存所有的WindowState对象;以IBinder为key, 是IWindow的Bp端;
每个窗口都对应一个WindowState对象, 该对象的成员变量mClient用于跟应用端交互,成员变量mToken用于跟AMS交互,WindowState的attach方法与SurfaceFlinger通信。
WindowManager与WindowManagerService通过Session进行通信,具体的实现由WMS处理。
WindowManager实现类是WindowManagerImpl ;
WindowManagerImpl 中成员变量 mParentWindow (Window),mGlobal (WindowManagerGlobal)
1.2 图形框架
Android系统图形系统复杂,包括WindowManager,SurfaceFlinger,Open GL,GPU等模块,其中SurfaceFlinger作为绘制应用UI的核心。Surface代表BufferQueue的生产者端,并由SurfaceFlinger消费。
Image Stream Producter(生产者):可产生graphic buffers的生产者,例如:OpenGL ES,Canvas 2D,mediaserver的视频编码器
Image Stream Consumers(消费者):使用Open GL和Hardware Composer来组合一组surfaces
Window Manager:用于管理window,这是一组view容器,WM将window元数据信息发送给SurfaceFlinger,因此SurfaceFlinger能将这些信息来合成surfaces,并输出到显示设备。
Hardware Composer(硬件合成器):显示子系统的硬件抽象层,SurfaceFlinger能将一些合成工作给Hardware Composer,从而降低OpenGL和GPU的负载。
Gralloc:全程graphics memory allocator,图像内存分配器,用于图形生产请求分配内存。
二、启动过程
WMS在SystemServer中的startOtherServices方法启动,和其启动相关的主要操作如下:
[->SystemServer.java]
1 | private void startOtherServices() { |
2.1 WMS.main
[->WindowManagerService.java]
1 | public static WindowManagerService main(final Context context, final InputManagerService im, |
2.2 WindowManagerService
[->WindowManagerService.java]
1 | private WindowManagerService(Context context, InputManagerService inputManager, |
WMS的初始化在“android.display”线程中执行,mH继承于Handler,采用的是当前线程的Looper, mH.sendMessage方法也运行在android.display”线程
2.3 WMS.onInitReady
[->WindowManagerService.java]
1 | public void onInitReady() { |
2.3.1 initPolicy
[->WindowManagerService.java]
1 | private void initPolicy() { |
2.3.2 runWithScissors
[->Handler.java]
1 | public final boolean runWithScissors(final Runnable r, long timeout) { |
2.3.3 postAndWait
[->Handler.java::BlockingRunnable]
1 | public boolean postAndWait(Handler handler, long timeout) { |
postAndWait是阻塞操作,把消息放在Handler所指向的线程,此处是android.ui线程,由于该方法运行在android.display线程,从而会进入等待状态,直到执行完成,再唤醒android.display线程,PWM.init运行在android.ui线程,属于同步阻塞。
2.4 PWM.init
[->PhoneWindowManager.java]
1 | public void init(Context context, IWindowManager windowManager, |
2.5 WMS.displayReady
1 | private void displayReady(int displayId) { |
2.6 WMS.systemReady
[->WindowManagerService.java]
1 | public void systemReady() { |
2.6.1 PWM.systemReady
[->PhoneWindowManager]
1 | public void systemReady() { |
三、总结
整个启动过程有3个线程,systemserver主线程,”android.display”,”android.ui”,整个过程采用阻塞的方式(利用runWithScissors)执行,WMS.mH的Looper运行在”android.display”进程。流程如下:
附录
源码路径
1 | frameworks/base/services/java/com/android/server/SystemServer.java |