DisplayManagerService 上层到surfaceflinger流程分析

DisplayManagerService 的启动是在systemserver中;

// Display manager is needed to provide display metrics before package manager
// starts up.
 mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);

这里开启了DisplayManagerService ;
接下来看下DisplayManagerService 的构造方法和onstart()

  public DisplayManagerService(Context context) {
        super(context);
        mContext = context;
        //DisplayManagerHandler 来处理各种消息事件
        mHandler = new DisplayManagerHandler(DisplayThread.get().getLooper());
        mUiHandler = UiThread.getHandler();
        mDisplayAdapterListener = new DisplayAdapterListener();
        mSingleDisplayDemoMode = SystemProperties.getBoolean("persist.demo.singledisplay", false);
    }

    @Override
    public void onStart() {
        mHandler.sendEmptyMessage(MSG_REGISTER_DEFAULT_DISPLAY_ADAPTER);

        publishBinderService(Context.DISPLAY_SERVICE, new BinderService(),
                true /*allowIsolated*/);
        publishLocalService(DisplayManagerInternal.class, new LocalService());
    }

在onStart中,发送了一个MSG_REGISTER_DEFAULT_DISPLAY_ADAPTER消息。接下来看下处理消息的地方

    private final class DisplayManagerHandler extends Handler {
   
        public DisplayManagerHandler(Looper looper) {
            super(looper, null, true /*async*/);
        }

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case MSG_REGISTER_DEFAULT_DISPLAY_ADAPTER:
                    registerDefaultDisplayAdapter();
                    break;

                case MSG_REGISTER_ADDITIONAL_DISPLAY_ADAPTERS:
                    registerAdditionalDisplayAdapters();
                    break;

                case MSG_DELIVER_DISPLAY_EVENT:
                    deliverDisplayEvent(msg.arg1, msg.arg2);
                    break;

                case MSG_REQUEST_TRAVERSAL:
                    mWindowManagerInternal.requestTraversalFromDisplayManager();
                    break;

                case MSG_UPDATE_VIEWPORT: {
                    synchronized (mSyncRoot) {
                        mTempDefaultViewport.copyFrom(mDefaultViewport);
                        mTempExternalTouchViewport.copyFrom(mExternalTouchViewport);
                    }
                    mInputManagerInternal.setDisplayViewports(
                            mTempDefaultViewport, mTempExternalTouchViewport);
                    break;
                }
            }
        }

可以看到MSG_REGISTER_DEFAULT_DISPLAY_ADAPTER是走registerDefaultDisplayAdapter()分支。

    private void registerDefaultDisplayAdapter() {
        // Register default display adapter.
        synchronized (mSyncRoot) {
            registerDisplayAdapterLocked(new LocalDisplayAdapter(
                    mSyncRoot, mContext, mHandler, mDisplayAdapterListener));
        }
    }

先看下new LocalDisplayAdapter是做了什么?

    public LocalDisplayAdapter(DisplayManagerService.SyncRoot syncRoot,
            Context context, Handler handler, Listener listener) {
        //调用到了父类DisplayAdapter的构造方法
        super(syncRoot, context, handler, listener, TAG);
    }
    public DisplayAdapter(DisplayManagerService.SyncRoot syncRoot,
            Context context, Handler handler, Listener listener, String name) {
        mSyncRoot = syncRoot;
        mContext = context;
        mHandler = handler;
        mListener = listener;
        mName = name;
    }

回到registerDefaultDisplayAdapter()中继续看

    private void registerDisplayAdapterLocked(DisplayAdapter adapter) {
        mDisplayAdapters.add(adapter);
        adapter.registerLocked();
    }

这里就是调用的LocalDisplayAdapter的registerLocked()方法:

    public void registerLocked() {
        super.registerLocked();
        //1:创建了HotplugDisplayEventReceiver用于和native层接收事件,如hdmi的插拔
        mHotplugReceiver = new HotplugDisplayEventReceiver(getHandler().getLooper());

        for (int builtInDisplayId : BUILT_IN_DISPLAY_IDS_TO_SCAN) {
        //2:获取底层设备的基本信息,如分辨率 density等;
            tryConnectDisplayLocked(builtInDisplayId);
        }
    }

先看第一步的创建HotplugDisplayEventReceiver对象的流程

//HotplugDisplayEventReceiver继承DisplayEventReceiver对象,实现了onHotplug方法
private final class HotplugDisplayEventReceiver extends DisplayEventReceiver {
   
        public HotplugDisplayEventReceiver(Looper looper) {
            super(looper);
        }

        @Override
        public void onHotplug(long timestampNanos, int builtInDisplayId, boolean connected) {
            synchronized (getSyncRoot()) {
                if (connected) {
                    tryConnectDisplayLocked(builtInDisplayId);
                } else {
                    tryDisconnectDisplayLocked(builtInDisplayId);
                }
            }
        }
    }

所以在DisplayEventReceiver 中看它的构造方法

    public DisplayEventReceiver(Looper looper) {
        if (looper == null) {
            throw new IllegalArgumentException("looper must not be null");
        }

        mMessageQueue = looper.getQueue();
        //通过JNI来初始化
        mReceiverPtr = nativeInit(this, mMessageQueue);

        mCloseGuard.open("dispose");
    }

nativeInit是在android/view/DisplayEventReceiver.cpp中定义的:

static jlong nativeInit(JNIEnv* env, jclass clazz, jobject receiverObj,
        jobject messageQueueObj) {
        //获取messageQueue 
    sp<MessageQueue> messageQueue = android_os_MessageQueue_getMessageQueue(env, messageQueueObj);
    if (messageQueue == NULL) {
        jniThrowRuntimeException(env, "MessageQueue is not initialized.");
        return 0;
    }
    //创建NativeDisplayEventReceiver
    sp<NativeDisplayEventRece
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值