【基础】1、App到SurfaceFlinger的连接【Android 12】

文章详细阐述了Android应用创建窗口时的流程,从ViewRootImpl.setView开始,经过WindowManagerService和Session的交互,最终通过SurfaceSession与SurfaceFlinger建立连接,详细解析了SurfaceComposerClient如何在Native层建立与SurfaceFlinger的通信通道。

在这里插入图片描述


不管是通过启动Activity的方式来创建App类型的窗口,还是通过主动调用WindowManager.addView的方式来创建非App类型的窗口,流程都是一样,最终都是通过ViewRootImpl与WMS通信来创建一个窗口。

从App进程创建第一个窗口开始,分析App是如何与SurfaceFlinger服务建立起连接的。

1 ViewRootImpl.setView

    /**
     * We have one child
     */
    public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView,
            int userId) {
   
   
        synchronized (this) {
   
   
            if (mView == null) {
   
   
				// ......
                try {
   
   
					// ......
                    res = mWindowSession.addToDisplayAsUser(mWindow, mWindowAttributes,
                            getHostVisibility(), mDisplay.getDisplayId(), userId,
                            mInsetsController.getRequestedVisibility(), inputChannel, mTempInsets,
                            mTempControls);
                    // ......
	}

这里调用mWindowSession.addToDisplayAsUser向WindowManager添加一个窗口。

ViewRootImpl的成员变量mWindowSession在ViewRootImpl创建的时候初始化,通过static类型的WindowManagerGlobal.getWindowSession方法得到:

    @UnsupportedAppUsage
    public static IWindowSession getWindowSession() {
   
   
        synchronized (WindowManagerGlobal.class) {
   
   
            if (sWindowSession == null) {
   
   
                try {
   
   
                    // Emulate the legacy behavior.  The global instance of InputMethodManager
                    // was instantiated here.
                    // TODO(b/116157766): Remove this hack after cleaning up @UnsupportedAppUsage
                    InputMethodManager.ensureDefaultInstanceForDefaultDisplayIfNecessary();
                    IWindowManager windowManager = getWindowManagerService();
                    sWindowSession = windowManager.openSession(
                            new IWindowSessionCallback.Stub(
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值