简述relayout是如何向SurfaceFlinger申请Surface ?
在 Android 系统中,relayout
方法的主要作用是重新布局界面视图,并在必要时向 SurfaceFlinger
申请 Surface
。这个过程涉及多个组件的协作,以下是relayout
申请 Surface
的主要步骤和流程:
relayoutWindow
方法
relayout
的核心实现位于 WindowManagerService
中的 relayoutWindow
方法。当窗口的布局或显示状态发生改变时,relayoutWindow
会被调用,以重新计算和布局界面元素的位置、大小等属性。这时,如果窗口还没有对应的 Surface
,则会向 SurfaceFlinger
申请新的 Surface
。
- 创建
SurfaceControl
relayoutWindow
方法会调用 SurfaceControl
来处理 Surface
的创建。SurfaceControl
是一个用于与 SurfaceFlinger
交互的类,它帮助应用程序管理与 Surface
相关的所有操作,包括创建、销毁和更新。
在调用 SurfaceControl
创建 Surface
时,会通过 Binder
进程间通信机制向 SurfaceFlinger
发送请求。SurfaceFlinger
会创建实际的显示缓冲区并返回一个引用给 SurfaceControl
,这样应用就可以在这个 Surface
上绘制内容了。
SurfaceFlinger
创建Surface
SurfaceFlinger
接收到 SurfaceControl
的请求后,会在图形处理层面上为该 Surface
分配资源,包括显示缓冲区等。SurfaceFlinger
是 Android 的图形合成管理服务,它会收集不同窗口和视图的绘制内容,将这些内容合成一帧并显示在屏幕上。
SurfaceFlinger
主要会根据 Surface
的属性(如大小、像素格式等)来决定如何分配显示缓冲区。缓冲区分配完成后,SurfaceFlinger
将返回一个标识符,标识该 Surface
在图形合成中的资源位置。
- 应用程序拿到
Surface
句柄
SurfaceFlinger
返回的 Surface
句柄通过 Binder
通信机制传回到 SurfaceControl
,再由 SurfaceControl
返回给应用程序。此时,应用程序可以通过该 Surface
句柄在屏幕上绘制内容。
- 渲染内容
应用程序持有 Surface
的句柄后,可以直接向这个 Surface
上进行绘制,比如通过 Canvas
或者 OpenGL 进行图形渲染。每次更新内容时,Surface
都会提交新的图形帧给 SurfaceFlinger
,由 SurfaceFlinger
来负责实际的屏幕合成显示。
实际应用场景
当用户操作导致界面布局发生变化(如旋转屏幕或切换全屏模式)时,系统会调用 relayout
方法进行重新布局。如果 Surface
不存在(比如首次启动 Activity
),那么 relayout
将向 SurfaceFlinger
请求一个新的 Surface
。这个过程确保界面元素的显示能够适应新的布局,同时节省资源。
总结
relayout
向 SurfaceFlinger
申请 Surface
的流程包含了 WindowManagerService
的重新布局逻辑、SurfaceControl
的创建请求、SurfaceFlinger
的缓冲区分配和资源管理等一系列步骤,最终确保应用可以正常渲染内容。