layer、Surface、SurfaceControl的创建

6 阅读2分钟

app的SurfaceControl创建过程

sequenceDiagram
ViewrootImpl-->>WindowSession(aidl接口): relayoutwindow(mSurfaceControl)
WindowSession(aidl接口)-->>Session: relayout()这个方法实现在WMS进程
Session-->>WMS: relayout()
WMS-->>WindowStateAnimator: relayoutWindow()在WMS进程创建 (1)创建SC(2)创建BBQ(3)创建Surface
WindowStateAnimator-->>SurfaceControl.java: createSurfaceLocked()
SurfaceControl.java-->>android_view_SurfaceControl.cpp: SurfaceControl()构造函数内发起JNI调用
android_view_SurfaceControl.cpp-->>SurfaceComposerClient.cpp(gui): nativeCreate()

SurfaceComposerClient.cpp(gui)-->>SurfaceComposerClient.cpp(gui): createSurfaceChecked()(1):创建SC
SurfaceComposerClient.cpp(gui)-->>SF.cpp: createSurface() ipc调用到SF进程,创建layer
SF.cpp-)SurfaceComposerClient.cpp(gui): 返回layerhandle(layer的bbinder句柄)
SurfaceComposerClient.cpp(gui)-->>SurfaceControl.cpp: make(layerhandle,layerId) 创建c++层SurfaceControl对象
SurfaceControl.cpp-)SurfaceComposerClient.cpp(gui): 返回创建的SurfaceControl对象
SurfaceComposerClient.cpp(gui)-)android_view_SurfaceControl.cpp: 返回创建的SurfaceControl对象
android_view_SurfaceControl.cpp-)SurfaceControl.java: 把c++层创建的sc对象地址,存到Java层的sc对象里,
SurfaceControl.java-)ViewrootImpl: 在wms创建的sc对象,拷贝给ViewRootImpl创建mSurfaceControl对象

  1. app在收到Vysn信号后,开始执行与Activity一一对应的ViewRootImpl的performTraversals方法,performTraversals先调用relayoutWindow方法
  2. relayoutWIndow方法内部通过Windowsession(adil接口),它接口的实现在WMS进程里的session中,所以就跨进程进入到WMS中,执行WMS的relayoutWindow方法,ViewRootImpl在Activity调用resume方法时创建,在ViewRootImpl会new SurfaceControl,是个空的,此过程中会把VIewRootImpl创建的SurfaceControl,作为参数传入到WMS中,
  3. 在WMS进程中,WMS的relayoutWindow方法会依次创建 SurfaceControl、BBQ、Surface,这里我们只看SurfaceControl的创建
  4. 接下来调用SurfaceControl的构造函数创建SurfaceControl对象,同时copy到ViewRootImpl传过来的SurfaceControl。
  5. 在SurfaceControl的的构造函数函数中,发起JNI调用,调用到SurfaceComposeClient中,在SurfaceComposeClient中依次做两件事,第一件事做IPC调用,调用到SF中,在SF中会创建layer,SF把创建的Layer存到集合中,同时主要Layer的handle(bbinder)返回给SurfaceComposeClient,第二件事创建c++层SurfaceControl对象,将layerHandle以及layerId作为SurfaceControl的构造参数传入到SurfaceControl对象中保存。
  6. 最后将c++层创建的SurfaceControl对象的地址存放到了VIewRootimpl的java层的SurfaceControl对象里。

Layer的创建

  1. 在SurfaceControl的创建过程中,SurfaceComposeClient发起IPC调用到服务端SF中,在SF中会创建Layer,SF进程将创建的layer存放到集合里,然后将LayerHandle返回给SurfaceComposeClient,用于创建SurfaceControl对象。

Surface的创建

sequenceDiagram

WMS->>BlastBufferQueue: updateBlastSurfaceIfNeeded()

BlastBufferQueue-->>BlastBufferQueue: createSurface(SurfaceControl)
BlastBufferQueue-->>android_graphics_BLASTBufferQueue.cpp: nativeGetSurface(SurfaceControl) JNI调用
android_graphics_BLASTBufferQueue.cpp-->>BLASTBufferQueue.cpp: getSurface(SurfaceControl)
BLASTBufferQueue.cpp-->>BBQSurface: make(layerhandle)创建BBQSurface,将LayerHandle和producer存到BBQSurface
BBQSurface.cpp-)BLASTBufferQueue.cpp: 返回BBQSurface对象
BLASTBufferQueue.cpp-)android_graphics_BLASTBufferQueue.cpp:返回BBQSurface对象
android_graphics_BLASTBufferQueue.cpp-)WMS: 返回给wms的BBQSurface地址,然后将地址存到ViewRootImpl传过来的Surface
  1. 在Activity执行resume方法创建ViewRootImpl对象是,在ViewRootImpl内部只初始时一个Surface

  2. 在ViewRootImpl在调用relayoutWindow->Session->WMS的过程中,会将Surface传给WMS进程中

  3. 在WMS的relayoutwindow方法中,创建完SurfaceControl后,会调用updateBlastSurfaceIfNeeded方法,在这个方法中会创建BBQ,BLASTBufferQueue 由Producer、Comsumer、BufferQueueCore三部分组成,然后BBQ创建BBQSurface,并且将SurfaceControl的layerHandle和BBQ的Producer存到BBQSurface中,最后将BBQSurface存到了VIewRootImpl的Surface中。