Android 12 ViewRootImpl以及图形绘制简介
1 Window ViewRootImpl Activity的关系
2 Window和ViewRootImpl有什么关系?
看右侧流程图,上层的UI大体分成两大类,一是Activity,另一类是Custom Window(如状态栏、toast等)。
但是他们都要经过WindowManager.addView
这个接口添加到系统中。
经过WindowManagerGlobal,会new一个ViewRootImpl,ViewRootImpl会申请server端的Session执行addWindow。
ViewRootImpl可以理解成是对应这个Window的View的根。
3 ViewRootImpl做了什么
new ViewRootImpl后,随后就会调用setView()
方法,我这里梳理了三个重要代码:
- 保存view对象。它会作为很多操作的基础,比如随后的
requestLayout方法
,作为绘制的对象 - 实际调用WindowSession,向系统请求将View/Window添加到系统中
- 初始化Input通道,使InputFlinger的事件可以分发给View
4 Activity是什么角色?
和本篇博客相关的:
- 从UI的角度,Activity中的Window和DecorView负责显示和交互。
- 从事件传递角度,app端的Input事件的源头在ViewRootImpl,传递过程如图右下角。
5 Vsync信号的传递和绘制
-
ViewRootImpl会向Choreographer注册回调,等待下一个绘制的时机
-
Choreographer通过libgui的接口,最终会向SurfaceFlinger注册监听Vsync信号
-
接收到Vsync信号后,回调Choreographer的doFrame
-
doFrame触发Input、动画、绘制等操作,ViewRootImpl负责处理绘制
-
ViewRootImpl触发View树的measure layout draw等
-
View的绘制操作都会交给Canvas对象,(2D情况)最终会交给skia的图形绘制引擎