Android中使用OpenGL以及 Skia Vulkan来进行跨平台的绘制. 通过客户端进程、SystemServer、SurfaceFlinger三个进程的配合来完成Android系统上的绘制工作.
完成显示相关的设备驱动的初始化 :
init.rc
中会启动SystemServer
system_server
进程中初始化WindowManagerService
, 以及启动SurfaceFlinger
进程 ,SurfaceFlinger
中初始化Gralloc
以及FrameBuffer
设备驱动在窗口(如Activity
、Dialog
、PopupWindow
、悬浮窗等)需要被显示到屏幕上时 :
PhoneWindow
, 并且创建空的Surface
(后面会将Surface
进行填充)Session
通知WindowManagerService
创建WindowState
代表窗口WindowState
窗口添加到列表中WindowManagerService
与SurfaceFlinger
之间的桥梁SurfaceComposerClient
.在进程收到Vsync
信号之后 :
WindowManagerService
申请填充Surface
WindowManagerService
会向SurfaceFlinger
创建Layer
(其中包括BufferQueue
、IGraphicBufferConsumer
、IGraphicBufferProducer
)以及对应的内存空间Layer
添加到Z-Order
排序的列表中Layer
信息返回给WindowManagerService
WindowManagerService
将该信息返回给窗口端的Surface
在Surface
填充完后 , 开始绘制工作 :
performTravels
开始在Surface上进行绘制lockCanvas
来通过IGraphicBufferProducer.dequeueBuffer
来申请用来绘制的GraphicBuffer
,unlockAndPostCanvas
调用IGraphicBufferProducer.queueBuffer
来向SurfaceFlinger的消费者发送Buffer在SurfaceFlinger端 :
FrameBuffer
驱动的方法fb_memset
将内存复制到驱动空间image.png
绘制相关的核心类主要包括三个进程中的类 .
ActivityThread
: 通过ApplicationThread
接收AMS的消息 , 回调Activity
生命周期
ViewRootImpl
: 管理IWindowSession
以及RootView
IWindowSession
: 负责与WMS通信 , 并且通过AIDL填充Surface
PhoneWindow
: 负责Activity的DecorView
的inflate操作
WindowManagerService
: 负责将Activity与Window进行绑定 , 管理所有窗口
WindowState
: 每一个WindowState代表一个客户端窗口 , 并且保存与客户端窗口通信的IBinder
Session
: 用于保持与客户端的IBinder连接
SurfaceSession
: SurfaceComposerClient
的Java层代理
SurfaceComposerClient
: SurfaceFlinger与Client在WMS中的代理
ComposerService
: SurfaceFlinger在ServiceManager中注册的Service
WindowStateAnimator
: 负责Window的动画
IGraphicBufferProducer
: SurfaceFlinger中BufferQueueProducer的代理对象
SurfaceFlinger
: 负责与WMS进行
Client
: 每个窗口都会对应一个Client
Layer
: 每一个窗口对应的Layer
BufferQueue
: 绘制缓冲队列 , 向每个Surface提供绘制的Buffer
BufferQueueProducer
: 绘制缓冲队列的生产者 , SurfaceFlinger提供给客户进程
BufferQueueConsumer
: 绘制缓冲队列的消费者 , 用于接收客户端发送的Buffer