4:33 pm
Tuesday, 21 June 2022 (GMT+8)
Time in Guangzhou, Guangdong Province, China


概述

分析Android 10的WindowManagerService.continueSurfaceLayout()流程。

WindowManagerService.continueSurfaceLayout

WindowManagerService.continueSurfaceLayout流程

WMS.continueSurfaceLayout()首先完成窗口、Surface的位置计算和摆放,并当RootWindowContainer.isLayoutNeeded()requestTraversal()触发绘制流程。

RootWindowContainer.performSurfacePlacement

performSurfacePlacement流程

handleResizingWindows to WindowState流程

handleResizingWindows()主要是将mResizingWindows即大小改变的窗口回调resized()方法,计算新的merged configuration后,通过IWindow这个Binder发送到应用。其中,应用侧是ViewRootImpl管理这个Binder并执行对应的业务逻辑。最终会回调ViewRootImpl.dispatchResized()

  • IWindow是Framework调用ViewRootImpl时使用的(由ViewRootImpl.W实现)
  • IWindowSession是ViewRootImpl调用Framework services使用的Binder。

handleResizingWindows流程

ViewRootImpl.dispatchResized()流程

dispatchResized()主要流程是将Binder传递的信息通过Message发送到Handler。其中,当reportDraw为true时会发送不同的Message。这两个不同的Message的差异在于,reportDraw为false时会检查Message内带的信息是否与当前的有差异。如果没有差异会忽略本次dispatch resized,否则执行流程和reportDraw为true时一致。

可以这么认为,当信息没有更新时,MSG_RESIZED跳过后面的工作,而MSG_RESIZED_REPORT则一定会执行。其中,两个MSG对应的回调handle流程是一致的。

首先检查merged conf是否有更新并更新之。将新的Configuration通过sConfigCallback回调到ActivityThreadActivityThread执行handleConfigurationChanged()流程,回调Activity、Service、Provider等的onConfigurationChanged()

然后更新mWinFrames。接着按照条件触发report、layout等。

ViewRootImpl.dispatchResized流程

requestTraversal

最后如果满足条件还会再进行一次traversal。requestRraversal()实际上就是通过Handler向AnimationThread调度一次performSurfacePlacemtn()

总结

Surface Layout过程主要是摆放Surface、回调WindowState、通过Binder发送回到ViewRootImpl,并最终通过ActivityThread回调应用的onConfigurationChanged()。