每一个在C++层实现的应用程序窗口都需要有一个绘图表面,然后才可以将自己的UI表现出来。这个绘图表面是需要由应用程序进程请求SurfaceFlinger服务来创建的,在SurfaceFlinger服务内部使用一个Layer对象来描述。 对于在Java层实现的Android应用程序窗口来说,它也需要请求SurfaceFlinger服务为它创建绘图表面,这个绘图表面使用一个Surface对象来描述。在Java层实现的Android应用程序窗口的绘图表面是通过两个Surface对象来描述,一个是在应用程序进程这一侧创建的,另一个是在WindowManagerService服务这一侧创建的,它们对应于SurfaceFlinger服务这一侧的同一个Layer对象。在应用程序进程这一侧,每一个应用程序窗口,即每一个Activity组件,都有一个关联的Surface对象,这个Surface对象是保在在一个关联的ViewRoot对象的成员变量mSurface中的。
在应用程序进程这一侧,每一个Java层的Surface对都对应有一个C++层的Surface对象,并且后者的地址值保存在前者的成员变量mNativeSurface中。
在WindowManagerService服务这一侧,每一个应用程序窗口,即每一个Activity组件,都有一个对应的WindowState对象,这个WindowState对象的成员变量mSurface同样是指向了一个Surface对象。
在WindowManagerService服务这一侧,每一个Java层的Surface对都对应有一个C++层的SurfaceControl对象,并且后者的地址值保存在前者的成员变量mSurfaceControl中
ActivityThread.handleLaunchActivity()
↓
ActivityThread.handleResumeActivity()
↓
WindowManagerImpl.addView()
↓
WindowManagerGlobal.addView()
↓
ViewRootImpl.setView()
↓
ViewRootImpl.requestLayout()
↓
ViewRootImpl.scheduleTraversals
↓
ViewRootImpl.doTraversal()
↓
ViewRootImpl.performTraversals()
↓
ViewRootImpl.relayoutWindow()
↓
Session.relayout()
↓
WindowManagerService.relayoutWindow()
↓
WindowStateAnimator.createSurfaceLocked()
↓
new SurfaceControl()
↓
android_view_SurfaceControl.nativeCreate()
↓
sp<SurfaceComposerClient> client(android_view_SurfaceSession_getClient(env, sessionObj)) //这个client 其实就是在创建WindowState对象过程中,创建的SurfaceComposerClient,这里只是把它找到,用来创建下面的surface。(Java层的SurfaceSession对象有一个成员变量mClient,它指向了在C++层中的一个SurfaceComposerClient对象,C++层的SurfaceComposerClient对象可以用来请求SurfaceFlinger服务为应用程序窗口创建绘图表面,即创建一个Layer对象)
sp<SurfaceControl> surface = client->createSurface()
↓
至此,这个Surface 会保存在ViewRootImpl 的 mSurface 变量中