Android系统的绘制原理
绘制任务由应用发起,最终通过系统层绘制到硬件屏幕上,也就是说应用进程绘制后,通过跨进程通信机制把需要显示的数据传到系统层,由系统层中的SurfaceFlinger服务绘制到屏幕上;
1.应用层
一个Android应用程序窗口里面包含了很多UI元素,这些UI元素是以树形结构来组织的,即它们存在着父子关系,其中,子UI元素位于父UI元素里面,如下图:
在绘制一个Android应用程序窗口的UI之前,我们首先要确定它里面的各个子UI元素在父UI元素里面的大小以及位置。确定各个子UI元素在父UI元素里面的大小以及位置的过程又称为测量过程和布局过程。Android每个View绘制的三个核心步骤:通过Measure和Layout确定当前需要绘制View的大小和位置,通过绘制到surface,在Android系统绘制源码是在ViewRootImpl的performTraversals方法开始的,通过该方法会执行Measure和layout和draw方法;Measure和layout都是递归获取View的大小和位置,都是以深度为优先级,可以看出层级越深元素越多,耗时也就越长;
测量、布局没有太多要说的,这里要着重说一下绘制。Android目前有两种绘制模型:基于软件的绘制模型和硬件加速的绘制模型(从Android 3.0开始全面支持)。
基于软件的绘制模型下,CPU主导绘图,视图按照两个步骤绘制
(1)让View层次结构失效;
(2) 绘制View层次结构;
当应用程序需要更新它的部分UI时,都会调用内容发生改变的View对象的invalidate()方法。无效(invalidation)消息请求会在View对象层次结构中传递,以便计算出需要重绘的屏幕区域(脏区)。然后,Android系统会在View层次结构中绘制所有的跟脏区相交的区域。不幸的是,这种方法有两个缺点:
(1)绘制了不需要重绘的视图(与脏区域相交的区域);
(2)掩盖了一些应用的bug(由于会重绘与脏区域相交的区域);