Android P 圖形顯示系統(tǒng)(九) Android圖形顯示子系統(tǒng)概述

[TOC]
Android圖形顯示子系統(tǒng)概述

Android圖形顯示系統(tǒng),是Android比較重要的一個(gè)子系統(tǒng),和很多其他子系統(tǒng)的關(guān)聯(lián)緊密。想象一下,沒有圖形顯示系統(tǒng)的手機(jī)是什么樣子,可能連對講機(jī)都不如吧。圖形顯示系統(tǒng)比較復(fù)雜,從Android誕生到現(xiàn)在,幾經(jīng)修改,已經(jīng)變的越來越龐大了??偟恼f來,圖形顯示系統(tǒng)可以分為兩大部分來理解:

  • 圖形系統(tǒng)
  • 顯示系統(tǒng)

圖形系統(tǒng)

圖形系統(tǒng)也就是圖形支持系統(tǒng),提供繪圖和圖形處理支持。包括最初的2D繪圖API Skia,后來的3D繪圖API OpenGLES,RenderScript,OpenCV,到最近的Vulkan。也包括圖片解碼庫,jpg,png,gif等。以及它們所需要的各種Driver支持。

但是Android為了方便大家,我們在做應(yīng)用開發(fā)的時(shí)候,并不用大家直接用各種API去繪制界面,也不用直接用解碼庫去解碼。Android已經(jīng)給大家提供了一個(gè)界面繪制機(jī)制,有很多widget和view,Android的應(yīng)用開發(fā)者,用現(xiàn)有的widget就能夠繪制出比較酷炫的界面。

Android提供的大多view和widget都是2D的繪圖,2D繪圖比較慢,也發(fā)揮不出GPU的作用,因此Android又設(shè)計(jì)了一套加速系統(tǒng),硬件加速。其目的就是將2D的繪圖操作轉(zhuǎn)換為一個(gè)個(gè)的3D(Opengl)繪圖,再采用部分更新的方式,只去重繪界面中有更新的部分view,這樣就大大提升界面繪制的速度。

顯示系統(tǒng)

圖形繪制好了后,需要送到LCD顯示屏上,我們才能看到。繪制界面時(shí),我們只關(guān)心單個(gè)界面,顯示的時(shí)候,可能就有多個(gè)界面了。做過Android應(yīng)該開發(fā)的都知道,我們需要繼承一個(gè)Activity,用Activity呈現(xiàn)我們的界面。Activity的生命周期管理,也就伴隨了窗口的管理。這中間就涉及了兩個(gè)Android中兩個(gè)主要的服務(wù),AMS(ActivityManagerService)和WMS(WindowManagerService)。View,AMS,WMS可以說是整個(gè)上層顯示系統(tǒng)的三駕馬車。

在Android中,一個(gè)窗口用一個(gè)Surface描述。多個(gè)窗口(窗口不一定都是Activity),需要同時(shí)顯示,我們就需要將多個(gè)窗口進(jìn)行合并。這就需要顯示系統(tǒng)中重量級的服務(wù)SurfaceFlinger,Surfaceflinger控制窗口的合成,將多個(gè)窗口合并成一個(gè),再送到LCD。

Surfaceflinger是Native的服務(wù),Surfaceflinger中怎么去描述一個(gè)窗口呢?Surfaceflinger采用圖層的概念,即Layer。SurfaceFlinger合成,就是基于Display HAL的實(shí)現(xiàn),將多個(gè)Layer合并。Display HAL,各個(gè)廠商的實(shí)現(xiàn)就千差萬別了。

Buffer管理

前面討論了怎么繪制,怎么顯示。但是,繪制,繪在什么地方,拿什么去顯示。答案只能是內(nèi)存Buffer。Android的系統(tǒng)中,采用GraphicBuffer對buffer進(jìn)行封裝,而buffer采用ion實(shí)現(xiàn),能在進(jìn)程間共享。

Surface屬性應(yīng)用進(jìn)程,Layer屬于SurfaceFlinger進(jìn)程。如果只用一個(gè)Buffer,那么兩個(gè)進(jìn)程都有可能同時(shí)在用Buffer,這就可能會(huì)造成我們看到的屏幕顯示不對,存在撕裂。另外,只用一個(gè)Buffer,效率也不高啊,繪制本來就是GPU在繪制,顯示這邊是CPU或者是其他的硬件模塊,一個(gè)工作,另外一個(gè)不工作,且不浪費(fèi)。所以Android采用Buffer隊(duì)列的方式,即BufferQueue。繪制的是一個(gè)Buffer,顯示的是一個(gè)buffer,各自處理完后,交換一下Buffer。這樣效率就高很多了。這中間再采用一個(gè)生產(chǎn)者-消費(fèi)者模型,Buffer是載體,Surface應(yīng)用這邊是Producer,SurfaceFlinger這邊是是Consumer。這樣就更好理解了。

顯示系統(tǒng)的架構(gòu)

有了前面的描述,是不是對Android的圖形顯示系統(tǒng)有了大概的認(rèn)識(shí)了?沒有關(guān)系,我們直接來看架構(gòu)圖。架構(gòu)圖來自Androd的官網(wǎng), https://source.android.com/devices/graphics/ ,

Android顯示系統(tǒng)的架構(gòu)

大家可以對照圖再回味一下,前面的描述。有些地方,這個(gè)圖并不能很好的體現(xiàn),不過沒有關(guān)系,接下來我們會(huì)詳細(xì)的介紹各個(gè)模塊和流程。

換一種方式來描述Android的顯示系統(tǒng),架構(gòu)圖如下:


Android顯示系統(tǒng)的架構(gòu)

再和前面Android的圖進(jìn)行對照,是不是更清楚一些了。

這個(gè)圖里,前面的描述里有點(diǎn)沒有說到,SurfaceFlinger到OpenGLES,大家是不是覺得有點(diǎn)奇怪。其實(shí)是這樣的,SurfaceFlinger合成,有兩種方式,ClientDevice。Client就是Client合成完Layer后再將合成后的數(shù)據(jù)給到HWComposer,HWComposer此時(shí)做的工作很少,直接給到Display。Device則是將未合成的Layer,給到硬件合成的設(shè)備,合成完后再給到Display。

可能大家還是很迷茫,沒有關(guān)系~,我們接下來將參照Android的源碼,逐一為大家講解。

從應(yīng)用的角度理解Android

做Android開發(fā),我們都講了太多的架構(gòu),也聽了太多的架構(gòu)。不知道大家有沒有從應(yīng)用的角度去看過Android的系統(tǒng)?我們先來看Android的整體系統(tǒng)架構(gòu)。


Android的整體系統(tǒng)架構(gòu)

Android基于Linux內(nèi)核,我們是不是可以將上層Android理解為Linux內(nèi)核的一個(gè)應(yīng)用。這個(gè)應(yīng)用非常龐大,集集了電話,BT,WiFi,音視頻播放,Camera等功能。

基于Linux內(nèi)核的系統(tǒng)非常的多,比如常用的,Debian系列的Ubuntu,Debian;Redhat系統(tǒng)的RedHat,F(xiàn)edora等。你可以理解Android自成一個(gè)系列。所以,我們也可以基于Linux內(nèi)核去開發(fā)自己的系統(tǒng)。

回到Android,Android在Linux中加了很多驅(qū)動(dòng),再采用硬件抽象的方式,向上提供接口,這就是我們所說的HAL層。所以我們要增加一個(gè)模塊,需要增加Linux驅(qū)動(dòng),然后實(shí)現(xiàn)HAL,以供上層使用。當(dāng)然,我們也可以基于Android的HAL去開發(fā)上層的系統(tǒng),又可以將基于HAL的系統(tǒng)看成一個(gè)應(yīng)用。據(jù)了解,F(xiàn)irefoxOS,360OS,YunOS等,基本都是基于Android的HAL的方式去開發(fā)的(Oops~如有褻瀆,神靈保佑...)。

基于HAL的Android Framework,分為Native Framework和JavaFramework。HAL層是C++寫的,按里說,Native的 Framework應(yīng)該就夠了,什么還要去實(shí)現(xiàn)Java的Framework呢?Android的應(yīng)用大多數(shù)都是用Java開發(fā),中間還有一個(gè)Java虛擬機(jī),和JNI。

其實(shí),這是有歷史原因的?,F(xiàn)在Android已經(jīng)形成了一個(gè)很大的生態(tài)鏈,但是想想當(dāng)初,Android系統(tǒng)剛才發(fā)布,得有開發(fā)者呀,沒有開發(fā)者的支持,如何能形成生態(tài)鏈。所以,Android就采用了這種Java開發(fā)方式,大大籠絡(luò)了Java開發(fā)人員。

再回到我們的顯示子系統(tǒng),Surfaceflinger基于HAL HWComposer,管理和控制著整個(gè)Android的顯示。而上層,則是WMS,AMS,View等系統(tǒng)服務(wù)管理和控制著整個(gè)Android的顯示。

回到上一章給出的Display架構(gòu)圖,我們是不是可以直接基于Native的Framework進(jìn)行應(yīng)用的開發(fā)呢,答案是肯定的。Android也為此提供了NDK,以便于Android Native應(yīng)用的開發(fā)。

下面,讓我們從一個(gè)Native應(yīng)用開始,揭開Android顯示系統(tǒng)的面紗~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容