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()
2.2 Window更新过程时scheduleTraversals()
updateViewLayout
更新过程通过WindowManagerImpl、WindowManagerGlobal、ViewRootImpl
层层调用,最终调用doTraversal/performTraversals
方法relayoutWindow
通过IWindowSession.aidl#relayout
来让 wms 向 SurfaceFlinger 申请画板Layer。(这里需要View为viewVisibility == View.VISIBLE
)(frameworks/base/services/core/java/com/android/server/wm/Session.java
)mChoreographer.postCallback(Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null)
用于接收显示信号Vsync
,下一帧渲染执行mTraversalRunnable
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
2.3 Surface初始化申请
mSurface = new Surface()
初始时一个空壳,直到updateViewLayout
更新时mSurface.copyFrom(mSurfaceControl)
赋值
Surface.java / SurfaceControl.java ⇒ android_view_Surface.cpp / android_view_SurfaceControl.cpp
通过JNI
方式调用创建底层C++本地实现,其中client = SurfaceComposerClient::getDefault()
是熟悉的SurfaceFlinger
派生的“代表”SurfaceComposerClient
2.4 简易时序图
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