本書主要介紹Android圖形顯示系統(tǒng)。首先介紹圖形顯示系統(tǒng)的框架;然后在對圖形顯示系統(tǒng)有一個整體認識的基礎(chǔ)上,重點介紹每個圖形組件的工作原理;最后介紹輸入,輸入與顯示結(jié)合在一起才能實現(xiàn)用戶與計算機的交互。
全書共分7章。第1章介紹圖形顯示系統(tǒng)的框架;第2章介紹圖形顯示系統(tǒng)涉及的進程間通信方式;第3章介紹硬件抽象層的圖形組件;第4章介紹圖形流消費者處理圖形緩沖的流程;第5章介紹窗口位置管理服務(wù)的內(nèi)容;第6章介紹圖形流的生產(chǎn)過程;第7章介紹輸入。
本書適合作為高等院校計算機、軟件工程及相關(guān)專業(yè)本科生、研究生的參考資料,也可供有Android基礎(chǔ)的軟件開發(fā)者參考。
本書從框架和流程兩個角度介紹圖形顯示系統(tǒng),配合示例和全彩圖解輔助讀者學習。
圖形顯示系統(tǒng)在計算機、智能手機的普及過程中發(fā)揮著重要作用。早期的計算機只能通過命令行的方式進行交互,需要用戶熟悉各種命令,這對于普通用戶而言難度比較大。后來出現(xiàn)了支持圖形顯示系統(tǒng)的操作系統(tǒng),用戶與計算機之間通過圖形的方式進行交互,大大降低用戶使用計算機的難度,使得普通用戶也可以用計算機完成特定任務(wù),如玩游戲、看電影等。在以圖形方式交互的系統(tǒng)中,軟件開發(fā)者需要為應(yīng)用開發(fā)各種圖形界面,掌握圖形顯示系統(tǒng)更容易優(yōu)化圖形界面的交互體驗。
圖形顯示系統(tǒng)是一個非常復雜的系統(tǒng),涉及的模塊比較多,而且很多模塊偏底層,通過閱讀代碼很難掌握其中的知識點。筆者主要從事Android系統(tǒng)方面的開發(fā)工作,在工作中常常遇到與顯示相關(guān)的問題,為了更好地處理這些問題,對Android的圖形顯示系統(tǒng)進行了系統(tǒng)性的學習,經(jīng)過長時間的研究、摸索才有了一定程度的理解。為了使讀者能更輕松、容易地了解圖形顯示系統(tǒng)方面的知識,筆者把相關(guān)的知識點整理出來,編寫了本書。
本書從框架和流程兩個角度對圖形顯示系統(tǒng)進行介紹。從框架開始認識圖形顯示系統(tǒng)的全貌,在此基礎(chǔ)上學習框架中各個圖形組件的工作流程。由于流程比較多,本書只對關(guān)鍵的流程進行重點介紹。為了幫助讀者更容易地理解其中的知識點,筆者會結(jié)合簡單的示例逐步展開介紹,分析示例背后的工作流程,同時配有大量的圖例。
本書共分為7章,各章的主要內(nèi)容如下。
第1章,從整體上認識圖形顯示系統(tǒng)的框架,了解圖形顯示系統(tǒng)需要掌握哪些內(nèi)容。
第2章,介紹圖形顯示系統(tǒng)涉及的3種進程間通信方式,分別為Binder、共享內(nèi)存和套接字。本章是學習圖形顯示系統(tǒng)的基礎(chǔ)。
第3章,介紹硬件抽象層的圖形組件的功能及其工作流程。
第4章,介紹圖形流消費者的工作原理,主要介紹將多個圖形緩沖合成到幀緩沖的過程。
第5章,介紹窗口位置管理服務(wù)的內(nèi)容,包括如何創(chuàng)建和管理窗口。
第6章,介紹圖形流生產(chǎn)者的工作原理,主要介紹2D圖形、3D圖形的生產(chǎn)和顯示過程。
第7章,介紹圖形窗口響應(yīng)輸入事件及輸入法輸入文字的流程。
本書之所以選擇Android系統(tǒng),是因為它是目前智能手機主流的操作系統(tǒng),并且是開源的,其源碼便于研究。本書基于Android 9基線,因此讀者在閱讀本書時需要下載AOSP(Android Open Source Project)源碼,還需要準備一臺裝有Ubuntu系統(tǒng)的計算機,用于對源碼進行編譯,編譯之后在模擬器上運行,方便對底層的源碼進行跟蹤學習。為了更好地理解本書的內(nèi)容,讀者需要先了解Android的基本概念,掌握C、C 和Java等編程語言的基本語法。
全書由李先儒編寫,在編寫過程中得到梁云俠的大力支持,在此表示衷心的感謝。
本書的內(nèi)容基于筆者個人的理解寫就,且筆者水平有限,書中難免會有不當之處,歡迎廣大同行和讀者批評指正。
李先儒
2023年8月
第1章 緒論/1
1.1 簡介/1
1.2 圖形顯示系統(tǒng)框架/1
第2章 進程間通信/4
2.1 簡介/4
2.1.1 定義/4
2.1.2 必要性/5
2.1.3 實現(xiàn)方法/6
2.2 Binder/7
2.2.1 示例/7
2.2.2 框架/8
2.2.3 Binder驅(qū)動/9
2.2.4 服務(wù)管理進程/12
2.2.5 服務(wù)進程/17
2.2.6 客戶進程/29
2.2.7 示例回顧/31
2.2.8 線程池/32
2.2.9 Java Binder/34
2.2.10 文件描述符/35
2.2.11 通信模式/36
2.2.12 使用場合/37
2.3 共享內(nèi)存/38
2.3.1 簡介/38
2.3.2 實現(xiàn)方法/38
2.3.3 使用場合/39
2.4 套接字/39
2.4.1 簡介/39
2.4.2 使用場合/40
2.5 本章小結(jié)/40
第3章 圖形硬件/41
3.1 硬件抽象層/41
3.1.1 作用/41
3.1.2 接口定義/41
3.1.3 使用示例/42
3.2 硬件抽象層接口定義語言/45
3.2.1 背景/45
3.2.2 使用方法/46
3.2.3 進程間通信方式/48
3.3 Gralloc/48
3.3.1 簡介/48
3.3.2 接口定義/49
3.3.3 分配圖形緩沖流程/50
3.3.4 圖形緩沖/51
3.4 Hardware Composer/53
3.4.1 簡介/53
3.4.2 接口定義/53
3.4.3 硬件混合渲染器合成/56
3.4.4 圖形庫合成/60
3.5 本章小結(jié)/61
第4章 圖形流消費者/62
4.1 簡介/62
4.1.1 SurfaceFlinger初始化/62
4.1.2 客戶進程與SurfaceFlinger交互/63
4.1.3 SurfaceFlinger與硬件抽象層交互/64
4.2 圖層/64
4.2.1 創(chuàng)建圖層/64
4.2.2 緩沖圖層/67
4.2.3 圖形的生產(chǎn)與消費/69
4.3 VSync/72
4.3.1 簡介/72
4.3.2 作用/73
4.3.3 基本流程/74
4.4 圖形合成/79
4.4.1 合成原理/79
4.4.2 紋理/80
4.4.3 混合/84
4.4.4 渲染引擎/84
4.4.5 合成流程/87
4.5 本章小結(jié)/91
第5章 窗口位置管理/92
5.1 簡介/92
5.1.1 WMS/92
5.1.2 客戶進程與WMS交互/93
5.1.3 WMS與SurfaceFlinger交互/94
5.2 窗口/94
5.2.1 創(chuàng)建窗口/94
5.2.2 窗口容器/95
5.2.3 控制窗口/96
5.3 窗口容器樹/97
5.3.1 DisplayContent/97
5.3.2 DisplayChildWindow Container/99
5.3.3 TaskStack/100
5.3.4 Task/101
5.3.5 AppWindowToken/102
5.3.6 WindowState/103
5.3.7 SurfaceControl/104
5.4 窗口切換/106
5.4.1 切換原理/106
5.4.2 切換動畫/107
5.4.3 切換流程/107
5.5 本章小結(jié)/113
第6章 圖形流生產(chǎn)者/114
6.1 生產(chǎn)環(huán)境/114
6.1.1 啟動流程/114
6.1.2 設(shè)置內(nèi)容視圖/116
6.1.3 設(shè)置根視圖/118
6.1.4 初始化圖形庫/118
6.1.5 請求VSync信號/119
6.2 2D圖形/119
6.2.1 視圖/119
6.2.2 生產(chǎn)流程/120
6.3 3D圖形/125
6.3.1 示例/125
6.3.2 生產(chǎn)流程/126
6.4 本章小結(jié)/133
第7章 輸入/134
7.1 輸入系統(tǒng)/134
7.2 輸入管理/134
7.2.1 輸入管理框架/134
7.2.2 啟動過程/135
7.2.3 讀取事件/137
7.2.4 分發(fā)事件/140
7.2.5 建立連接通道/141
7.2.6 分發(fā)到目標進程/142
7.2.7 在視圖樹中分發(fā)/144
7.2.8 處理事件/145
7.3 輸入法/146
7.3.1 輸入法框架/147
7.3.2 初始化服務(wù)/147
7.3.3 啟動應(yīng)用/149
7.3.4 顯示應(yīng)用界面/149
7.3.5 觸摸輸入框/150
7.3.6 輸入內(nèi)容/152
7.4 本章小結(jié)/152
附錄A Binder通信示例/153
附錄B 共享內(nèi)存與套接字示例/156
附錄C 紋理示例/163