1Surface系统的“任督二脉”是什么?
(1)任脉:应用程序和Surface的关系。
(2)督脉:Surface和SurfaceFlinger之间的关系。

2Window与View关系

3一个Activity中的UI组件

4Surface和SF、ViewRoot有什么关系呢?

5ViewRoot和WMS之间的关系?

6Activity总结
(1)Activity的顶层View是DecorView,而我们在onCreate函数中通过setContentView设置的View只不过是这个DecorView中的一部分罢了。DecorView是一个FrameLayout类型的ViewGroup。
(2)Activity和UI有关,它包含一个Window(真实类型是PhoneWindow)和一个WindowManager(真实类型是LocalWindowManager)对象。这两个对象将控制整个Activity的显示。
(3) LocalWindowManager使用了WindowManagerImpl做为最终的处理对象(Proxy模式),这个WindowManagerImpl中有一个ViewRoot对象。
(4)ViewRoot实现了ViewParent接口,它有两个重要的成员变量,一个是mView,它指向Activity顶层UI单元的DecorView,另外有一个mSurface,这个Surface包含了一个Canvas(画布)。除此之外,ViewRoot还通过Binder系统和WindowManagerService进行了跨进程交互。
(5)ViewRoot能处理Handler的消息,Activity的显示就是由ViewRoot在它的performTraversals函数中完成的。
(6)整个Activity的绘图流程就是从mSurface中lock一块Canvas,然后交给mView去自由发挥画画的才能,最后unlockCanvasAndPost释放这块Canvas。
7 复杂的Surface创建流程

8乾坤大挪移的真面目

9Canvas是什么?
(1)Bitmap:用于存储像素,也就是画布。可把它当做一块数据存储区域。
(2)Canvas:用于记载画图的动作,比如画一个圆,画一个矩形等。Canvas类提供了这些基本的绘图函数。
(3)Drawing primitive:绘图基元,例如矩形、圆、弧线、文本、图片等。
(4)Paint:它用来描述绘画时使用的颜色、风格(如实线、虚线等)等。
10Surface的精简流程图

11Layer家族

说明:
(1)LayerBaseClient从LayerBase类派生。
(2)LayerBaseClient还有四个派生类,分别是Layer、LayerBuffer、LayerDim和LayerBlur。
(3)LayerBaseClient定义了一个内部类Surface,这个Surface从ISurface类派生,它支持Binder通信。
(4)针对不同的类型,Layer和LayerBuffer分别有一个内部类SurfaceLayer和SurfaceLayerBuffer,它们继承了LayerBaseClient的Surface类。所以对于Normal类型的显示层来说,getSurface返回的ISurface对象的真正类型是SurfaceLayer。
(5)LayerDim和LayerBlur类没有定义自己的内部类,所以对于这两种类型的显示层来说,它们直接使用了LayerBaseClient的Surface。
(6)ISurface接口提供了非常简单的函数,如requestBuffer、postBuffer等。
12SurfaceControl创建后的结果图

13Native Surface的示意图

说明:
(1)ShardBuffer家族依托共享内存结构SharedClient与它共同组成了Surface系统生产/消费协调的中枢控制机构,它在SF端的代表是SharedBufferServer,在Activity端的代表是SharedBufferClient。
(2)Native的Surface将和SF中的SurfaceLayer建立Binder联系。
14SharedBuffer家族介绍

15lockCanvas和unlockCanvasAndPost流程总结

16GraphicBufferAllocator内存的分配途径

17SurfaceFlinger的总结

18SharedBuffer家族使用流程

19ViewRoot和View类的关系是什么?
ViewRoot是View视图体系的根。每一个Window(注意是Window,比如PhoneWindow)有一个ViewRoot,它的作用是处理layout和View视图体系的绘制。那么视图体系又是什么呢?它包括Views和ViewGroups,也就是SDK中能看到的View类都属于视图体系。根据前面的分析可知,这些View是需要通过draw画出来的。而ViewRoot就是用来draw它们的,ViewRoot本身没有draw/onDraw函数。
20ViewRoot和它所控制的View及其子View使用同一个Canvas吗?
这个问题的答案就很简单了,我们在ViewRoot的performTraversals中见过。ViewRoot提供Canvas给它所控制的View,所以它们使用同一个Canvas。但Canvas使用的内存却不是固定的,而是通过Surface的lockCanvas得到的。
21View、Surface和Canvas之间的关系是怎样的?我认为,每一个view将和一个canvas,以及一个surface绑定到一起(这里的“我”表示提问人)。
这个问题的答案也很简单。一个Window将和一个Surface绑定在一起,绘制前ViewRoot会从Surface中lock出一个Canvas。
22Canvas有一个bitmap,那么绘制UI时,数据是画在Canvas的这个bitmap中吗?
答案是肯定的,bitmap实际上包括了一块内存,绘制的数据最终都在这块内存上。
23同一个ViewRoot下,不同类型的View(不同类型指不同的UI单元,例如按钮、文本框等)使用同一个Surface吗?
是的,但是SurfaceView要除外。因为SurfaceView的绘制一般在单独的线程上,并且由应用层主动调用lockCanvas、draw和unlockCanvasAndPost来完成绘制流程。应用层相当于抛开了ViewRoot的控制,直接和屏幕打交道,这在camera、video方面用得最多。
333