### **概述**
Android系统采用一种称为Surface的UI架构为应用程序提供用户界面。在Android应用程序中,每一个Activity组件都关联有一个或者若干个窗口,每一个窗口都对应有一个Surface。有了这个Surface之后,应用程序就可以在上面渲染窗口的UI。最终这些已经绘制好了的Surface都会被统一提交给Surface管理服务SurfaceFlinger进行合成,最后显示在屏幕上面。无论是应用程序,还是SurfaceFlinger,都可以利用GPU等硬件来进行UI渲染,以便获得更流畅的UI。在Android应用程序UI架构中,还有一个重要的服务WindowManagerService,它负责统一管理协调系统中的所有窗口,例如管理窗口的大小、位置、打开和关闭等。
这系列讲Android应用程序的Surface机制,阐述Activity、Window和View的关系,以及应用程序、WindowManagerService和SurfaceFlinger协作完成UI渲染的过程。
* **Android UI架构概述**
* **Android应用程序UI框架**
* **WindowManagerService**
* **SurfaceFlinger**
* **Android多屏支持**
#### **总体架构**
![](https://box.kancloud.cn/dde130147d42ddd25e8ab915a628c9cf_697x608.png)
#### **窗口(Window)的结构**
* ViewRootImpl是一个虚拟根View,用来控制窗口的渲染,以及用来与WindowManagerService、SurfaceFlinger通信
* DecorView是窗口的真正根View
* ContentView描述窗口的主题风格
![](https://box.kancloud.cn/4e2c65511ee02ec7b370665c673f6b47_350x402.png)
**Window与Activity的关系**
![](https://box.kancloud.cn/65d727d00bc725f1310f47458e8a2fe8_573x433.jpg)
**Activity所对应的Window实际上是一个PhoneWindow**
![](https://box.kancloud.cn/2f062cf8f154fef7e1bd760add86b477_449x338.jpg)
**Activity/Window的上下文**
![](https://box.kancloud.cn/e463816eaa963e06c78334b049c07522_612x444.jpg)
**Window的虚拟根View -- ViewRootImpl**
![](https://box.kancloud.cn/8996c2200c81f2c8439948422e699233_826x472.jpg)
**窗口绘图表面 -- Surface**
![](https://box.kancloud.cn/014be9494feca7566edd02af6aa7bfa6_463x459.jpg)
**窗口标志 -- W**
![](https://box.kancloud.cn/a8c24b3ca04ea50f831c5a31e3ee5b33_760x420.jpg)
**窗口会话 -- Session**
![](https://box.kancloud.cn/35ceb7b71641d8c60b3445b81c5fb2ba_710x300.jpg)
**窗口视图 -- View**
![](https://box.kancloud.cn/5668b8ddf3b6ee9bdce5b39d4eb0a65d_470x351.jpg)
#### **Android应用程序UI的绘制过程**
![](https://box.kancloud.cn/bee348cd02f4c389909fc7884a6fbedb_519x351.png)
**软件渲染过程**
![](https://box.kancloud.cn/b7f8412c22c7d87007363090b407db78_416x325.png)
**硬件渲染过程**
![](https://box.kancloud.cn/dbf1f54ac14a94522ee87a71f30e9b67_538x591.png)
**Display List是什么?**
Display List是一个缓存绘制命令的Buffer
**Display List的好处?**
当View的某些属性发生改变时,只需要修改相应的Buffer中对应的属即可,例如Alpha属性,而无需对整个View进行重绘
#### **Android应用程序UI的绘制时机 – Without Vsync -- Jank**
![](https://box.kancloud.cn/9143f0807b9ec8eea379610a8ef429b4_692x262.png)
#### **Android应用程序UI的绘制时机 – With VSync**
![](https://box.kancloud.cn/496e3c777d83a355b3cb537f5449e646_678x193.png)
#### **Android应用程序UI的绘制时机 – With Vsync and Double Buffering**
![](https://box.kancloud.cn/0e1c48eab72ccd818c2767b280d80877_667x189.png)
#### **Android应用程序UI的绘制时机 – With Vsync and Triple Buffering**
![](https://box.kancloud.cn/5d60a3b92acd8a8d2f0288555261a122_668x263.png)
#### **Android系统的VSync实现**
* SurfaceFlinger内部维护有一个EventThread,用来监控显卡的VSync事件
* Android应用程序通过注册一个DisplayEventReceiver来接收SurfaceFlinger的VSync事件
* Android应用程序接收到重绘UI请求,通过前面注册的DisplayEventReceiver向SurfaceFlinger请求在下一个VSync事件到来时产生一个VSync通知
* Android应用程序获得VSync通知的时候,才会真正执行重绘UI的请求
#### **WindowManagerService**
**职责**
* 计算窗口大小
* 计算窗口Z轴位置
* 管理输入法窗口
* 管理壁纸窗口
* 执行窗口切换
**屏幕的基本结构**
![](https://box.kancloud.cn/01da93597c4dce354113540b0f261997_651x439.jpg)
**计算窗口大小 – Content Region**
![](https://box.kancloud.cn/696afa988f7c6323ea2973eb5e03bd66_918x424.jpg)
**计算窗口大小 – Visible Region**
![](https://box.kancloud.cn/d22f4fb7a0c2f667f0085eafb2fbc610_916x448.jpg)
**计算窗口Z轴位置 – Window Stack**
![](https://box.kancloud.cn/00adaab7deaa12dcebf865015ecb3e9f_750x524.jpg)
**计算窗口Z轴位置 – 计算时机 **
![](https://box.kancloud.cn/fa3484bdd7ea0416ffe24220291eae97_817x352.jpg)
**计算窗口Z轴位置 – 计算公式**
**Z = Base Layer + WINDOW_LAYER_MULTIPLIER(5)
Base Layer = T * TYPE_LAYER_MULTIPLIER(10000) + TYPE_LAYER_OFFSET(1000)**
**计算窗口Z轴位置 – 窗口主类型**
![](https://box.kancloud.cn/8bfa0e12277a79b4856b22d7fdaddd53_580x482.png)
**计算窗口Z轴位置 – 窗口子类型**
![](https://box.kancloud.cn/5db2c6cceed2d96e0b16244a6a2345d9_767x381.jpg)
**管理输入法窗口**
![](https://box.kancloud.cn/2ab9d3d4e973a65188da5c8524fadf42_573x351.jpg)
**输入法窗口在Window Stack的位置**
![](https://box.kancloud.cn/01921204c061b8a801ad7fd55abc5fc6_747x426.jpg)
**管理壁纸窗口**
![](https://box.kancloud.cn/3f0cfd12e5eb36ea4bf822afd0f9b1e2_611x278.jpg)
**壁纸窗口在Window Stack的位置**
![](https://box.kancloud.cn/4d39e694cfed386a2abbb9ee2568d39e_746x429.jpg)
**执行窗口切换**
![](https://box.kancloud.cn/938df5cb8d41fb89ec1dcca903c44f3f_524x283.jpg)
**执行窗口切换 – Starting Window**
![](https://box.kancloud.cn/1fe9bbf69f7561314ade7fc7eac5f5e3_474x561.jpg)
**执行窗口切换 – 动画**
![](https://box.kancloud.cn/3c0e92d99924024e59017bb0d715cdaf_726x373.jpg)
#### **SurfaceFlinger**
**职责**
* 分配图形缓冲区
* 合成图形缓冲区
* 管理VSync事件
**渲染流程**
![](https://box.kancloud.cn/31e07a627c009d7bbafe19dede1d2d12_628x500.jpg)
**分配图形缓冲区**
![](https://box.kancloud.cn/0f8a88fd5c61278339445e511757d1f1_749x420.png)
**合成图形缓冲区**
![](https://box.kancloud.cn/a1aad0e020e1122159e057eba62bd547_747x517.png)
**HWComposer实例:高通MDP4.0**
![](https://box.kancloud.cn/7efd956f732fb3f86b6fb356b6cfe877_635x571.jpg)
**合成图形缓冲区 – 可见性计算**
![](https://box.kancloud.cn/9eb6c60aae53f049d94ee3950079c5a9_495x253.jpg)
**管理VSync事件**
![](https://box.kancloud.cn/033f4b7f179af33cc37c264f29fa322e_764x353.png)
#### **Android多屏支持**
**从4.2开始支持多屏幕**
![](https://box.kancloud.cn/a19f30b95c3746654f0992be1bf1d043_564x355.png)
**屏幕类型**
* Primary Display
* 设备自带的屏幕
* 由SurfaceFlinger管理
* External Display
* 通过HDMI连接
* 由SurfaceFlinger监控和管理
* Virtual Display
* 通过Miracast连接(基于Wifi Direct技术)
* 由DisplayManagerService监控和管理
* App通过android.app.Presentation接口在指定的屏幕上创建窗口
http://developer.android.com/reference/android/app/Presentation.html
![](https://box.kancloud.cn/c0ae5ad20d4565c3b78b642dfd99a4b4_755x198.png)
![](https://box.kancloud.cn/d04836328d3c8d2c952fa4c44b266290_521x59.png)
- 前言
- Android组件设计思想
- Android源代码开发和调试环境搭建
- Android源代码下载和编译
- Android源代码情景分析法
- Android源代码调试分析法
- 手把手教你为手机编译ROM
- 在Ubuntu上下载、编译和安装Android最新源代码
- 在Ubuntu上下载、编译和安装Android最新内核源代码(Linux Kernel)
- 如何单独编译Android源代码中的模块
- 在Ubuntu上为Android系统编写Linux内核驱动程序
- 在Ubuntu上为Android系统内置C可执行程序测试Linux内核驱动程序
- 在Ubuntu上为Android增加硬件抽象层(HAL)模块访问Linux内核驱动程序
- 在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口
- 在Ubuntu上为Android系统的Application Frameworks层增加硬件访问服务
- 在Ubuntu上为Android系统内置Java应用程序测试Application Frameworks层的硬件服务
- Android源代码仓库及其管理工具Repo分析
- Android编译系统简要介绍和学习计划
- Android编译系统环境初始化过程分析
- Android源代码编译命令m/mm/mmm/make分析
- Android系统镜像文件的打包过程分析
- 从CM刷机过程和原理分析Android系统结构
- Android系统架构概述
- Android系统整体架构
- android专用驱动
- Android硬件抽象层HAL
- Android应用程序组件
- Android应用程序框架
- Android用户界面架构
- Android虚拟机之Dalvik虚拟机
- Android硬件抽象层
- Android硬件抽象层(HAL)概要介绍和学习计划
- Android专用驱动
- Android Logger驱动系统
- Android日志系统驱动程序Logger源代码分析
- Android应用程序框架层和系统运行库层日志系统源代码分析
- Android日志系统Logcat源代码简要分析
- Android Binder驱动系统
- Android进程间通信(IPC)机制Binder简要介绍和学习计划
- 浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路
- 浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路
- Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析
- Android系统进程间通信(IPC)机制Binder中的Client获得Server远程接口过程源代码分析
- Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析
- Android Ashmem驱动系统
- Android系统匿名共享内存Ashmem(Anonymous Shared Memory)简要介绍和学习计划
- Android系统匿名共享内存Ashmem(Anonymous Shared Memory)驱动程序源代码分析
- Android系统匿名共享内存Ashmem(Anonymous Shared Memory)在进程间共享的原理分析
- Android系统匿名共享内存(Anonymous Shared Memory)C++调用接口分析
- Android应用程序进程管理
- Android应用程序进程启动过程的源代码分析
- Android系统进程Zygote启动过程的源代码分析
- Android系统默认Home应用程序(Launcher)的启动过程源代码分析
- Android应用程序消息机制
- Android应用程序消息处理机制(Looper、Handler)分析
- Android应用程序线程消息循环模型分析
- Android应用程序输入事件分发和处理机制
- Android应用程序键盘(Keyboard)消息处理机制分析
- Android应用程序UI架构
- Android系统的开机画面显示过程分析
- Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析
- SurfaceFlinger
- Android系统Surface机制的SurfaceFlinger服务
- SurfaceFlinger服务简要介绍和学习计划
- 启动过程分析
- 对帧缓冲区(Frame Buffer)的管理分析
- 线程模型分析
- 渲染应用程序UI的过程分析
- Android应用程序与SurfaceFlinger服务的关系
- 概述和学习计划
- 连接过程分析
- 共享UI元数据(SharedClient)的创建过程分析
- 创建Surface的过程分析
- 渲染Surface的过程分析
- Android应用程序窗口(Activity)
- 实现框架简要介绍和学习计划
- 运行上下文环境(Context)的创建过程分析
- 窗口对象(Window)的创建过程分析
- 视图对象(View)的创建过程分析
- 与WindowManagerService服务的连接过程分析
- 绘图表面(Surface)的创建过程分析
- 测量(Measure)、布局(Layout)和绘制(Draw)过程分析
- WindowManagerService
- WindowManagerService的简要介绍和学习计划
- 计算Activity窗口大小的过程分析
- 对窗口的组织方式分析
- 对输入法窗口(Input Method Window)的管理分析
- 对壁纸窗口(Wallpaper Window)的管理分析
- 计算窗口Z轴位置的过程分析
- 显示Activity组件的启动窗口(Starting Window)的过程分析
- 切换Activity窗口(App Transition)的过程分析
- 显示窗口动画的原理分析
- Android控件TextView的实现原理分析
- Android视图SurfaceView的实现原理分析
- Android应用程序UI硬件加速渲染
- 简要介绍和学习计划
- 环境初始化过程分析
- 预加载资源地图集服务(Asset Atlas Service)分析
- Display List构建过程分析
- Display List渲染过程分析
- 动画执行过程分析
- Android应用程序资源管理框架
- Android资源管理框架(Asset Manager)
- Asset Manager 简要介绍和学习计划
- 编译和打包过程分析
- Asset Manager的创建过程分析
- 查找过程分析
- Dalvik虚拟机和ART虚拟机
- Dalvik虚拟机
- Dalvik虚拟机简要介绍和学习计划
- Dalvik虚拟机的启动过程分析
- Dalvik虚拟机的运行过程分析
- Dalvik虚拟机JNI方法的注册过程分析
- Dalvik虚拟机进程和线程的创建过程分析
- Dalvik虚拟机垃圾收集机制简要介绍和学习计划
- Dalvik虚拟机Java堆创建过程分析
- Dalvik虚拟机为新创建对象分配内存的过程分析
- Dalvik虚拟机垃圾收集(GC)过程分析
- ART虚拟机
- Android ART运行时无缝替换Dalvik虚拟机的过程分析
- Android运行时ART简要介绍和学习计划
- Android运行时ART加载OAT文件的过程分析
- Android运行时ART加载类和方法的过程分析
- Android运行时ART执行类方法的过程分析
- ART运行时垃圾收集机制简要介绍和学习计划
- ART运行时Java堆创建过程分析
- ART运行时为新创建对象分配内存的过程分析
- ART运行时垃圾收集(GC)过程分析
- ART运行时Compacting GC简要介绍和学习计划
- ART运行时Compacting GC堆创建过程分析
- ART运行时Compacting GC为新创建对象分配内存的过程分析
- ART运行时Semi-Space(SS)和Generational Semi-Space(GSS)GC执行过程分析
- ART运行时Mark-Compact( MC)GC执行过程分析
- ART运行时Foreground GC和Background GC切换过程分析
- Android安全机制
- SEAndroid安全机制简要介绍和学习计划
- SEAndroid安全机制框架分析
- SEAndroid安全机制中的文件安全上下文关联分析
- SEAndroid安全机制中的进程安全上下文关联分析
- SEAndroid安全机制对Android属性访问的保护分析
- SEAndroid安全机制对Binder IPC的保护分析
- 从NDK在非Root手机上的调试原理探讨Android的安全机制
- APK防反编译
- Android视频硬解稳定性问题探讨和处理
- Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析
- Android应用程序安装过程源代码分析
- Android应用程序启动过程源代码分析
- 四大组件源代码分析
- Activity
- Android应用程序的Activity启动过程简要介绍和学习计划
- Android应用程序内部启动Activity过程(startActivity)的源代码分析
- 解开Android应用程序组件Activity的"singleTask"之谜
- Android应用程序在新的进程中启动新的Activity的方法和过程分析
- Service
- Android应用程序绑定服务(bindService)的过程源代码分析
- ContentProvider
- Android应用程序组件Content Provider简要介绍和学习计划
- Android应用程序组件Content Provider应用实例
- Android应用程序组件Content Provider的启动过程源代码分析
- Android应用程序组件Content Provider在应用程序之间共享数据的原理分析
- Android应用程序组件Content Provider的共享数据更新通知机制分析
- BroadcastReceiver
- Android系统中的广播(Broadcast)机制简要介绍和学习计划
- Android应用程序注册广播接收器(registerReceiver)的过程分析
- Android应用程序发送广播(sendBroadcast)的过程分析