WindowManagerService之启动篇

一:背景

  WindowManagerService(简称WMS)是Android系统最为重要的服务之一,它管理着系统所有的window,而且还是输入事件下发的中转站。了解其启动、工作流程对于我们写代码、分析问题都是很有帮助的。下面会基于AndroidV的源码,来看下WMS是如何启动的。

二:启动流程

    WMS作为系统服务之一,也是由SystemServer启动的,启动WMS主要分为以下几步:

  • 启动sensor服务
  • 创建WMS对象
  • WMS初始化
  • Display初始化
  • 系统准备完成
//frameworks/base/services/java/com/android/server/SystemServer.java
    private void startOtherServices(@NonNull TimingsTraceAndSlog t) {
        ...
        WindowManagerService wm = null;
        ...
            t.traceBegin("StartWindowManagerService");
            //启动sensor服务。WMS需要等待sensor启动完成之后再启动
            mSystemServiceManager.startBootPhase(t, SystemService.PHASE_WAIT_FOR_SENSOR_SERVICE);
            //初始化WMS对象
            wm = WindowManagerService.main(context, inputManager, !mFirstBoot,
                    new PhoneWindowManager(), mActivityManagerService.mActivityTaskManager);
            //把WMS加入到ServiceManager中,这样其他地方就可以通过Context.WINDOW_SERVICE获取WMS
            ServiceManager.addService(Context.WINDOW_SERVICE, wm, /* allowIsolated= */ false,
                    DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PRIORITY_HIGH
                            | DUMP_FLAG_PROTO);
            //把IMS加入到ServiceManager中,这样其他地方就可以通过Context.INPUT_SERVICE获取IMS
            ServiceManager.addService(Context.INPUT_SERVICE, inputManager,
                    /* allowIsolated= */ false, DUMP_FLAG_PRIORITY_CRITICAL);
            t.traceEnd();

            t.traceBegin("SetWindowManagerService");
            //ATMS进行window相关的初始化操作
            mActivityManagerService.setWindowManager(wm);
            t.traceEnd();

            t.traceBegin("WindowManagerServiceOnInitReady");
            //3. WMS初始化
            wm.onInitReady();
            t.traceEnd();
        ...
        t.traceBegin("MakeDisplayReady");
        try {
            //初始化屏幕信息
            wm.displayReady();
        } catch (Throwable e) {
            reportWtf("making display ready", e);
        }
        t.traceEnd();
        ...
        t.traceBegin("MakeWindowManagerServiceReady");
        try {
            //系统准备完成
            wm.systemReady();
        } catch (Throwable e) {
            reportWtf("making Window Manager Service ready", e);
        }
        t.traceEnd();
        ...
    }

2.1 启动sensor服务

WMS会等待在它之前加入到ServiceManager中的所有服务执行完onBootPhase,才会启动,其中就有sensor服务,最终会通过jni启动sensor服务。

//frameworks/base/services/core/java/com/android/server/SystemServiceManager.java
    public void startBootPhase(@NonNull TimingsTraceAndSlog t, int phase) {
        //下一阶段的值必须比上一阶段的值大
        if (phase <= mCurrentPhase) {
            throw new IllegalArgumentExcepti
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值