WindowManager中Surface申请流程

WindowManager中Surface申请流程

  • 1、SurfaceFlinger 和 WindowManager
  • 2、WindowManager中Surface申请流程
    • 2.1 WMS侧添加界面时scheduleTraversals()
    • 2.2 Window更新过程时scheduleTraversals()
    • 2.3 Surface初始化申请
    • 2.4 简易时序图
  • 3、对应画布Layer创建
    • 3.1 简易时序图

android12-release


1、SurfaceFlinger 和 WindowManager

WMS 概述 – “窗口管理员” 了解一下大致印象

SurfaceFlinger 接受缓冲区,对它们进行合成,然后发送到屏幕。WindowManager 为 SurfaceFlinger 提供缓冲区和窗口元数据,而 SurfaceFlinger 可使用这些信息将 Surface 合成到屏幕

WindowManager 会控制 window 对象,它们是用于容纳 view 对象的容器。window 对象始终由 surface 对象提供支持。WindowManager 会监督生命周期、输入和聚焦事件、屏幕方向、转换、动画、位置、变形、Z 轴顺序以及窗口的许多其他方面。WindowManager 会将所有窗口元数据发送到 SurfaceFlinger,以便 SurfaceFlinger 可以使用这些数据在屏幕上合成 Surface。

WMS "窗口"都必须向 SurfaceFlinger 申请相应的 Layer 得到图形的缓冲的使用权。(注意这里Surface是Java层的,要区别于OpenGL ES的本地窗口Surface。)

2、WindowManager中Surface申请流程

2.1 WMS侧添加界面时scheduleTraversals()

WMS侧添加界面

WindowManagerImpl.java#addView -> WindowManagerGlobal.java#addView -> ViewRootImpl.java#setView -> Session extends IWindowSession.Stub#addToDisplayAsUser -> WindowManagerService.java#addWindow 流程中ViewRootImpl.java#setView时会执行到scheduleTraversals() 做一次 doTraversal() -> performTraversals()

WindowManager中Surface申请流程_第1张图片

2.2 Window更新过程时scheduleTraversals()

  1. updateViewLayout 更新过程通过WindowManagerImpl、WindowManagerGlobal、ViewRootImpl层层调用,最终调用doTraversal/performTraversals 方法
  2. relayoutWindow 通过IWindowSession.aidl#relayout来让 wms 向 SurfaceFlinger 申请画板Layer。(这里需要View为viewVisibility == View.VISIBLE)(frameworks/base/services/core/java/com/android/server/wm/Session.java)
  3. mChoreographer.postCallback(Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null) 用于接收显示信号Vsync,下一帧渲染执行mTraversalRunnable
  4. performMeasure/performLayout/performDraw最终分别调用到内部view的measure/layout/draw。(这里应用自定义View注意的地方)

这里Activity窗口onResume执行makeVisible()可见之后查看 ActivityThread.java#handleResumeActivity -> WindowManagerImpl.java#updateViewLayout -> WindowManagerGlobal.java#updateViewLayout -> ViewRootImpl.java#setLayoutParams -> ViewRootImpl.java#scheduleTraversals -> Choreographer.java#postCallback/ViewRootImpl.java#mTraversalRunnable -> ViewRootImpl.java#doTraversal -> ViewRootImpl.java#performTraversals -> ViewRootImpl.java#performMeasure/performLayout/performDraw
WindowManager中Surface申请流程_第2张图片WindowManager中Surface申请流程_第3张图片

2.3 Surface初始化申请

  1. mSurface = new Surface()初始时一个空壳,直到 updateViewLayout 更新时 mSurface.copyFrom(mSurfaceControl) 赋值
    WindowManager中Surface申请流程_第4张图片
  2. Surface.java / SurfaceControl.java ⇒ android_view_Surface.cpp / android_view_SurfaceControl.cpp 通过JNI方式调用创建底层C++本地实现,其中client = SurfaceComposerClient::getDefault() 是熟悉的 SurfaceFlinger 派生的“代表” SurfaceComposerClient

2.4 简易时序图

WindowManager中Surface申请流程_第5张图片

3、对应画布Layer创建

SurfaceComposerClient和SurfaceFlinger通过Bn/Bp端Client Binder连接调用,创建Layer
frameworks/base/core/jni/android_view_SurfaceControl.cpp
frameworks/native/libs/gui/SurfaceComposerClient.cpp
frameworks/native/libs/gui/ISurfaceComposerClient.cpp
frameworks/native/services/surfaceflinger/Client.cpp
frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
WindowManager中Surface申请流程_第6张图片

3.1 简易时序图

你可能感兴趣的:(Android,#,图形界面,WMS,Android)