基于Android7.1源码和相关资料画了APP UI绘制显示的大致框架。
涉及安卓系统全栈内容:
- APP层
- framework层(WMS)
- native层(SurfaceFlinger)
- HAL层(hwcomposer/gralloc)
包括了如下概念:
- 进程通信组建:binder/Ashmem,作为模块之间沟通的桥梁,如果不清楚这两个实现机制,很难明白UI渲染如何从APP层发起请求经过多个模块传递最终发送到显示设备显示。
- 图形学相关概念:Surface/Layer/Gralloc/HWComposer/Vsync/FrameBuffer以及Canvas/Paint/Bitmap。对于APP开发者,大多只了解Canvas/Paint/Bitmap,这三个概念可以理解是对底层显示机制的上层抽象,如果想弄清楚绘制的底层实现,需要进一步学习Surface/Layer/Gralloc/HWComposer/Vsync/FrameBuffer这几个概念。
- 渲染引擎:Skia/OpenGL。在了解了Surface等概念之后,需要明白如何将Surface按照设定的Layer层次渲染到显示设备,这时就需要用到渲染引擎。
主要相关代码地址:
app端:http://androidxref.com/7.1.2_r36/xref/frameworks/base/core/java/android/view/ViewRootImpl.java
wms端:http://androidxref.com/7.1.2_r36/xref/frameworks/base/services/WindowManagerService.java
native端:http://androidxref.com/7.1.2_r36/xref/frameworks/native/services/surfaceflinger/
hal端:http://androidxref.com/7.1.1_r6/xref/hardware/libhardware/modules/hwcomposer/hwcomposer.cpp
Surface系统涉及的知识栈实在是太过庞大,且从Android2.3/4.1直到目前9.0版本一直在迭代变化,如果想彻底弄明白整套机制,除了了解上面描述的各类知识点,还需要梳理清晰各个模块之间的交互脉络。
- APP和WMS是如何通信的?
- WMS和SF是如何通信的?
- APP和SF是如何通信的?
- Surface是如何创建的?
- Skia和OpenGL分别是什么场景使用的?
- Surface/Layer/Canvas分别是什么意思?
- Vsync是什么意思?
- Gralloc是用来做什么的?
- HWComposer主要做什么?
保持冷静,带着问题,阅读源码。