文章目录Android ViewRootImpl源码分析概述流程源码分析ActivityThread.handleResumeActivity()Activity.makeVisible()WindowManagerImpl.addView()WindowManagerGlobal.addView()ViewRootImpl.setView()ViewRootImpl.requestLayout()ViewRootImpl.scheduleTraversals()ViewRootImpl.doTraversal()ViewRootImpl.performTraversals()Android ViewRootImpl源码分析概述ViewRootImpl 是连接 View 层和 WindowManagerServcie(WMS) 的桥梁。作用负责管理整个 View 树的布局、测量、绘制流程负责与 WMS 通信完成窗口的添加、更新、移除调度 InputEventReceiver处理输入事件、焦点变化等。流程ActivityThread.handleLaunchActivity():Instrumentation.newActivity()Instrumentation.callActivityOnCreate()Activity.performCreate()Activity.onCreate()Activity.setContentView()ActivityThread.handleResumeActivity():ActivityThread.performResumeActivity():Activity.performResume()Instrumentation.callActivityOnResume()Activity.onResume()Activity.makeVisible():WindowManagerImpl.addView()WindowManagerGlobal.addView()创建ViewRootImpl实例并关联ViewRootImpl和DecorViewViewRootImpl.setView()ViewRootImpl.requestLayout()ViewRootImpl.scheduleTraversals()ViewRootImpl.doTraversal()ViewRootImpl.performTraversals()ViewRootImpl.performMeasure()测量流程ViewRootImpl.performLayout()布局流程ViewRootImpl.performDraw()绘制流程源码分析ActivityThread.handleResumeActivity()publicvoidhandleResumeActivity(ActivityClientRecordr,booleanfinalStateRequest,booleanisForward,booleanshouldSendCompatFakeFocus,Stringreason){// Activity的状态由可见转变为可见可交互// 依次调用ActivityThread.performResumeActivity() → Activity.performResume() → Instrumentation.callActivityOnResume() → Activity.onResume()if(!performResumeActivity(r,finalStateRequest,reason)){return;}// 调用Activity.makeVisible()r.activity.makeVisible();}Activity.makeVisible()voidmakeVisible(){if(!mWindowAdded){ViewManagerwmgetWindowManager();// 代理转发实际由WindowManagerImpl处理并传入DecorViewwm.addView(mDecor,getWindow().getAttributes());mWindowAddedtrue;}mDecor.setVisibility(View.VISIBLE);}WindowManagerImpl.addView()OverridepublicvoidaddView(NonNullViewview,NonNullViewGroup.LayoutParamsparams){applyTokens(params);// 调用WindowManagerGlobal.addView()mGlobal.addView(view,params,mContext.getDisplayNoVerify(),mParentWindow,mContext.getUserId());}WindowManagerGlobal.addView()publicvoidaddView(Viewview,ViewGroup.LayoutParamsparams,Displaydisplay,WindowparentWindow,intuserId){finalWindowManager.LayoutParamswparams(WindowManager.LayoutParams)params;ViewRootImplroot;ViewpanelParentViewnull;synchronized(mLock){// 创建ViewRootImple实例if(windowlessSessionnull){rootnewViewRootImpl(view.getContext(),display);}else{rootnewViewRootImpl(view.getContext(),display,windowlessSession,newWindowlessWindowLayout());}// DecorView设置布局参数view.setLayoutParams(wparams);// ViewRootImple关联DecorViewroot.setView(view,wparams,panelParentView,userId);}}ViewRootImpl.setView()publicvoidsetView(Viewview,WindowManager.LayoutParamsattrs,ViewpanelParentView,intuserId){synchronized(this){if(mViewnull){// 保存DecorViewmViewview;// 请求布局requestLayout();// 通过IBinder向WMS申请窗口和画布resmWindowSession.addToDisplayAsUser(mWindow,mWindowAttributes,getHostVisibility(),mDisplay.getDisplayId(),userId,mInsetsController.getRequestedVisibleTypes(),inputChannel,mTempInsets,mTempControls,attachedFrame,compatScale);// 绑定父子关系将DecorView的父容器设置为ViewRootImplview.assignParent(this);}}ViewRootImpl.requestLayout()OverridepublicvoidrequestLayout(){if(!mHandlingLayoutInLayoutRequest){checkThread();mLayoutRequestedtrue;// 调度遍历流程scheduleTraversals();}}ViewRootImpl.scheduleTraversals()voidscheduleTraversals(){if(!mTraversalScheduled){mTraversalScheduledtrue;mTraversalBarriermHandler.getLooper().getQueue().postSyncBarrier();// 插入同步屏障 最终调用doTraversal()mChoreographer.postCallback(Choreographer.CALLBACK_TRAVERSAL,mTraversalRunnable,null);notifyRendererOfFramePending();pokeDrawLockIfNeeded();}}finalTraversalRunnablemTraversalRunnablenewTraversalRunnable();finalclassTraversalRunnableimplementsRunnable{Overridepublicvoidrun(){doTraversal();}}ViewRootImpl.doTraversal()voiddoTraversal(){if(mTraversalScheduled){mTraversalScheduledfalse;mHandler.getLooper().getQueue().removeSyncBarrier(mTraversalBarrier);if(mProfile){Debug.startMethodTracing(ViewAncestor);}// 绘制流程performTraversals();}}ViewRootImpl.performTraversals()privatevoidperformTraversals(){// 测量阶段performMeasure(childWidthMeasureSpec,childHeightMeasureSpec);// 布局阶段performLayout(lp,mWidth,mHeight);// 绘制阶段performDraw(mActiveSurfaceSyncGroup)}
Android ViewRootImpl源码分析
发布时间:2026/5/21 5:46:06
文章目录Android ViewRootImpl源码分析概述流程源码分析ActivityThread.handleResumeActivity()Activity.makeVisible()WindowManagerImpl.addView()WindowManagerGlobal.addView()ViewRootImpl.setView()ViewRootImpl.requestLayout()ViewRootImpl.scheduleTraversals()ViewRootImpl.doTraversal()ViewRootImpl.performTraversals()Android ViewRootImpl源码分析概述ViewRootImpl 是连接 View 层和 WindowManagerServcie(WMS) 的桥梁。作用负责管理整个 View 树的布局、测量、绘制流程负责与 WMS 通信完成窗口的添加、更新、移除调度 InputEventReceiver处理输入事件、焦点变化等。流程ActivityThread.handleLaunchActivity():Instrumentation.newActivity()Instrumentation.callActivityOnCreate()Activity.performCreate()Activity.onCreate()Activity.setContentView()ActivityThread.handleResumeActivity():ActivityThread.performResumeActivity():Activity.performResume()Instrumentation.callActivityOnResume()Activity.onResume()Activity.makeVisible():WindowManagerImpl.addView()WindowManagerGlobal.addView()创建ViewRootImpl实例并关联ViewRootImpl和DecorViewViewRootImpl.setView()ViewRootImpl.requestLayout()ViewRootImpl.scheduleTraversals()ViewRootImpl.doTraversal()ViewRootImpl.performTraversals()ViewRootImpl.performMeasure()测量流程ViewRootImpl.performLayout()布局流程ViewRootImpl.performDraw()绘制流程源码分析ActivityThread.handleResumeActivity()publicvoidhandleResumeActivity(ActivityClientRecordr,booleanfinalStateRequest,booleanisForward,booleanshouldSendCompatFakeFocus,Stringreason){// Activity的状态由可见转变为可见可交互// 依次调用ActivityThread.performResumeActivity() → Activity.performResume() → Instrumentation.callActivityOnResume() → Activity.onResume()if(!performResumeActivity(r,finalStateRequest,reason)){return;}// 调用Activity.makeVisible()r.activity.makeVisible();}Activity.makeVisible()voidmakeVisible(){if(!mWindowAdded){ViewManagerwmgetWindowManager();// 代理转发实际由WindowManagerImpl处理并传入DecorViewwm.addView(mDecor,getWindow().getAttributes());mWindowAddedtrue;}mDecor.setVisibility(View.VISIBLE);}WindowManagerImpl.addView()OverridepublicvoidaddView(NonNullViewview,NonNullViewGroup.LayoutParamsparams){applyTokens(params);// 调用WindowManagerGlobal.addView()mGlobal.addView(view,params,mContext.getDisplayNoVerify(),mParentWindow,mContext.getUserId());}WindowManagerGlobal.addView()publicvoidaddView(Viewview,ViewGroup.LayoutParamsparams,Displaydisplay,WindowparentWindow,intuserId){finalWindowManager.LayoutParamswparams(WindowManager.LayoutParams)params;ViewRootImplroot;ViewpanelParentViewnull;synchronized(mLock){// 创建ViewRootImple实例if(windowlessSessionnull){rootnewViewRootImpl(view.getContext(),display);}else{rootnewViewRootImpl(view.getContext(),display,windowlessSession,newWindowlessWindowLayout());}// DecorView设置布局参数view.setLayoutParams(wparams);// ViewRootImple关联DecorViewroot.setView(view,wparams,panelParentView,userId);}}ViewRootImpl.setView()publicvoidsetView(Viewview,WindowManager.LayoutParamsattrs,ViewpanelParentView,intuserId){synchronized(this){if(mViewnull){// 保存DecorViewmViewview;// 请求布局requestLayout();// 通过IBinder向WMS申请窗口和画布resmWindowSession.addToDisplayAsUser(mWindow,mWindowAttributes,getHostVisibility(),mDisplay.getDisplayId(),userId,mInsetsController.getRequestedVisibleTypes(),inputChannel,mTempInsets,mTempControls,attachedFrame,compatScale);// 绑定父子关系将DecorView的父容器设置为ViewRootImplview.assignParent(this);}}ViewRootImpl.requestLayout()OverridepublicvoidrequestLayout(){if(!mHandlingLayoutInLayoutRequest){checkThread();mLayoutRequestedtrue;// 调度遍历流程scheduleTraversals();}}ViewRootImpl.scheduleTraversals()voidscheduleTraversals(){if(!mTraversalScheduled){mTraversalScheduledtrue;mTraversalBarriermHandler.getLooper().getQueue().postSyncBarrier();// 插入同步屏障 最终调用doTraversal()mChoreographer.postCallback(Choreographer.CALLBACK_TRAVERSAL,mTraversalRunnable,null);notifyRendererOfFramePending();pokeDrawLockIfNeeded();}}finalTraversalRunnablemTraversalRunnablenewTraversalRunnable();finalclassTraversalRunnableimplementsRunnable{Overridepublicvoidrun(){doTraversal();}}ViewRootImpl.doTraversal()voiddoTraversal(){if(mTraversalScheduled){mTraversalScheduledfalse;mHandler.getLooper().getQueue().removeSyncBarrier(mTraversalBarrier);if(mProfile){Debug.startMethodTracing(ViewAncestor);}// 绘制流程performTraversals();}}ViewRootImpl.performTraversals()privatevoidperformTraversals(){// 测量阶段performMeasure(childWidthMeasureSpec,childHeightMeasureSpec);// 布局阶段performLayout(lp,mWidth,mHeight);// 绘制阶段performDraw(mActiveSurfaceSyncGroup)}