Android GUI系統(tǒng)-SurfaceFlinger基礎

一、OpenGL ES與EGL
SurfaceFlinger與OpenGL等模塊的關系

Android的GUI系統(tǒng)是基于OpenGL/EGL來實現(xiàn)的细睡。

  1. 由于OpenGL是通用函數庫颈将,在不同平臺系統(tǒng)上需要被“本土化”——把它與具體平臺的窗口系統(tǒng)建立起關聯(lián)挤茄,F(xiàn)ramebufferNativeWindow是負責OpenGL ES在Android平臺上本地化的中介之一逞刷。為OpenGL ES配置本地窗口的是EGL,EGL介于本地窗口系統(tǒng)和Rendering API(即OPenGL ES)之間的一層接口惊暴。
  2. 與OpenGL相關的模塊可分為:
    (1)配置類饼丘。 幫助OpenGL ES完成配置的,包括EGL辽话、DisplayHardware都歸為此類肄鸽。
    (2)依賴類。 OpenGL ES正常運行所依賴的“本地化”的東西油啤,如FramebufferNativeWindow典徘。
    (3)使用類。 使用者也可能是配置者益咬,如DisplayDevice既扮演了構建OpenGL ES環(huán)境的角色逮诲,同時也是它的用戶。
  3. OpenGL相關知識可查看Android中的OpenGL ES使用基礎
二幽告、 硬件接口 - HAL

HAL是很多子系統(tǒng)(顯示/音頻系統(tǒng)等)與Linux Kernel驅動之間通信的統(tǒng)一接口梅鹦。各子系統(tǒng)通常不會直接使用內核驅動。
HAL解決的問題:
(1)硬件接口抽象冗锁。從眾多硬件設備中提取出共同屬性并付諸軟件實現(xiàn)齐唆。
(2)接口穩(wěn)定性。 HAL層的接口不允許頻繁更動冻河。
(3)靈活的使用方法蝶念。供硬件開發(fā)商及上層使用者定制他們的需求。

三芋绸、終端顯示設備 - Gralloc與Framebuffer

Linux內核提供了統(tǒng)一的framebuffer顯示驅動。Framebuffer是內核系統(tǒng)提供的圖形硬件的抽象描述担敌,稱為buffer是因為它也占用了系統(tǒng)存儲空間的一部分摔敛,是一塊包含屏幕顯示信息的緩沖區(qū)。
Framebuffer借助于Linux文件系統(tǒng)向上層應用提供了統(tǒng)一而高效的操作接口全封,讓用戶空間運行的程序比較容易地適配多種顯示設備马昙。
Android系統(tǒng)中桃犬,framebuffer提供的設備節(jié)點為/dev/graphics/fb或者/dev/fb,其中fb0表示第一個主顯示屏幕行楞,必須存在攒暇,當前系統(tǒng)實現(xiàn)中只用到了一個顯示屏。
顯示系統(tǒng)使用HAL層間接引用底層架構子房,從而操作幀緩沖區(qū)形用。而完成這一中介任務的就是Gralloc.
下圖為Gralloc的模塊簡圖,描述了gpu0和fb0的主要API.

Gralloc對應的模塊是由FramebufferNativeWindow在構造函數加載的证杭,Gralloc包括fb和gralloc兩個設備田度,前者負責打開內核中的Framebuffer、初始化配置,并提供了post解愤、setSwapInterval等操作接口镇饺。后者則管理幀緩沖區(qū)的分配和釋放。


Gralloc API架構
四送讲、本地窗口(Native Window)

Native Window為OpenGL與本地窗口系統(tǒng)之間搭建了橋梁奸笤。整個GGUI系統(tǒng)至少需要兩種本地窗口:
(1)面向管理者(SurfaceFlinger)
SurfaceFlinger是系統(tǒng)中所有UI界面的管理者,需要直接或間接的持有“本地窗口”哼鬓,此本地窗口是FramebufferNativeWindow监右。
(2)面向應用程序
這類本地窗口是Surface。

正常情況按照SDK向導生成APK應用程序魄宏,是采用Skia等第三方圖形庫秸侣,而對于希望使用OpenGL ES來完成復雜界面渲染的應用開發(fā)者來說,Android也提供封裝的GLSurfaceView(或其他方式)來實現(xiàn)圖形顯示宠互。

  1. FramebufferNativeWindow
    EGL需要通過本地窗口來為OpenGL/OpenGL ES創(chuàng)建環(huán)境味榛。由于OpenGL/ES對多平臺支持,考慮到兼容性和移植性予跌。不同平臺的本地窗口EGLNativeWindowType數據類型不同搏色。
    Android平臺的數據類型是ANativeWindow,像是一份“協(xié)議”券册,規(guī)定了一個本地窗口的形態(tài)和功能频轿。ANativeWindow是FramebufferNativeWindow的父類。
    Android中烁焙,由于多緩沖技術航邢,EGLNativeWindowType所管理的緩沖區(qū)最少2個,最大3個骄蝇。
    FramebufferNativeWindow初始化需要Golloc支持膳殷,步驟如下:
  • 加載GRALLOC_HARDWARE_MODULE_ID模塊,參見上節(jié)九火。
  • 分別打開fb和gralloc設備赚窃,打開后的設備由全局變量fbDev和grDev管理册招。
  • 根據設備的屬性來給FramebufferNativeWindow賦初值。
  • 根據FramebufferNativeWindow的實現(xiàn)來填充ANativeWindow中的“協(xié)議”
  • 其他一些必要的初始化
  1. 應用程序的本地窗口 - Surface
    Surface也繼承了ANativeWindow
    class Surface : public ANativeObjectBase<ANativeWindow, Surface, RefBase>
    Surface是面向Android系統(tǒng)中所有UI應用程序的勒极,即它承擔著應用進程中的UI顯示需求是掰。
    需要面向上層實現(xiàn)(主要是Java層)提供繪制圖像的畫板。SurfaceFlinger需要收集系統(tǒng)中所有應用程序繪制的圖像數據辱匿,然后集中顯示到物理屏幕上键痛。Surface需要扮演相應角色,本質上還是由SURfaceFlinger服務統(tǒng)一管理的掀鹅,涉及到很多跨進程的通信細節(jié)散休。
  • Surface的創(chuàng)建
    Surface將通過mGraphicBufferProducer來獲取buffer,這些緩沖區(qū)會被記錄在mSlots中數據中。mGraphicBufferProducer這一核心成員的初始化流程如下:
    ViewRootImpl持有一個Java層的Surface對象(mSurface)乐尊。
    ViewRootImpl向WindowManagerService發(fā)起relayout請求戚丸,此時mSurface被賦予真正的有效值,將輾轉生成的SurfaceControl通過Surface.copyFrom()函數復制到mSurface中扔嵌。
    由此限府,Surface由SurfaceControl管理,SurfaceControl由SurfaceComposerClient創(chuàng)建痢缎。SurfaceComposerClient獲得的匿名Binder是ISurfaceComposer胁勺,其服務端實現(xiàn)是SurfaceFlinger。而Surface依賴的IGraphicBufferProducer對象在Service端的實現(xiàn)是BufferQueue独旷。
class SurfaceFlinger : 
  public BinderService<SurfaceFlinger>, //在ServiceManager中注冊為SurfaceFlinger
  public BnSurfaceComposer,//實現(xiàn)的接口卻叫ISurfaceComposer
  1. SurfaceFlinger服務框架
    Buffer署穗,Consumer,Producer是“生產者-消費者”模型中的3個參與對象嵌洼,如何協(xié)調好它們的工作是應用程序能否正常顯示UI的關鍵案疲。
    Buffer是BufferQueue,Producer是應用程序麻养,Consumer是SurfaceFlinger褐啡。
五、BufferQueue詳解

為應用程序服務的本地窗口Surface,其依賴的IGraphicBufferProducer對象在Server端的實現(xiàn)是BufferQueue.
一塊Buffer在處理過程中經歷的生命周期依次是FREE-> DEQUEUED->QUEUED->ACQUIRED->FREE.
BufferQueue中的mSlots數組用于管理期內的緩沖區(qū),最大容器是32.數據緩沖區(qū)的空間是動態(tài)分配的.

應用程序與SurfaceFlinger都是使用OpenGL ES來完成UI顯示的.
Layer類在SurfaceFlinger中表示“層”,通俗地講就是代表了一個“畫面”,最終物理屏幕上的顯示結果就是通過對系統(tǒng)中同時存在的所有“畫面”進行處理而得到的.

注:主要內容摘錄自書籍 深入理解Android內核設計思想鳖昌,林學森 著

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末备畦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子许昨,更是在濱河造成了極大的恐慌懂盐,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件糕档,死亡現(xiàn)場離奇詭異允粤,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門类垫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人琅坡,你說我怎么就攤上這事悉患。” “怎么了榆俺?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵售躁,是天一觀的道長。 經常有香客問我茴晋,道長陪捷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任诺擅,我火速辦了婚禮市袖,結果婚禮上,老公的妹妹穿的比我還像新娘烁涌。我一直安慰自己苍碟,他們只是感情好,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布撮执。 她就那樣靜靜地躺著微峰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪抒钱。 梳的紋絲不亂的頭發(fā)上蜓肆,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天,我揣著相機與錄音谋币,去河邊找鬼仗扬。 笑死,一個胖子當著我的面吹牛瑞信,可吹牛的內容都是我干的厉颤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼凡简,長吁一口氣:“原來是場噩夢啊……” “哼逼友!你這毒婦竟也來了?” 一聲冷哼從身側響起秤涩,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤帜乞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后筐眷,有當地人在樹林里發(fā)現(xiàn)了一具尸體黎烈,經...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了照棋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片资溃。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖烈炭,靈堂內的尸體忽然破棺而出溶锭,到底是詐尸還是另有隱情,我是刑警寧澤符隙,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布趴捅,位于F島的核電站,受9級特大地震影響霹疫,放射性物質發(fā)生泄漏拱绑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一丽蝎、第九天 我趴在偏房一處隱蔽的房頂上張望猎拨。 院中可真熱鬧,春花似錦征峦、人聲如沸迟几。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽类腮。三九已至,卻和暖如春蛉加,著一層夾襖步出監(jiān)牢的瞬間蚜枢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工针饥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留厂抽,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓丁眼,卻偏偏與公主長得像筷凤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子苞七,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內容