Android UI 显示原理分析小结

本文是Android视图层源码分析系列第4篇文章,主要是对前几篇文章作一个总结,理解Android视图的主要组成部分和相互之间的工做逻辑。本文内容是基于Google Android Repo中的较新的源码分析而得来的。java

这张图大体解释了各模块之间的关系:android

下文内容并无具体的分析逻辑,主要是解释上图中各模块的职责,算是对Android视图层各模块的一个小总结,方便对于整个AndroidUI显示原理的理解。git

Window相关

Window能够说是Android Framework层提供的一个最基础的UI组件管理类,PhoneWindow是它的惟一实现类。它屏蔽了开发者与WindowManagerService的交互,统一了UI设计,并统一接收用户交互事件,好比背景、title和按键事件等。github

Activity/Dialog/Toast的UI展示都是依赖于Window来完成。对于UI编写,开发者只须要使用View相关便可。View最终会以ContentView的形式设置给Window:bash

PhoneWindow.java微信

public void setContentView(int layoutResID) {
  }
复制代码

DecorViewPhoneWindow根ViewGroupWindow提供了一些列的配置项,不一样的配置项DecorView的UI组成会有必定的不一样。关于Window的具体组成能够参考前面深刻剖析Window组成一文。源码分析

WindowManager

一个Window会有一个WindowManager。提到WindowManager就要提到WindowManagerGlobal。他们之间的区别是:布局

  • WindowManager : 它负责管理一个Window,并提供一系列对Window进行配置的flag。
  • WindowManagerGlobal : 它是一个单例类,负责管理应用全部的Window(其实并非很严谨,应该是管理全部的ViewRootImpl)。而且它含有与WindowManagerService通讯的Binder

WindowManager所提供的API其实都是用来操做WindowManagerGlobal中的ViewRootImpl。好比WindowManager.addView(contentView)其实是在WindowManagerGlobal中建立了一个与contentView对应的ViewRootImplpost

ViewRootImpl

它负责管理一个具体的View Tree,好比DecorView及其全部子View。具体有下面这些职责:动画

  • 经过与WindowManagerService通讯,建立Surface来显示其管理的View Tree
  • 管理整个View Tree的测量、布局、绘制。具体方法是performTraversals
  • 经过Choreographer来使整个ViewTree的UI刷新(测量、布局、绘制)与系统同步。

Choreographer

Choreographer用来控制同步处理输入(Input)、动画(Animation)、绘制(Draw)三个UI操做(UI显示的时候每一帧要完成的事情只有这三种)。其内部维护着一个Queue,使用者能够经过postXXX来把一些列待运行的UI操做放到Queue中。这些事件会在Choreographer接收显示系统的时间脉冲(垂直同步信号-VSync信号)后执行这些操做。好比ViewRootImpl对于View Tree的更新事件:

ViewRootImpl.java

void scheduleTraversals() {
    ...
     mChoreographer.postCallback(Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);
}
复制代码

Surface

一个ViewRootImpl含有一个Surface(一个Surface含有一个Canvas)。能够把它理解为一个画布,经过Canvas能够在上面做画。ViewRootImpl的整个ViewTreedrawSurface上的。

它实际上对应的是SurfaceFlinger中的Layer,在Surface上绘制的内容最终会由SurfaceFlinger来渲染。

WindowManagerService

它管理着全部应用程序的Window:

  • 管理全部Window的状态(WindowState)
  • SurfaceFlinger通讯,完成Window的渲染

经过ViewRootImpl能够向WindowManagerService添加一个Window:

ViewRootImpl.java

public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView) {
    ...
    //mWindow是一个`Binder`
    res = mWindowSession.addToDisplay(mWindow, mSeq, mWindowAttributes,
                        getHostVisibility(), mDisplay.getDisplayId(), mWinFrame,
                        mAttachInfo.mContentInsets, mAttachInfo.mStableInsets,
                        mAttachInfo.mOutsets, mAttachInfo.mDisplayCutout, mInputChannel);
    ...
}
复制代码

mWindowSessionIWindowSession的实例,是一个与WindowManagerService通讯的Binder。由WindowManagerGlobal建立和维护,一个应用程序只会有一个。

WindowToken和WindowState

WindowState用于在WindowManagerService中表明一个Window,它含有一个窗口的全部属性,它和ViewRootImpl是对应的。它被保存在WindowManagerServicemWindowMap集合中。mWindowMap是整个系统全部窗口的一个全集。

WindowToken将属于同一个应用程序组件的窗口组织在一块儿。在WindowManagerService对窗口管理的过程当中,用WindowToken表明一个应用组件。例如在进行窗口Z-Order排序时,属于同一个WindowToken的窗口(Window)会被安排在一块儿,也能够理解为渲染Window的Surface的Z轴顺序。一个token下能够有多个WindowState(Window):

WindowManagerService.addWindow()

win.mToken.addWindow(win);//一个token下会有多个win state
复制代码

SurfaceFlinger相关

SurfaceFlinger是Android最重要的系统服务之一,它主要负责UI的渲染,具体能够说是Layer的合成和渲染。下面介绍的几个对象基本都是存在于WindowManagerService中的。是应用程序与SurfaceFlinger交互的关键对象。

SurfaceControl

能够简单的把它理解为Surface的管理者。它和Surface是一对一的关系。构建SurfaceControl的同时就会构造SurfaceViewRootImplSurface实际上和它指向的是同一个对象。它能够经过SurfaceComposerClient来与SurfaceFlinger通讯。好比请求SurfaceFlinger建立Surface(Layer)

SurfaceComposerClient

这个对象也是进程惟一的,一个应用只有一个。能够经过它与SurfaceFlinger创建链接,从而与SurfaceFlinger通讯。具体通讯的功能是由Client对象来完成的。

Client

它是一个Binder,SurfaceComposerClient能够经过它来与SurfaceFlinger通讯。好比经过它可使SurfaceFlinger建立一个Layer。它也维护着一个应用程序全部的Layer

Layer

SurfaceFlinger管理着,分为多种不一样的类型。它是一个可被SurfaceFlinger渲染的单元。它有一个BufferQueueProducer,里面维护着不少能够被渲染的GraphicBuffer,这个buffer可能被渲染完毕,也可能处于待渲染状态。

想详细了解上面知识,阅读源码是权威的办法,也能够参考下面这些文章来理清思路:

Android视图层源码分析

理清Activity、View及Window之间关系

Android Choreographer 源码分析

一篇文章看明白 Android 图形系统 Surface 与 SurfaceFlinger 之间的关系

老罗的Android之旅

Android显示原理源码分析

AndroidUI系列—浅谈图像渲染机制

[深刻理解Android]系列从书

后面会继续从总体上了解Android视图层的事件处理。

最后:

欢迎关注个人Android进阶计划看更多干货

欢迎关注个人微信公众号:susion随心

相关文章
相关标签/搜索