一、SurfaceFlinger的原理
SurfaceFlinger是Android系統(tǒng)中負責屏幕顯示內容合成的服務,它接收來自多個應用程序和系統(tǒng)服務的圖像緩沖區(qū),根據它們的位置、大小、透明度、Z軸順序等屬性,將它們合成到一個最終的緩沖區(qū)中,然后發(fā)送到顯示設備上。
二、SurfaceFlinger的作用
SurfaceFlinger的作用是將所有的Surface和其他層合成到屏幕上,形成最終的顯示效果。
Surface是一個包含BufferQueue和SurfaceControl的對象
BufferQueue是一個緩沖區(qū)隊列,用于存儲圖像數(shù)據
SurfaceControl是一個包含層元數(shù)據的對象,用于控制Surface的顯示屬性。
Surface可以由應用程序或者系統(tǒng)服務創(chuàng)建,例如WindowManager、MediaServer、CameraService等。
SurfaceFlinger會根據Surface的屬性,將它們分為不同的類型,例如OVERLAY、SIDEBAND、SOLID_COLOR、CLIENT等。
SurfaceFlinger會盡可能地將Surface標記為OVERLAY類型,表示可以直接將Surface的緩沖區(qū)合成到屏幕上,而不需要經過SurfaceFlinger的處理。
如果Surface不能被標記為OVERLAY類型,那么它們就會被標記為CLIENT類型,表示需要由SurfaceFlinger來進行合成。
除了Surface之外,SurfaceFlinger還會合成其他的層,例如BootAnimation、Framebuffer、ColorLayer等。這些層的作用是顯示一些特殊的內容,例如開機動畫、截屏、色彩校正等。
三、SurfaceFlinger的架構

從上圖可以看出,SurfaceFlinger的架構主要包含以下幾個部分:
App和Service:這些是Surface的創(chuàng)建者,它們可以通過SurfaceHolder或者SurfaceTexture等方式來創(chuàng)建和操作Surface,例如設置Surface的大小、位置、透明度等屬性,或者向Surface的BufferQueue中提交圖像數(shù)據。Surface:這是SurfaceFlinger的合成對象,它包含一個BufferQueue和一個SurfaceControl,BufferQueue用于存儲圖像數(shù)據,SurfaceControl用于控制Surface的顯示屬性。
Surface在創(chuàng)建時,會向SurfaceFlinger注冊,讓SurfaceFlinger知道它的存在,并根據它的屬性來進行合成。SurfaceFlinger:這是屏幕顯示內容合成的服務,它包含一個Looper線程和一個EventThread線程
Looper線程用于接收和處理來自Binder的消息,例如創(chuàng)建、銷毀、更新Surface等
EventThread線程用于接收和處理來自顯示設備的VSYNC信號,VSYNC信號是一個垂直同步信號,表示顯示設備可以接收新的緩沖區(qū)而不會產生撕裂現(xiàn)象。
SurfaceFlinger會在收到VSYNC信號后,觸發(fā)一次合成操作。SurfaceFlinger還會與Hardware Composer進行通信,詢問應該如何進行合成,Hardware Composer是一個硬件抽象層,用于利用硬件加速的方式來合成Surface,提高性能和節(jié)省電量。Hardware Composer:這是一個硬件抽象層,用于利用硬件加速的方式來合成Surface,提高性能和節(jié)省電量。
Hardware Composer會根據Surface的屬性,將它們分為不同的類型,例如OVERLAY、SIDEBAND、SOLID_COLOR、CLIENT等。
Hardware Composer會盡可能地將Surface標記為OVERLAY類型,表示可以直接將Surface的緩沖區(qū)合成到屏幕上,而不需要經過SurfaceFlinger的處理。
如果Surface不能被標記為OVERLAY類型,那么它們就會被標記為CLIENT類型,表示需要由SurfaceFlinger來進行合成。
Hardware Composer還會返回一個DisplayFrame,表示Surface在屏幕上的位置和大小。
Hardware Composer會將合成后的緩沖區(qū)發(fā)送到顯示設備上,完成繪制流程。Display:這是顯示設備,用于展示合成后的緩沖區(qū),形成最終的顯示效果。
Display會向SurfaceFlinger發(fā)送VSYNC信號,表示可以接收新的緩沖區(qū)而不會產生撕裂現(xiàn)象。
Display還會向SurfaceFlinger反饋一些信息,例如顯示設備的分辨率、刷新率、色彩空間等。
四、SurfaceFlinger的啟動流程

從上圖可以看出,SurfaceFlinger的啟動過程主要包含以下幾個步驟:
-
init:這是Android系統(tǒng)的初始化進程,它負責啟動各種系統(tǒng)服務,包括SurfaceFlinger。init會讀取init.rc文件,根據其中的配置,啟動SurfaceFlinger進程,并傳遞一些參數(shù),例如日志級別、調試選項等。 -
SurfaceFlinger:這是屏幕顯示內容合成的服務,它是一個獨立的進程,由init啟動。SurfaceFlinger會執(zhí)行main()函數(shù),該函數(shù)是SurfaceFlinger的入口函數(shù),它會調用initSurfaceFlinger()函數(shù),該函數(shù)是SurfaceFlinger的初始化函數(shù),它會完成SurfaceFlinger的各種初始化工作。 -
main():這是SurfaceFlinger的入口函數(shù),它會調用initSurfaceFlinger()函數(shù),該函數(shù)是SurfaceFlinger的初始化函數(shù),它會完成SurfaceFlinger的各種初始化工作。
initSurfaceFlinger():這是SurfaceFlinger的初始化函數(shù),它會完成SurfaceFlinger的各種初始化工作,包括以下幾個方面:
- 創(chuàng)建一個Looper線程,用于接收和處理來自Binder的消息,例如創(chuàng)建、銷毀、更新Surface等。
- 創(chuàng)建一個EventThread線程,用于接收和處理來自顯示設備的VSYNC信號,VSYNC信號是一個垂直同步信號,表示顯示設備可以接收新的緩沖區(qū)而不會產生撕裂現(xiàn)象。SurfaceFlinger會在收到VSYNC信號后,觸發(fā)一次合成操作。
- 初始化Hardware Composer,Hardware Composer是一個硬件抽象層,用于利用硬件加速的方式來合成Surface,提高性能和節(jié)省電量。SurfaceFlinger會與Hardware Composer進行通信,詢問應該如何進行合成,Hardware Composer會根據Surface的屬性,將它們分為不同的類型,例如OVERLAY、SIDEBAND、SOLID_COLOR、CLIENT等。Hardware Composer會盡可能地將Surface標記為OVERLAY類型,表示可以直接將Surface的緩沖區(qū)合成到屏幕上,而不需要經過SurfaceFlinger的處理。如果Surface不能被標記為OVERLAY類型,那么它們就會被標記為CLIENT類型,表示需要由SurfaceFlinger來進行合成。Hardware Composer還會返回一個DisplayFrame,表示Surface在屏幕上的位置和大小。
- 獲取顯示設備的信息,例如顯示設備的分辨率、刷新率、色彩空間等。SurfaceFlinger會根據這些信息,來設置Surface的大小、位置、格式等屬性,以適應顯示設備的特性。SurfaceFlinger還會向顯示設備注冊一個回調函數(shù),用于接收顯示設備的狀態(tài)變化,例如連接、斷開、旋轉等。