Android Q 图形系统探秘:从 ViewRootImpl 到 SurfaceFlinger,一次完整的 Surface 创建之旅

张开发
2026/4/20 9:48:36 15 分钟阅读

分享文章

Android Q 图形系统探秘:从 ViewRootImpl 到 SurfaceFlinger,一次完整的 Surface 创建之旅
Android Q 图形系统深度解析从应用层到显示合成的完整链路当我们在Android应用中调用setContentView()时系统究竟经历了怎样的旅程才能将UI元素呈现在屏幕上本文将带您穿越应用进程、WindowManagerService和SurfaceFlinger三大核心模块揭示图形系统背后的完整协作机制。1. 图形系统架构概览Android图形系统采用分层设计架构主要包含三个关键角色应用进程负责视图树的构建、测量、布局和绘制WindowManagerService(WMS)作为窗口管理者协调各个应用的窗口状态SurfaceFlinger系统级服务负责所有图层的合成与显示这三者通过Binder IPC机制进行跨进程通信共同完成从视图到像素的转换过程。理解它们之间的协作关系是掌握Android图形系统的关键。2. 应用进程的准备工作当Activity调用setContentView()时系统会创建DecorView作为根视图并通过PhoneWindow管理窗口属性。但真正触发图形管道建立的时刻是ViewRootImpl的创建和初始化。2.1 ViewRootImpl的创建流程ViewRootImpl作为连接应用视图系统与WMS的桥梁在窗口添加视图时被创建// WindowManagerGlobal.java public void addView(View view, ViewGroup.LayoutParams params) { ViewRootImpl root new ViewRootImpl(view.getContext(), display); root.setView(view, wparams, panelParentView); }ViewRootImpl初始化时会创建两个关键对象// ViewRootImpl.java final Surface mSurface new Surface(); final SurfaceControl mSurfaceControl new SurfaceControl();此时这两个对象仅是空壳真正的初始化发生在后续的relayout过程中。2.2 触发relayoutWindow当调用ViewRootImpl.setView()时会触发requestLayout()最终在performTraversals()中调用关键方法private void performTraversals() { // 测量、布局、绘制等操作 relayoutWindow(params, viewVisibility, insetsPending); }relayoutWindow通过Binder调用WMS的relayout方法这是跨进程协作的开始int relayoutResult mWindowSession.relayout( mWindow, mSeq, params, (int)(mView.getMeasuredWidth() * appScale 0.5f), (int)(mView.getMeasuredHeight() * appScale 0.5f), viewVisibility, insetsPending ? WindowManagerGlobal.RELAYOUT_INSETS_PENDING : 0, frameNumber, mTmpFrame, mPendingOverscanInsets, mPendingContentInsets, mPendingVisibleInsets, mPendingStableInsets, mPendingOutsets, mPendingBackDropFrame, mPendingDisplayCutout, mPendingMergedConfiguration, mSurfaceControl, mTempInsets);特别需要注意的是mSurfaceControl参数被标记为out类型意味着它将在WMS端被实际初始化。3. WMS端的Surface创建WMS接收到relayout请求后会通过以下流程创建Surface3.1 WindowSurfaceController的创建WMS首先创建WindowSurfaceController// WindowStateAnimator.java WindowSurfaceController createSurfaceLocked(int windowType, int ownerUid) { mSurfaceController new WindowSurfaceController( mSession.mSurfaceSession, attrs.getTitle().toString(), width, height, format, flags, this, windowType, ownerUid); return mSurfaceController; }WindowSurfaceController内部使用Builder模式创建SurfaceControl// WindowSurfaceController构造方法 final SurfaceControl.Builder b win.makeSurface() .setParent(win.getSurfaceControl()) .setName(name) .setBufferSize(w, h) .setFormat(format) .setFlags(flags) .setMetadata(METADATA_WINDOW_TYPE, windowType) .setMetadata(METADATA_OWNER_UID, ownerUid); mSurfaceControl b.build();3.2 原生层SurfaceControl的创建Builder.build()最终调用SurfaceControl的构造方法// SurfaceControl.java private SurfaceControl(SurfaceSession session, String name, int w, int h, int format, int flags, SurfaceControl parent, SparseIntArray metadata) { mNativeObject nativeCreate(session, name, w, h, format, flags, parent ! null ? parent.mNativeObject : 0, metaParcel); }nativeCreate方法通过JNI进入原生层static jlong nativeCreate(JNIEnv* env, jclass clazz, jobject sessionObj, jstring nameStr, jint w, jint h, jint format, jint flags, jlong parentObject, jobject metadataParcel) { spSurfaceComposerClient client; if (sessionObj ! NULL) { client android_view_SurfaceSession_getClient(env, sessionObj); } else { client SurfaceComposerClient::getDefault(); } SurfaceControl *parent reinterpret_castSurfaceControl*(parentObject); spSurfaceControl surface; status_t err client-createSurfaceChecked( String8(name.c_str()), w, h, format, surface, flags, parent, std::move(metadata)); return reinterpret_castjlong(surface.get()); }4. SurfaceFlinger的图层管理SurfaceComposerClient通过Binder调用SurfaceFlinger服务创建实际图层4.1 创建BufferQueueLayerSurfaceFlinger根据标志位创建不同类型的图层status_t SurfaceFlinger::createLayer(const String8 name, const spClient client, uint32_t w, uint32_t h, PixelFormat format, uint32_t flags, LayerMetadata metadata, spIBinder* handle, spIGraphicBufferProducer* gbp, const spIBinder parentHandle) { switch (flags ISurfaceComposerClient::eFXSurfaceMask) { case ISurfaceComposerClient::eFXSurfaceBufferQueue: result createBufferQueueLayer(client, uniqueName, w, h, flags, std::move(metadata), format, handle, gbp, layer); break; // 其他类型处理... } return result; }对于普通应用窗口会创建BufferQueueLayerstatus_t SurfaceFlinger::createBufferQueueLayer(...) { spBufferQueueLayer layer getFactory().createBufferQueueLayer( LayerCreationArgs(this, client, name, w, h, flags, std::move(metadata))); *handle layer-getHandle(); *gbp layer-getProducer(); *outLayer layer; return NO_ERROR; }4.2 初始化生产者-消费者模型BufferQueueLayer在首次引用时初始化BufferQueuevoid BufferQueueLayer::onFirstRef() { spIGraphicBufferProducer producer; spIGraphicBufferConsumer consumer; BufferQueue::createBufferQueue(producer, consumer, true); mProducer new MonitoredProducer(producer, mFlinger, this); mConsumer new BufferLayerConsumer(consumer, mFlinger-getRenderEngine(), mTextureName, this); mConsumer-setConsumerUsageBits(getEffectiveUsage(0)); mConsumer-setContentsChangedListener(this); mConsumer-setName(mName); if (!mFlinger-isLayerTripleBufferingDisabled()) { mProducer-setMaxDequeuedBufferCount(2); } }这一步骤建立了图形缓冲区的生产者-消费者模型为后续的图形数据传输奠定了基础。5. Surface的最终创建当WMS完成SurfaceControl的初始化后应用进程通过copyFrom方法完成Surface的创建5.1 SurfaceControl的回传WMS通过以下方式将初始化后的SurfaceControl回传给应用进程// WindowSurfaceController.java void getSurfaceControl(SurfaceControl outSurfaceControl) { outSurfaceControl.copyFrom(mSurfaceControl); }copyFrom方法会深拷贝native层的SurfaceControl对象// SurfaceControl.java public void copyFrom(SurfaceControl other) { assignNativeObject(nativeCopyFromSurfaceControl(other.mNativeObject)); }5.2 Surface的初始化应用进程检查SurfaceControl有效性后创建Surface// ViewRootImpl.java if (mSurfaceControl.isValid()) { mSurface.copyFrom(mSurfaceControl); } else { destroySurface(); }Surface.copyFrom最终调用native方法static jlong nativeGetFromSurfaceControl(JNIEnv* env, jclass clazz, jlong nativeObject, jlong surfaceControlNativeObj) { spSurfaceControl ctrl(reinterpret_castSurfaceControl*(surfaceControlNativeObj)); spSurface surface(ctrl-getSurface()); return reinterpret_castjlong(surface.get()); }SurfaceControl::getSurface会创建实际的Surface对象spSurface SurfaceControl::getSurface() const { if (mSurfaceData nullptr) { return generateSurfaceLocked(); } return mSurfaceData; } spSurface SurfaceControl::generateSurfaceLocked() const { mSurfaceData new Surface(mGraphicBufferProducer, false); return mSurfaceData; }至此从应用层到SurfaceFlinger的完整Surface创建链路已经完成为后续的图形渲染和显示奠定了基础。

更多文章