《老羅的Android之旅》閱讀筆記——SurfaceFlinger服務
Android應用程式請求SurfaceFlinger服務渲染自己的UI可以分為三步曲:
首先是建立一個到SurfaceFlinger服務的連線,
接著再通過這個連線來建立一個Surface,
最後請求SurfaceFlinger服務渲染該Surface。
根據SurfaceFlinger類的定義,得到:
1. SurfaceFlinger服務通過一個GraphicPlane物件來管理系統的顯示裝置;
2. SurfaceFlinger服務有三種類型的執行緒,它們分別是Binder執行緒、控制檯事件監控執行緒和UI渲染執行緒;
3. SurfaceFlinger服務是在UI渲染執行緒中執行渲染系統UI的操作的。
- SurfaceFlinger服務的啟動過程
SurfaceFlinger服務的啟動過程序列圖:
- SurfaceFlinger服務是如何管理系統的硬體幀緩衝區的
SurfaceFlinger服務通過一個GraphicPlane物件來描述系統的顯示屏,即系統的硬體幀緩衝區。
GraphicPlane類內部聚合了一個DisplayHardware物件,通過這個DisplayHardware物件就可以訪問系統的硬體幀緩衝區。
DisplayHardware類內部又包含了一個FramebufferNativeWindow物件,這個FramebufferNativeWindow物件才是真正用來描述系統的硬體幀緩衝區的。
- SurfaceFlinger服務三種類型的執行緒是如何執行和互動的
三種類型的執行緒,它們分別是Binder執行緒、UI渲染執行緒和控制檯事件監控執行緒。
三種類型的執行緒的啟動順序:
1. UI渲染執行緒的執行模型
SurfaceFlinger服務的UI渲染執行緒是以SurfaceFlinger類的成員函式threadLoop為執行緒執行體的
SurfaceFlinger類的成員函式threadLoop的工作過程
2. Binder執行緒與UI渲染執行緒的互動過程
當它需要重新整理自己的UI時,就會通過它所執行在的程序的SurfaceClient單例的成員函式signalServer來向SurfaceFlinger服務傳送一個Binder程序間通訊請求
3. 控制檯事件監控執行緒與UI渲染執行緒的互動過程
SurfaceFlinger服務的控制檯事件監控執行緒會不斷地迴圈呼叫DisplayEventThread類的成員函式threadLoop,以便可以監控硬體幀緩衝區的睡眠/喚醒狀態切換事件。
SurfaceFlinger類的成員函式handleConsoleEvents處理硬體幀緩衝區睡眠事件的過程
SurfaceFlinger類的成員函式handleConsoleEvents處理硬體幀緩衝區喚醒事件的過程
- SurfaceFlinger服務渲染Android應用程式UI的過程
通過分析SurfaceFlinger服務的UI渲染執行緒的執行過程來分析應用程式UI的渲染過程
SurfaceFlinger服務的UI渲染執行緒的執行過程如下所示:
1. 呼叫SurfaceFlinger類的成員函式handleConsoleEvents來處理控制檯事件。
2. 呼叫SurfaceFlinger類的成員函式handleTransaction來處理系統顯示屏以及應用程式視窗的屬性變化,例如大小、旋轉方向變化等。
3. 呼叫SurfaceFlinger類的成員函式handlePageFlip來讓各個應用程式視窗設定它們當前所要渲染的圖形緩衝區。
4. 如果SurfaceFlinger服務在編譯的時候指定了USE_COMPOSITION_BYPASS巨集,並且當前需要渲染的應用程式視窗只有一個,那麼就會呼叫SurfaceFlinger類的成員函式handleBypassLayer來直接將這個應用程式視窗的圖形緩衝區渲染到硬體幀緩衝區中去,否則的話,就要呼叫SurfaceFlinger類的成員函式handleRepaint來合成所有的應用程式視窗的圖形緩衝區到一個主圖形緩衝區中去。
5. 呼叫SurfaceFlinger類的成員函式postFramebuffer將前面得到的主圖形緩衝區渲染到硬體幀緩衝區中去。