1. 程式人生 > >《老羅的Android之旅》閱讀筆記——SurfaceFlinger服務

《老羅的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將前面得到的主圖形緩衝區渲染到硬體幀緩衝區中去。