WMS启动过程

Post on Feb 04, 2023 by Wei Lin

WMS启动过程

SystemServer.startOtherServices()

设备开机后,在startOtherServices()中启动WindowManagerService,需要传入以下几个参数。

  • mSystemContext:system_server进程的Context
  • inputManager:IMS实例
  • mFirstBoot:未知
  • mOnlyCore:未知
  • PhoneWindowManager:用于管理Window的一些特定行为
  • ActivityTaskManagerService:对Activity的管理

startOtherServices()中的流程如下:

WindowManagerService wm = null;

// 实例化WMS并注册到ServiceManager中
t.traceBegin("StartWindowManagerService");
// WMS needs sensor service ready
mSystemServiceManager.startBootPhase(t, SystemService.PHASE_WAIT_FOR_SENSOR_SERVICE);
wm = WindowManagerService.main(context, inputManager, !mFirstBoot, mOnlyCore,
        new PhoneWindowManager(), mActivityManagerService.mActivityTaskManager);
ServiceManager.addService(Context.WINDOW_SERVICE, wm, /* allowIsolated= */ false,
        DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PROTO);
ServiceManager.addService(Context.INPUT_SERVICE, inputManager,
        /* allowIsolated= */ false, DUMP_FLAG_PRIORITY_CRITICAL);
t.traceEnd();

// AMS添加WMS的引用
t.traceBegin("SetWindowManagerService");
mActivityManagerService.setWindowManager(wm);
t.traceEnd();

// 做一些初始化操作
t.traceBegin("WindowManagerServiceOnInitReady");
wm.onInitReady();
t.traceEnd();

WindowManagerService.main()

之后在DisplayThread线程中创建了WMS的实例,所以WMS创建时是运行在android.display线程中的。

public static WindowManagerService main(final Context context, final InputManagerService im,
        final boolean showBootMsgs, final boolean onlyCore, WindowManagerPolicy policy,
        ActivityTaskManagerService atm) {
    return main(context, im, showBootMsgs, onlyCore, policy, atm,
            new DisplayWindowSettingsProvider(), SurfaceControl.Transaction::new,
            SurfaceControl.Builder::new);
}

/**
 * Creates and returns an instance of the WindowManagerService. This call allows the caller
 * to override factories that can be used to stub native calls during test.
 */
@VisibleForTesting
public static WindowManagerService main(final Context context, final InputManagerService im,
        final boolean showBootMsgs, final boolean onlyCore, WindowManagerPolicy policy,
        ActivityTaskManagerService atm, DisplayWindowSettingsProvider
        displayWindowSettingsProvider, Supplier<SurfaceControl.Transaction> transactionFactory,
        Function<SurfaceSession, SurfaceControl.Builder> surfaceControlFactory) {
    final WindowManagerService[] wms = new WindowManagerService[1];
    DisplayThread.getHandler().runWithScissors(() ->
            wms[0] = new WindowManagerService(context, im, showBootMsgs, onlyCore, policy,
                    atm, displayWindowSettingsProvider, transactionFactory,
                    surfaceControlFactory), 0);
    return wms[0];
}

WMS构造函数

private WindowManagerService(Context context, InputManagerService inputManager,
        boolean showBootMsgs, boolean onlyCore, WindowManagerPolicy policy,
        ActivityTaskManagerService atm, DisplayWindowSettingsProvider
        displayWindowSettingsProvider, Supplier<SurfaceControl.Transaction> transactionFactory,
        Function<SurfaceSession, SurfaceControl.Builder> surfaceControlFactory) {}

构造方法中的关键操作如下:

// WMS持有IMS的引用
mInputManager = inputManager;

// 持有PhoneWindowManager的引用
mPolicy = policy;
// WindowAnimator用于管理窗口动画
mAnimator = new WindowAnimator(this);
// RootWindowContainer是窗口容器的根容器,子容器是DisplayContent
mRoot = new RootWindowContainer(this);

// 获取其它相关Service和对象的引用
mWindowPlacerLocked = new WindowSurfacePlacer(this);
mTaskSnapshotController = new TaskSnapshotController(this);
mDisplayManager = (DisplayManager)context.getSystemService(Context.DISPLAY_SERVICE);

mActivityManager = ActivityManager.getService();
mAmInternal = LocalServices.getService(ActivityManagerInternal.class);

WMS.onInitReady()

在SystemServer.startOtherServices()中执行完构造WMS的实例后,会接着执行WMS的onInitReady()。

主要执行以下操作:

  • initPolicy()会调用到PhoneWindowManager.init(),用于初始化窗口管理策略相关的参数。
  • Watchdog.getInstance().addMonitor()是将WMS中实现的接口添加到Watchdog中,用于防止死锁的发生。
  • createWatermark()是创建水印,会读取”/system/etc/setup.conf”中的文件,用于开发新机型中的保密水印。
  • showEmulatorDisplayOverlayIfNeeded():应该是和模拟器相关的设置
/**
 * Called after all entities (such as the {@link ActivityManagerService}) have been set up and
 * associated with the {@link WindowManagerService}.
 */
public void onInitReady() {
    initPolicy();

    // Add ourself to the Watchdog monitors.
    Watchdog.getInstance().addMonitor(this);
    createWatermark();
    showEmulatorDisplayOverlayIfNeeded();
}