### **概述**
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多屏支持**
#### **總體架構**

#### **窗口(Window)的結構**
* ViewRootImpl是一個虛擬根View,用來控制窗口的渲染,以及用來與WindowManagerService、SurfaceFlinger通信
* DecorView是窗口的真正根View
* ContentView描述窗口的主題風格

**Window與Activity的關系**

**Activity所對應的Window實際上是一個PhoneWindow**

**Activity/Window的上下文**

**Window的虛擬根View -- ViewRootImpl**

**窗口繪圖表面 -- Surface**

**窗口標志 -- W**

**窗口會話 -- Session**

**窗口視圖 -- View**

#### **Android應用程序UI的繪制過程**

**軟件渲染過程**

**硬件渲染過程**

**Display List是什么?**
Display List是一個緩存繪制命令的Buffer
**Display List的好處?**
當View的某些屬性發生改變時,只需要修改相應的Buffer中對應的屬即可,例如Alpha屬性,而無需對整個View進行重繪
#### **Android應用程序UI的繪制時機 – Without Vsync -- Jank**

#### **Android應用程序UI的繪制時機 – With VSync**

#### **Android應用程序UI的繪制時機 – With Vsync and Double Buffering**

#### **Android應用程序UI的繪制時機 – With Vsync and Triple Buffering**

#### **Android系統的VSync實現**
* SurfaceFlinger內部維護有一個EventThread,用來監控顯卡的VSync事件
* Android應用程序通過注冊一個DisplayEventReceiver來接收SurfaceFlinger的VSync事件
* Android應用程序接收到重繪UI請求,通過前面注冊的DisplayEventReceiver向SurfaceFlinger請求在下一個VSync事件到來時產生一個VSync通知
* Android應用程序獲得VSync通知的時候,才會真正執行重繪UI的請求
#### **WindowManagerService**
**職責**
* 計算窗口大小
* 計算窗口Z軸位置
* 管理輸入法窗口
* 管理壁紙窗口
* 執行窗口切換
**屏幕的基本結構**

**計算窗口大小 – Content Region**

**計算窗口大小 – Visible Region**

**計算窗口Z軸位置 – Window Stack**

**計算窗口Z軸位置 – 計算時機 **

**計算窗口Z軸位置 – 計算公式**
**Z = Base Layer + WINDOW_LAYER_MULTIPLIER(5)
Base Layer = T *?TYPE_LAYER_MULTIPLIER(10000) +?TYPE_LAYER_OFFSET(1000)**
**計算窗口Z軸位置 – 窗口主類型**

**計算窗口Z軸位置 – 窗口子類型**

**管理輸入法窗口**

**輸入法窗口在Window Stack的位置**

**管理壁紙窗口**

**壁紙窗口在Window Stack的位置**

**執行窗口切換**

**執行窗口切換 – Starting Window**

**執行窗口切換 – 動畫**

#### **SurfaceFlinger**
**職責**
* 分配圖形緩沖區
* 合成圖形緩沖區
* 管理VSync事件
**渲染流程**

**分配圖形緩沖區**

**合成圖形緩沖區**

**HWComposer實例:高通MDP4.0**

**合成圖形緩沖區 – 可見性計算**

**管理VSync事件**

#### **Android多屏支持**
**從4.2開始支持多屏幕**

**屏幕類型**
* 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


- 前言
- 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)的過程分析