WMS的启动是在系统启动的过程中同时启动的,其启动主要代码:
/*SystemServer.java*/
private void startOtherServices() {
......
wm = WindowManagerService.main(context, inputManager,
mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL,
!mFirstBoot, mOnlyCore, new PhoneWindowManager());
ServiceManager.addService(Context.WINDOW_SERVICE, wm, /* allowIsolated= */ false,
DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PROTO);
......
wm.onInitReady();
......
try {
wm.displayReady();
} catch (Throwable e) {
reportWtf("making display ready", e);
}
......
try {
wm.systemReady();
} catch (Throwable e) {
reportWtf("making Window Manager Service ready", e);
}
......
}
其调用流程如下图:
在整个启动过程中,涉及到三个线程,系统启动时候的"system_server"线程,当wms.main中通过DisplayThread.getHandler()来获得android.display线程并调用wms构造函数,由于该线程优先级大于system_server线程,所以system_service线程会等待android.display线程结束。
在initPolicy中通过UiThread.getHandler()将PWM.init运行在android.ui线程,同样该线程优先级也大于system_service线程。
具体函数代码参考相应文件即可。