日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android应用程序请求SurfaceFlinger服务创建Surface的过程分析

發(fā)布時間:2024/4/15 Android 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android应用程序请求SurfaceFlinger服务创建Surface的过程分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章轉(zhuǎn)載至CSDN社區(qū)羅升陽的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/7884628

前面我們已經(jīng)學(xué)習(xí)過Android應(yīng)用程序與SurfaceFlinger服務(wù)的連接過程了。連接上SurfaceFlinger服務(wù)之后,Android應(yīng)用程序就可以請求SurfaceFlinger服務(wù)創(chuàng)建Surface。而當(dāng)有了Surface后,Android應(yīng)用程序就可以用來渲染自己的UI了。在本文中,我們將詳細(xì)分析Android應(yīng)用程序請求SurfaceFlinger服務(wù)創(chuàng)建Surface的過程。

?? ? ? ?在講述Android應(yīng)用程序請求SurfaceFlinger服務(wù)創(chuàng)建Surface之前,我們首先了解一個Surface是由什么組成的。我們可以將Surface理解為一個繪圖表面,Android應(yīng)用程序負(fù)責(zé)往這個繪圖表面填內(nèi)容,而SurfaceFlinger服務(wù)負(fù)責(zé)將這個繪圖表面的內(nèi)容取出來,并且渲染在顯示屏上。

?? ? ? ?在SurfaceFlinger服務(wù)這一側(cè),繪圖表面使用Layer類來描述,Layer類的實(shí)現(xiàn)如圖1所示。


圖1 Layer類的實(shí)現(xiàn)

?? ? ? Layer類繼承了LayerBaseClient類;LayerBaseClient類繼承了LayerBase類;LayerBase類繼續(xù)了RefBase類。從這些繼承關(guān)系就可以看出,我們可以通過Android系統(tǒng)的智能指針來引用Layer對象,從而可以自動地維護(hù)它們的生命周期。

?? ? ? Layer類內(nèi)部的成員變量mUserClientRef指向了一個ClientRef對象,這個ClientRef對象內(nèi)部有一個成員變量mControlBlock,它指向了一個SharedBufferServer對象。從前面Android應(yīng)用程序與SurfaceFlinger服務(wù)之間的共享UI元數(shù)據(jù)(SharedClient)的創(chuàng)建過程分析一文可以知道,SharedBufferServer類是用來在SurfaceFlinger服務(wù)這一側(cè)描述一個UI元數(shù)據(jù)緩沖區(qū)堆棧的,即在SurfaceFlinger服務(wù)中,每一個繪圖表面,即一個Layer對象,都關(guān)聯(lián)有一個UI元數(shù)據(jù)緩沖區(qū)堆棧。

?? ? ? LayerBaseClient類內(nèi)部有一個類型為LayerBaseClient::Surface的弱指針,它引用了一個 Layer::SurfaceLayer對象。這個Layer::SurfaceLayer對象是一個Binder本地對象,它是 SurfaceFlinger服務(wù)用來與Android應(yīng)用程序建立通信的,以便可以共同維護(hù)一個繪圖表面。

?? ? ? Layer::SurfaceLayer類繼承了LayerBaseClient::Surface類,它的實(shí)現(xiàn)如圖2所示。


圖2 SurfaceLayer類的實(shí)現(xiàn)

?? ? ? 理解這個圖需要了解Android系統(tǒng)的Binder進(jìn)程間通信機(jī)制,具體可以參考Android進(jìn)程間通信(IPC)機(jī)制Binder簡要介紹和學(xué)習(xí)計劃一文。從這里就可以看出,Layer::SurfaceLayer類實(shí)現(xiàn)了ISurface接口,而Android應(yīng)用程序就是通過這個接口來和SurfaceFlinger服務(wù)共同維護(hù)一個繪圖表面的。

?? ? ??Layer::SurfaceLayer類內(nèi)部有兩個成員變量mFlinger和mOwner,前者指向了SurfaceFlinger服務(wù),而后者指向了其宿主Layer對象。

?? ? ??ISurface接口定義在文件frameworks/base/include/surfaceflinger/ISurface.h中,它有一個重要的成員函數(shù)requestBuffer,如下所示:

?

[cpp] view plaincopy
  • class?ISurface?:?public?IInterface??
  • {??
  • ????......??
  • ??
  • public:??
  • ????DECLARE_META_INTERFACE(Surface);??
  • ??
  • ????/*?
  • ?????*?requests?a?new?buffer?for?the?given?index.?If?w,?h,?or?format?are?
  • ?????*?null?the?buffer?is?created?with?the?parameters?assigned?to?the?
  • ?????*?surface?it?is?bound?to.?Otherwise?the?buffer's?parameters?are?
  • ?????*?set?to?those?specified.?
  • ?????*/??
  • ????virtual?sp<GraphicBuffer>?requestBuffer(int?bufferIdx,??
  • ????????????uint32_t?w,?uint32_t?h,?uint32_t?format,?uint32_t?usage)?=?0;??
  • ??
  • ????......??
  • ??
  • };??

  • ?? ? ? ?Android應(yīng)用程序就是通過ISurface接口的成員函數(shù)requestBuffer來請求SurfaceFlinger服務(wù)為它的一個繪圖表面分配一個圖形緩沖區(qū)的,這個圖形緩沖區(qū)使用一個GraphicBuffer對象來描述。

    ?? ? ? ?由于Layer::SurfaceLayer是一個Binder本地對象類,因此,就相應(yīng)地有一個Binder代理對象類,它的名稱為BpSurface,它的實(shí)現(xiàn)如圖3所示。


    圖3 BpSurface類的實(shí)現(xiàn)

    ?? ? ? 理解這個圖同樣需要了解Android系統(tǒng)的Binder進(jìn)程間通信機(jī)制,具體可以參考Android進(jìn)程間通信(IPC)機(jī)制Binder簡要介紹和學(xué)習(xí)計劃一文。

    ?? ? ? 以上都是從SurfaceFlinger服務(wù)這一側(cè)來理解一個Surface,下面我們再從Android應(yīng)用程序這一側(cè)來理解一個Surface。

    ?? ? ? 在Android應(yīng)用程序這一側(cè),每一個繪圖表面都使用一個Surface對象來描述,每一個Surface對象都是由一個SurfaceControl對象來創(chuàng)建的。Surface類和SurfaceControl類的關(guān)系以及實(shí)現(xiàn)如圖4所示。


    圖4 Surface類和SurfaceControl類的關(guān)系以及實(shí)現(xiàn)

    ?? ? ? SurfaceControl類的成員變量mClient是一個類型為SurfaceComposerClient的強(qiáng)指針,它指向了Android應(yīng)用程序進(jìn)程中的一個SurfaceComposerClient單例對象。在前面Android應(yīng)用程序與SurfaceFlinger服務(wù)的連接過程分析一 文中,我們已經(jīng)看到過SurfaceComposerClient類的作用了,Android應(yīng)用程序主要就是通過它來和SurfaceFlinger服 務(wù)建立連接的,連接的結(jié)果就是得到一個類型為Client的Binder代理對象,保存它的成員變量mClient中。

    ?? ? ?SurfaceControl類的成員變量mSurface是一個類型為ISurface的強(qiáng)指針,它指向了一個類型為BpSurface的 Binder代理對象,而這個Binder代理對象引用的是一個Layer::SurfaceLayer對象。當(dāng)Android應(yīng)用程序請求 SurfaceFlinger服務(wù)創(chuàng)建一個繪圖表面的時候,SurfaceFlinger服務(wù)就會在內(nèi)部創(chuàng)建一個Layer::SurfaceLayer 對象,并且將這個Layer::SurfaceLayer對象的一個Binder代理對象返回來給Android應(yīng)用程序,然后Android應(yīng)用程序再 將這個Binder代理對象保存在一個SurfaceControl對象的成員變量mSurface中。

    ?? ? ?SurfaceControl類的成員變量mSurfaceData是一個類型為Surface的強(qiáng)指針,它指向了一個Surface對象。

    ?? ? ?Surface類就是用來在Android應(yīng)用程序這一側(cè)描述繪圖表面的,它的成員變量mSurface與它的宿主類SurfaceControl的成 員變量mSurface指向的是同一個Binder代理對象,即它們都引用了在SurfaceFlinger服務(wù)內(nèi)部所創(chuàng)建的一個類型為 Layer::SurfaceLayer的Binder本地對象。

    ?? ? ?Surface類的成員變量mClient指向了Android應(yīng)用程序進(jìn)程中的一個SurfaceClient單例對象。在前面Android應(yīng)用程序與SurfaceFlinger服務(wù)之間的共享UI元數(shù)據(jù)(SharedClient)的創(chuàng)建過程分析一文中,我們已經(jīng)介紹過SurfaceClient類的實(shí)現(xiàn)了,Android應(yīng)用程序就是通過它來請求SurfaceFlinger服務(wù)創(chuàng)建共享UI元數(shù)據(jù)的,并且可以通過它來請求SurfaceFlinger服務(wù)渲染一個繪圖表面。

    ?? ? ?Surface類的成員變量mSharedBufferClient指向了一個SharedBufferClient對象。從前面Android應(yīng)用程序與SurfaceFlinger服務(wù)之間的共享UI元數(shù)據(jù)(SharedClient)的創(chuàng)建過程分析一文可以知道,SharedBufferClient類是用來在Android應(yīng)用程序這一側(cè)描述一個UI元數(shù)據(jù)緩沖區(qū)堆棧的,即在Android應(yīng)用程序中,每一個繪圖表面,即一個Surface對象,都關(guān)聯(lián)有一個UI元數(shù)據(jù)緩沖區(qū)堆棧。

    ?? ? ?Surface類繼承了EGLNativeBase類,而EGLNativeBase類又繼承了ANativeWindow類。我們知 道,Android系統(tǒng)是通過OpenGL庫來繪制UI的。OpenGL庫在繪制UI的時候,需要底層的系統(tǒng)提供一個本地窗口給它,以便它可以將UI繪制 在這個本地窗口上。Android系統(tǒng)為OpenGL庫定提供的本地窗口使用ANativeWindow類來描述,Surface類通過 EGLNativeBase類間接地繼承了ANativeWindow類,因此,Surface類也是用來描述OpenGL繪圖所需要的一個本地窗口的。 從這個角度出發(fā),我們可以將Surface類看作OpenGL庫與Android的UI系統(tǒng)之間的一個橋梁。

    ?? ? ?討論到這里,我們就可以知道,一個繪圖表面,在SurfaceFlinger服務(wù)和Android應(yīng)用程序中分別對應(yīng)有一個Layer對象和一個 Surface對象,這兩個對象在內(nèi)部分別使用一個SharedBufferServer對象和一個SharedBufferClient對象來描述這個 繪圖表面的UI元數(shù)據(jù)緩沖堆棧。在前面Android應(yīng)用程序與SurfaceFlinger服務(wù)之間的共享UI元數(shù)據(jù)(SharedClient)的創(chuàng)建過程分析一文中,我們已經(jīng)分析過這個UI元數(shù)據(jù)的創(chuàng)建過程了,接下來,我們再簡要看一下SharedBufferServer類和SharedBufferClient類的定義。

    ?? ? ?SharedBufferServer類和SharedBufferClient類均是從SharedBufferBase類繼承下來的,如圖5所示。


    圖5 SharedBufferBase、SharedBufferServer和SharedBufferClient的關(guān)系

    ?? ? ?在基類SharedBufferBase中,有三個成員變量mSharedClient、mSharedStack和mIdentity。成員變量 mSharedClient指向一塊UI元數(shù)據(jù)緩沖區(qū),即一個SharedClient對象;成員變量mSharedStack指向一個UI元數(shù)據(jù)堆棧, 即一個SharedBufferStack對象;成員變量mIdentity用來描述一個繪圖表面的ID。

    ?? ? ?在前面Android應(yīng)用程序與SurfaceFlinger服務(wù)之間的共享UI元數(shù)據(jù)(SharedClient)的創(chuàng)建過程分析一 文提到,每一個與UI相關(guān)的Android應(yīng)用程序內(nèi)部都有一個唯一的SharedClient對象,這個SharedClient對象內(nèi)部有一個 SharedBufferStack數(shù)組surfaces,SharedBufferServer類的成員變量mSharedStack所指向的 SharedBufferStack對象,正是成員變量mSharedClient所指向的一個SharedClient對象內(nèi)部的一個 SharedBufferStack數(shù)組的一個元素,這一點(diǎn)可以從SharedBufferServer類的構(gòu)造函數(shù)實(shí)現(xiàn)來看出。

    ?? ? ?SharedBufferServer類的構(gòu)造函數(shù)frameworks/base/libs/surfaceflinger_client/SharedBufferStack.cpp文件中,如下所示:

    ?

    [cpp] view plaincopy
  • SharedBufferBase::SharedBufferBase(SharedClient*?sharedClient,??
  • ????????int?surface,?int32_t?identity)??
  • ????:?mSharedClient(sharedClient),??
  • ??????mSharedStack(sharedClient->surfaces?+?surface),??
  • ??????mIdentity(identity)??
  • {??
  • }??
  • ?? ? ? 其中,參數(shù)surface表示mSharedStack指向的是mSharedClient中的SharedBufferStack數(shù)組surfaces的第幾個元素。

    ?? ? ? 在SharedBufferClient類中,有三個成員變量mNumBuffers、tail和queue_head,它們的含義可以參考前面Android應(yīng)用程序與SurfaceFlinger服務(wù)的關(guān)系概述和學(xué)習(xí)計劃一文中的圖6,如下所示。

    圖6 SharedBufferClient眼中的SharedBufferStack?

    ?? ? ? 在Android應(yīng)用程序這一側(cè),當(dāng)它需要渲染一個Surface時,它就會首先找到對應(yīng)的SharedBufferClient對象,然后再調(diào)用它的成 員函數(shù)dequeue來請求分配一個UI元數(shù)據(jù)緩沖區(qū)。有了這個UI元數(shù)據(jù)緩沖區(qū)之后,Android應(yīng)用程序再調(diào)用這個 SharedBufferClient對象的成員函數(shù)setDirtyRegion、setCrop和setTransform來設(shè)置對應(yīng)的 Surface的裁剪區(qū)域、紋理坐標(biāo)以及旋轉(zhuǎn)方向。此外,Android應(yīng)用程序還會請求SurfaceFlinger服務(wù)為這個Surface分配一個 圖形緩沖區(qū),以便可以往這個圖形緩沖區(qū)寫入實(shí)際的UI數(shù)據(jù)。最后,Android應(yīng)用程序就可以調(diào)用這個SharedBufferClient對象的成員 函數(shù)queue把前面已經(jīng)準(zhǔn)備好了的UI元數(shù)據(jù)緩沖區(qū)加入到它所描述的一個UI元數(shù)據(jù)緩沖區(qū)堆棧的待渲染隊(duì)列中,以便SurfaceFlinger服務(wù)可 以在合適的時候?qū)λM(jìn)行渲染。這個過程我們在下一篇文章中再詳細(xì)分析。

    ?? ? ??SharedBufferServer類的成員變量mNumBuffers的含義可以參考前面Android應(yīng)用程序與SurfaceFlinger服務(wù)的關(guān)系概述和學(xué)習(xí)計劃一文中的圖7,如下所示。

    圖7 SharedBufferServer眼中的SharedBufferStack

    ?? ? ? ?當(dāng)SurfaceFlinger服務(wù)需要渲染一個Surface的時候,它就會找到對應(yīng)的一個SharedBufferServer對象,然后調(diào)用它的 成員函數(shù)getQueueCount來檢查它所描述的一個UI元數(shù)據(jù)緩沖區(qū)堆棧的待渲染隊(duì)列的大小。如果這個大小大于0,那么 SurfaceFlinger服務(wù)就會繼續(xù)調(diào)用它的成員函數(shù)retireAndLock來取出隊(duì)列中的第一個UI元數(shù)據(jù)緩沖區(qū),以及調(diào)用它的成員函數(shù) getDirtyRegion、getCrop和getTransform來獲得要渲染的Surface的裁剪區(qū)域、紋理坐標(biāo)和旋轉(zhuǎn)方向。最 后,SurfaceFlinger服務(wù)就可以結(jié)合這些信息來將保存這個Surface的圖形緩沖區(qū)中的UI數(shù)據(jù)渲染在顯示屏中。這個過程我們同樣在下一篇 文章中再詳細(xì)分析。

    ?? ? ??SharedBufferServer類的另外一個成員變量mBufferList指向了一個BufferList對象,這個BufferList對 象是用來管理SharedBufferServer類所描述的一個UI元數(shù)據(jù)緩沖區(qū)堆棧的,接下來我們就簡要分析它的定義。

    ?? ? ??BufferList類定義在frameworks/base/include/private/surfaceflinger/SharedBufferStack.h文件中,如下所示:

    ?

    [cpp] view plaincopy
  • class?SharedBufferServer??
  • ????:?public?SharedBufferBase,??
  • ??????public?LightRefBase<SharedBufferServer>??
  • {??
  • ????......??
  • ??
  • private:??
  • ????......??
  • ??
  • ????/*?
  • ?????*?BufferList?is?basically?a?fixed-capacity?sorted-vector?of?
  • ?????*?unsigned?5-bits?ints?using?a?32-bits?int?as?storage.?
  • ?????*?it?has?efficient?iterators?to?find?items?in?the?list?and?not?in?the?list.?
  • ?????*/??
  • ????class?BufferList?{??
  • ????????size_t?mCapacity;??
  • ????????uint32_t?mList;??
  • ????public:??
  • ????????BufferList(size_t?c?=?SharedBufferStack::NUM_BUFFER_MAX)??
  • ????????????:?mCapacity(c),?mList(0)?{?}??
  • ????????status_t?add(int?value);??
  • ????????status_t?remove(int?value);??
  • ????????uint32_t?getMask()?const?{?return?mList;?}??
  • ??
  • ????????class?const_iterator?{??
  • ????????????friend?class?BufferList;??
  • ????????????uint32_t?mask,?curr;??
  • ????????????const_iterator(uint32_t?mask)?:??
  • ????????????????mask(mask),?curr(__builtin_clz(mask))?{??
  • ????????????}??
  • ????????public:??
  • ????????????inline?bool?operator?==?(const?const_iterator&?rhs)?const?{??
  • ????????????????return?mask?==?rhs.mask;??
  • ????????????}??
  • ????????????inline?bool?operator?!=?(const?const_iterator&?rhs)?const?{??
  • ????????????????return?mask?!=?rhs.mask;??
  • ????????????}??
  • ????????????inline?int?operator?*()?const?{?return?curr;?}??
  • ????????????inline?const?const_iterator&?operator?++()?{??
  • ????????????????mask?&=?~(1<<(31-curr));??
  • ????????????????curr?=?__builtin_clz(mask);??
  • ????????????????return?*this;??
  • ????????????}??
  • ????????};??
  • ??
  • ????????inline?const_iterator?begin()?const?{??
  • ????????????return?const_iterator(mList);??
  • ????????}??
  • ????????inline?const_iterator?end()?const???{??
  • ????????????return?const_iterator(0);??
  • ????????}??
  • ????????inline?const_iterator?free_begin()?const?{??
  • ????????????uint32_t?mask?=?(1?<<?(32-mCapacity))?-?1;??
  • ????????????return?const_iterator(?~(mList?|?mask)?);??
  • ????????}??
  • ????};??
  • ??
  • ????......??
  • };??
  • ?? ? ? BufferList類的成員變量mCapacity對應(yīng)于一個UI元數(shù)據(jù)緩沖區(qū)堆棧的容量,即最大緩沖區(qū)個數(shù)。

    ?? ? ? BufferList類的另外一個成員變量變量mList用來描述這個堆棧中的緩沖區(qū)哪個是空閑的,哪個是正在使用的。空閑的緩沖區(qū)對應(yīng)的位為0,而正在 使用的緩沖區(qū)對應(yīng)的位為1。舉個例子,假如一個UI元數(shù)據(jù)緩沖區(qū)堆棧的大小為5,其中,第1、3、5個數(shù)據(jù)緩沖區(qū)是正在使用的,而第2、4個數(shù)據(jù)緩沖區(qū)是 空閑的,那么對應(yīng)的mList的值就等于10101000 00000000 00000000 00000000。當(dāng)我們需要將第2個數(shù)據(jù)緩沖區(qū)設(shè)置為正在使用時,那么只要調(diào)用成員函數(shù)add來將左起第2位設(shè)置為1即可,即得到mList的值就等于 11101000 00000000 00000000 00000000,而當(dāng)我們需要將第1個數(shù)據(jù)緩沖區(qū)設(shè)置為空閑時,那么只要調(diào)用成員函數(shù)remove來將左起第1位設(shè)置為0即可,即得到mList的值就 等于00101000 00000000 00000000 00000000。

    ?? ? ?在BufferList類內(nèi)部定義了一個迭代器const_iterator,用來從左到右遍歷一個UI元數(shù)據(jù)緩沖區(qū)堆棧中的正在使用或者空閑的緩沖區(qū)。仍然以前面的例子為例,當(dāng) 我們調(diào)用BufferList類的成員函數(shù)begin時,就可以得到一個const_iterator迭代器,沿著這個迭代器往前走,就可以依次遍歷第 1、3、5個正在使用的緩沖區(qū),而當(dāng)我們調(diào)用BufferList類的成員函數(shù)free_begin時,就可以得到另外一個const_iterator 迭代器,沿著這個迭代器往前走,就可以依次遍歷第2、4個空閑的緩沖區(qū)。

    ?? ? ?關(guān)于Surface的概念我們就分析到這里。從這些分析可以知道,當(dāng)Android應(yīng)用程序請求SurfaceFlinger服務(wù)創(chuàng)建一個 Surface的時候,需要在SurfaceFlinger服務(wù)這一側(cè)創(chuàng)建一個Layer對象、一個Layer::SurfaceLayer對象和一個 SharedBufferServer對象,同時又需要在Android應(yīng)用程序這一側(cè)創(chuàng)建一個SurfaceControl對象、一個Surface對 象和一個SharedBufferClient對象。

    ?? ? ?在進(jìn)一步分析Android應(yīng)用程序請求SurfaceFlinger服務(wù)創(chuàng)建Surface的過程之前,我們首先看一下Android系統(tǒng)的開機(jī)動畫 應(yīng)用程序bootanim是如何請求SurfaceFlinger服務(wù)創(chuàng)建一個Surface來顯示開機(jī)動畫的。

    ?? ? ?在前面Android系統(tǒng)的開機(jī)畫面顯示過程分析一文中, 我們分析Android系統(tǒng)的開機(jī)動畫的顯示過程,其中,開機(jī)動畫應(yīng)用程序bootanim是在BootAnimation類的成員函數(shù)readyToRun中請求SurfaceFlinger服務(wù)創(chuàng)建一個用來顯示開機(jī)動畫的Surface的,如下所示:

    [cpp] view plaincopy
  • status_t?BootAnimation::readyToRun()?{????
  • ????......??
  • ??
  • ????//?create?the?native?surface????
  • ????sp<SurfaceControl>?control?=?session()->createSurface(????
  • ????????????getpid(),?0,?dinfo.w,?dinfo.h,?PIXEL_FORMAT_RGB_565);????
  • ????......????
  • ????
  • ????sp<Surface>?s?=?control->getSurface();??
  • ??
  • ????......??
  • }????
  • ?? ? ?BootAnimation類的成員函數(shù)session返回的是一個SurfaceComposerClient對象。有了這個 SurfaceComposerClient對象之后,我們就可以調(diào)用它的成員函數(shù)createSurface來請求請求SurfaceFlinger服 務(wù)在內(nèi)部創(chuàng)建一個Layer::SurfaceLayer對象,并且將這個Layer::SurfaceLayer對象的代理對象返回來給 SurfaceComposerClient類,SurfaceComposerClient類接著就將這個Layer::SurfaceLayer代理 對象封裝成一個SurfaceControl對象,并且返回給BootAnimation類,最后BootAnimation類就可以調(diào)用這個 SurfaceControl對象的成員函數(shù)getSurface來獲得一個Surface對象。

    ?? ? ?接下來,我們就從SurfaceComposerClient類的成員函數(shù)createSurface開始描述Android應(yīng)用程序請求SurfaceFlinger服務(wù)創(chuàng)建Surface的過程,如圖8所示。

    圖8 Android應(yīng)用程序請求SurfaceFlinger服務(wù)創(chuàng)建Surface的過程?

    ?? ? ? 這個過程可以劃分為20個步驟,接下來我們就詳細(xì)分析每一個步驟。

    ?? ? ? Step 1.?SurfaceComposerClient.createSurface

    [cpp] view plaincopy
  • sp<SurfaceControl>?SurfaceComposerClient::createSurface(??
  • ????????int?pid,??
  • ????????DisplayID?display,??
  • ????????uint32_t?w,??
  • ????????uint32_t?h,??
  • ????????PixelFormat?format,??
  • ????????uint32_t?flags)??
  • {??
  • ????String8?name;??
  • ????const?size_t?SIZE?=?128;??
  • ????char?buffer[SIZE];??
  • ????snprintf(buffer,?SIZE,?"<pid_%d>",?getpid());??
  • ????name.append(buffer);??
  • ??
  • ????return?SurfaceComposerClient::createSurface(pid,?name,?display,??
  • ????????????w,?h,?format,?flags);??
  • }??
  • ?? ? ? 這個函數(shù)定義在文件frameworks/base/libs/surfaceflinger_client/SurfaceComposerClient.cpp文件中。

    ?? ? ? 參數(shù)pid用來描述當(dāng)前進(jìn)程的PID,參數(shù)display的值等于0,表示要在第一個顯示屏上創(chuàng)建一個Surface,參數(shù)w和h表示要創(chuàng)建的 Surface的寬度和高度,它們的值剛好等于第一個顯示屏的寬度和高度,參數(shù)format的值等于PIXEL_FORMAT_RGB_565,表示要創(chuàng) 建的Surface的像素格式為PIXEL_FORMAT_RGB_565,即每一個點(diǎn)使用2個字節(jié)來描述,其中,R、G和B分量分別占5位、6位和5 位,參數(shù)flags是一個默認(rèn)參數(shù),它等于默認(rèn)值0,表示要創(chuàng)建的Surface的用途。

    ?? ? ? 這個函數(shù)將參數(shù)pid格式化成一個字符串之后,再調(diào)用SurfaceComposerClient類的另外一個版本的成員函數(shù)createSurface來請求SurfaceFlinger服務(wù)創(chuàng)建一個Surface,如下所示:

    [cpp] view plaincopy
  • sp<SurfaceControl>?SurfaceComposerClient::createSurface(??
  • ????????int?pid,??
  • ????????const?String8&?name,??
  • ????????DisplayID?display,??
  • ????????uint32_t?w,??
  • ????????uint32_t?h,??
  • ????????PixelFormat?format,??
  • ????????uint32_t?flags)??
  • {??
  • ????sp<SurfaceControl>?result;??
  • ????if?(mStatus?==?NO_ERROR)?{??
  • ????????ISurfaceComposerClient::surface_data_t?data;??
  • ????????sp<ISurface>?surface?=?mClient->createSurface(&data,?pid,?name,??
  • ????????????????display,?w,?h,?format,?flags);??
  • ????????if?(surface?!=?0)?{??
  • ????????????result?=?new?SurfaceControl(this,?surface,?data,?w,?h,?format,?flags);??
  • ????????}??
  • ????}??
  • ????return?result;??
  • }??

  • ?? ? ? SurfaceComposerClient類的成員變量mClient指向了一個類型為BpSurfaceComposerClient的Binder 代理對象,它引用了一個類型為Client的Binder本地對象。這個類型Client的Binder本地對象是在SurfaceFlinger服務(wù)內(nèi) 部創(chuàng)建的,用來和Android應(yīng)用程序建立連接。連接的過程可以參考前面Android應(yīng)用程序與SurfaceFlinger服務(wù)的連接過程分析一文。

    ?? ? ??SurfaceComposerClient類的成員函數(shù)createSurface調(diào)用成員變量mClient的成員函數(shù) createSurface請求SurfaceFlinger服務(wù)創(chuàng)建一個Surface之后,就得到了一個類型為BpSurface的Binder代理 對象surface。從前面的描述可以知道,Binder代理對象surface引用了在SurfaceFlinger服務(wù)這一側(cè)的一個 Layer::SurfaceLayer對象。此外,SurfaceComposerClient類的成員函數(shù)createSurface還得到了一個 surface_data_t對象data,它里面包含了剛才所創(chuàng)建的一個Surface的信息,例如,寬度、高度、像素格式和ID值等。

    ?? ? ?最后,SurfaceComposerClient類的成員函數(shù)createSurface就將SurfaceFlinger服務(wù)返回來的Binder 代理對象surface和surface_data_t對象data封裝成一個SurfaceControl對象result,并且返回給調(diào)用者。接下 來,我們首先分析SurfaceFlinger服務(wù)創(chuàng)建Surface的過程,接著再分析SurfaceControl對象result的封裝過程。

    ?? ? ?Step 2. Client.createSurface

    [cpp] view plaincopy
  • sp<ISurface>?Client::createSurface(??
  • ????????ISurfaceComposerClient::surface_data_t*?params,?int?pid,??
  • ????????const?String8&?name,??
  • ????????DisplayID?display,?uint32_t?w,?uint32_t?h,?PixelFormat?format,??
  • ????????uint32_t?flags)??
  • {??
  • ????return?mFlinger->createSurface(this,?pid,?name,?params,??
  • ????????????display,?w,?h,?format,?flags);??
  • }??
  • ?? ? ?這個函數(shù)定義在文件frameworks/base/services/surfaceflinger/SurfaceFlinger.cpp中。

    ?? ? ?Client類的成員變量mFlinger指向了SurfaceFlinger服務(wù),因此,接下來就會調(diào)用SurfaceFlinger類的成員函數(shù)createSurface來創(chuàng)建一個Surface。

    ?? ? ?Step 3.?SurfaceFlinger.createSurface

    [cpp] view plaincopy
  • sp<ISurface>?SurfaceFlinger::createSurface(const?sp<Client>&?client,?int?pid,??
  • ????????const?String8&?name,?ISurfaceComposerClient::surface_data_t*?params,??
  • ????????DisplayID?d,?uint32_t?w,?uint32_t?h,?PixelFormat?format,??
  • ????????uint32_t?flags)??
  • {??
  • ????sp<LayerBaseClient>?layer;??
  • ????sp<LayerBaseClient::Surface>?surfaceHandle;??
  • ??
  • ????if?(int32_t(w|h)?<?0)?{??
  • ????????LOGE("createSurface()?failed,?w?or?h?is?negative?(w=%d,?h=%d)",??
  • ????????????????int(w),?int(h));??
  • ????????return?surfaceHandle;??
  • ????}??
  • ??
  • ????//LOGD("createSurface?for?pid?%d?(%d?x?%d)",?pid,?w,?h);??
  • ????sp<Layer>?normalLayer;??
  • ????switch?(flags?&?eFXSurfaceMask)?{??
  • ????????case?eFXSurfaceNormal:??
  • ????????????if?(UNLIKELY(flags?&?ePushBuffers))?{??
  • ????????????????layer?=?createPushBuffersSurface(client,?d,?w,?h,?flags);??
  • ????????????}?else?{??
  • ????????????????normalLayer?=?createNormalSurface(client,?d,?w,?h,?flags,?format);??
  • ????????????????layer?=?normalLayer;??
  • ????????????}??
  • ????????????break;??
  • ????????case?eFXSurfaceBlur:??
  • ????????????layer?=?createBlurSurface(client,?d,?w,?h,?flags);??
  • ????????????break;??
  • ????????case?eFXSurfaceDim:??
  • ????????????layer?=?createDimSurface(client,?d,?w,?h,?flags);??
  • ????????????break;??
  • ????}??
  • ??
  • ????if?(layer?!=?0)?{??
  • ????????layer->initStates(w,?h,?flags);??
  • ????????layer->setName(name);??
  • ????????ssize_t?token?=?addClientLayer(client,?layer);??
  • ??
  • ????????surfaceHandle?=?layer->getSurface();??
  • ????????if?(surfaceHandle?!=?0)?{??
  • ????????????params->token?=?token;??
  • ????????????params->identity?=?surfaceHandle->getIdentity();??
  • ????????????params->width?=?w;??
  • ????????????params->height?=?h;??
  • ????????????params->format?=?format;??
  • ????????????if?(normalLayer?!=?0)?{??
  • ????????????????Mutex::Autolock?_l(mStateLock);??
  • ????????????????mLayerMap.add(surfaceHandle->asBinder(),?normalLayer);??
  • ????????????}??
  • ????????}??
  • ??
  • ????????setTransactionFlags(eTransactionNeeded);??
  • ????}??
  • ??
  • ????return?surfaceHandle;??
  • }??
  • ?? ? ??這個函數(shù)定義在文件frameworks/base/services/surfaceflinger/SurfaceFlinger.cpp中。

    ?? ? ? 第一個if語句判斷參數(shù)w和h的值是否為負(fù)數(shù),如果是的話,那么就直接出錯返回了,因?yàn)閯?chuàng)建的Surface的寬度和高度值不可能為負(fù)數(shù)。

    ?? ? ??eFXSurfaceNormal、eFXSurfaceBlur、eFXSurfaceDim和eFXSurfaceMask是四個枚舉值,它們定 義在文件frameworks/base/include/surfaceflinger/ISurfaceComposer.h中,如下所示:

    [cpp] view plaincopy
  • class?ISurfaceComposer?:?public?IInterface??
  • {??
  • public:??
  • ????......??
  • ??
  • ????enum?{?//?(keep?in?sync?with?Surface.java)??
  • ????????......??
  • ????????ePushBuffers????????=?0x00000200,??
  • ??
  • ????????eFXSurfaceNormal????=?0x00000000,??
  • ????????eFXSurfaceBlur??????=?0x00010000,??
  • ????????eFXSurfaceDim???????=?0x00020000,??
  • ????????eFXSurfaceMask??????=?0x000F0000,??
  • ????};??
  • ??
  • ????......??
  • };??
  • ?? ? ? 回到SurfaceFlinger類的成員函數(shù)createSurface中,參數(shù)flags的值等于0,因此,在接下來的switch語句中,會調(diào)用 SurfaceFlinger類的成員函數(shù)createNormalSurface來在顯示屏上創(chuàng)建一個Layer。順便提一句,如果參數(shù)flags的值 等于eFXSurfaceBlur或者eFXSurfaceDim,那么就表示要創(chuàng)建的是一個模糊或者漸變的Surface,這兩種類型的Surface 是在原有的一個Surface上進(jìn)行創(chuàng)建的,用來對原來的Surface進(jìn)行模糊或者漸變處理。

    ?? ? ? ?前面所創(chuàng)建的Layer保存在變量layer中,接下來SurfaceFlinger類的成員函數(shù)createNormalSurface會調(diào)用來另外 一個成員函數(shù)addClientLayer來將它保存在內(nèi)部的一個列表中,接著再調(diào)用前面所創(chuàng)建的Layer的成員函數(shù)getSurface來獲得一個 Layer::SurfaceLayer對象surfaceHandle。

    ?? ? ? ?在將Layer::SurfaceLayer對象surfaceHandle的一個Binder代理對象返回給Android應(yīng)用程序之 前,SurfaceFlinger類的成員函數(shù)createNormalSurface還會以它的一個IBinder接口為關(guān)鍵字,將前面所創(chuàng)建的 Layer保存在SurfaceFlinger類的成員變量mLayerMap所描述的一個Map中,這樣就可以將一個 Layer::SurfaceLayer對象surfaceHandle與它的宿主Layer對象關(guān)聯(lián)起來。

    ?? ? ? ?接下來,我們首先分析SurfaceFlinger類的成員函數(shù)createNormalSurface和addClientLayer的實(shí)現(xiàn),接著再分析Layer的成員函數(shù)getSurface的實(shí)現(xiàn),以便可以了解一個Surface的創(chuàng)建的過程。

    ?? ? ? ?Step 4.?SurfaceFlinger.createNormalSurface

    [cpp] view plaincopy
  • sp<Layer>?SurfaceFlinger::createNormalSurface(??
  • ????????const?sp<Client>&?client,?DisplayID?display,??
  • ????????uint32_t?w,?uint32_t?h,?uint32_t?flags,??
  • ????????PixelFormat&?format)??
  • {??
  • ????//?initialize?the?surfaces??
  • ????switch?(format)?{?//?TODO:?take?h/w?into?account??
  • ????case?PIXEL_FORMAT_TRANSPARENT:??
  • ????case?PIXEL_FORMAT_TRANSLUCENT:??
  • ????????format?=?PIXEL_FORMAT_RGBA_8888;??
  • ????????break;??
  • ????case?PIXEL_FORMAT_OPAQUE:??
  • #ifdef?NO_RGBX_8888??
  • ????????format?=?PIXEL_FORMAT_RGB_565;??
  • #else??
  • ????????format?=?PIXEL_FORMAT_RGBX_8888;??
  • #endif??
  • ????????break;??
  • ????}??
  • ??
  • #ifdef?NO_RGBX_8888??
  • ????if?(format?==?PIXEL_FORMAT_RGBX_8888)??
  • ????????format?=?PIXEL_FORMAT_RGBA_8888;??
  • #endif??
  • ??
  • ????sp<Layer>?layer?=?new?Layer(this,?display,?client);??
  • ????status_t?err?=?layer->setBuffers(w,?h,?format,?flags);??
  • ????if?(LIKELY(err?!=?NO_ERROR))?{??
  • ????????LOGE("createNormalSurfaceLocked()?failed?(%s)",?strerror(-err));??
  • ????????layer.clear();??
  • ????}??
  • ????return?layer;??
  • }??
  • ?? ? ? 這個函數(shù)定義在文件frameworks/base/services/surfaceflinger/SurfaceFlinger.cpp中。

    ?? ? ? 函數(shù)開頭的switch語句判斷要創(chuàng)建的Surface是否要使用透明色。如果要使用的話,那么就將參數(shù)format的值修改為 PIXEL_FORMAT_RGBA_8888。另一方面,如果要創(chuàng)建的Surface不需要使用透明色,那么就將參數(shù)format的值修改為 PIXEL_FORMAT_RGB_565或者PIXEL_FORMAT_RGBX_8888,取決于是否定義了宏NO_RGBX_8888。

    ?? ? ?函數(shù)接下來創(chuàng)建了一個Layer對象,并且調(diào)用這個Layer對象的成員函數(shù)setBuffers來在內(nèi)部創(chuàng)建一個Layer::SurfaceLayer對象,最后就將這個Layer對象返回給調(diào)用者。

    ?? ? ?接下來,我們首先分析Layer對象的創(chuàng)建過程,接著再分析Layer對象的成員函數(shù)setBuffers的實(shí)現(xiàn)。

    ?? ? ?Step 5. new Layer

    [cpp] view plaincopy
  • Layer::Layer(SurfaceFlinger*?flinger,??
  • ????????DisplayID?display,?const?sp<Client>&?client)??
  • ????:???LayerBaseClient(flinger,?display,?client),??
  • ????????mGLExtensions(GLExtensions::getInstance()),??
  • ????????mNeedsBlending(true),??
  • ????????mNeedsDithering(false),??
  • ????????mSecure(false),??
  • ????????mTextureManager(),??
  • ????????mBufferManager(mTextureManager),??
  • ????????mWidth(0),?mHeight(0),?mNeedsScaling(false),?mFixedSize(false),??
  • ????????mBypassState(false)??
  • {??
  • }??
  • ?? ? ?這個函數(shù)定義在文件frameworks/base/services/surfaceflinger/Layer.cpp中。

    ?? ? ?Layer類的構(gòu)造函數(shù)只是執(zhí)行一些簡單的初始化工作,接下來我們再繼續(xù)分析它的進(jìn)一步初始化工作,這是通過Layer類的成員函數(shù)setBuffers來實(shí)現(xiàn)的。

    ?? ? ?Step 6. Layer.setBuffers

    [cpp] view plaincopy
  • status_t?Layer::setBuffers(?uint32_t?w,?uint32_t?h,??
  • ????????????????????????????PixelFormat?format,?uint32_t?flags)??
  • {??
  • ????//?this?surfaces?pixel?format??
  • ????PixelFormatInfo?info;??
  • ????status_t?err?=?getPixelFormatInfo(format,?&info);??
  • ????if?(err)?return?err;??
  • ??
  • ????//?the?display's?pixel?format??
  • ????const?DisplayHardware&?hw(graphicPlane(0).displayHardware());??
  • ????uint32_t?const?maxSurfaceDims?=?min(??
  • ????????????hw.getMaxTextureSize(),?hw.getMaxViewportDims());??
  • ??
  • ????//?never?allow?a?surface?larger?than?what?our?underlying?GL?implementation??
  • ????//?can?handle.??
  • ????if?((uint32_t(w)>maxSurfaceDims)?||?(uint32_t(h)>maxSurfaceDims))?{??
  • ????????return?BAD_VALUE;??
  • ????}??
  • ??
  • ????PixelFormatInfo?displayInfo;??
  • ????getPixelFormatInfo(hw.getFormat(),?&displayInfo);??
  • ????const?uint32_t?hwFlags?=?hw.getFlags();??
  • ??
  • ????mFormat?=?format;??
  • ????mWidth??=?w;??
  • ????mHeight?=?h;??
  • ??
  • ????mReqFormat?=?format;??
  • ????mReqWidth?=?w;??
  • ????mReqHeight?=?h;??
  • ??
  • ????mSecure?=?(flags?&?ISurfaceComposer::eSecure)???true?:?false;??
  • ????mNeedsBlending?=?(info.h_alpha?-?info.l_alpha)?>?0;??
  • ??
  • ????//?we?use?the?red?index??
  • ????int?displayRedSize?=?displayInfo.getSize(PixelFormatInfo::INDEX_RED);??
  • ????int?layerRedsize?=?info.getSize(PixelFormatInfo::INDEX_RED);??
  • ????mNeedsDithering?=?layerRedsize?>?displayRedSize;??
  • ??
  • ????mSurface?=?new?SurfaceLayer(mFlinger,?this);??
  • ????return?NO_ERROR;??
  • }??
  • ?? ? ??這個函數(shù)定義在文件frameworks/base/services/surfaceflinger/Layer.cpp中。

    ?? ? ? 參數(shù)format是一個整數(shù)值,用來描述要創(chuàng)建的Surface的像素格式,函數(shù)首先調(diào)用另外一個函數(shù)getPixelFormatInfo來將它轉(zhuǎn)換為 一個PixelFormatInfo對象info,以便可以獲得更多的該種類型的像素格式的信息,例如,一個像素點(diǎn)占多少個字節(jié),每個顏色分量又分別占多 少位等。函數(shù)getPixelFormatInfo定義文件frameworks/base/libs/ui/PixelFormat.cpp文件中,有 興趣的讀者可以自己研究一下。

    ?? ? ? Layer類的成員函數(shù)graphicPlane是從父類LayerBase繼承下來,用來獲得系統(tǒng)的第N個顯示屏,這個成員函數(shù)最終又是通過調(diào)用SurfaceFlinger類的成員函數(shù)graphicPlane來實(shí)現(xiàn)的,如下所示:

    [cpp] view plaincopy
  • const?GraphicPlane&?LayerBase::graphicPlane(int?dpy)?const??
  • {??
  • ????return?mFlinger->graphicPlane(dpy);??
  • }??
  • ?? ? ?SurfaceFlinger類的成員函數(shù)graphicPlane的實(shí)現(xiàn)如下示:

    [cpp] view plaincopy
  • const?GraphicPlane&?SurfaceFlinger::graphicPlane(int?dpy)?const??
  • {??
  • ????LOGE_IF(uint32_t(dpy)?>=?DISPLAY_COUNT,?"Invalid?DisplayID?%d",?dpy);??
  • ????const?GraphicPlane&?plane(mGraphicPlanes[dpy]);??
  • ????return?plane;??
  • }??
  • ?? ? ?SurfaceFlinger類有一個類型為DisplayHardware的數(shù)組,它的大小等于4,表示Android系統(tǒng)最多支持4個顯示屏,每一 個顯示屏都使用一個DisplayHardware對象來描述。實(shí)際上,Android系統(tǒng)目前只支持一個顯示屏,因此,在調(diào)用 SurfaceFlinger類的成員函數(shù)graphicPlane的時候,傳進(jìn)來的參數(shù)dpy的值都是等于0。

    ?? ? ?回到Layer類的成員函數(shù)setBuffers中,它接下來獲得了用來描述系統(tǒng)第1個顯示屏的DisplayHardware對象hw,接著再調(diào)用函 數(shù)getPixelFormatInfo來獲得用來描述該顯示屏的像素格式信息的PixelFormatInfo對象displayInfo。

    ?? ? ?Layer類的成員函數(shù)setBuffers接下來再將要創(chuàng)建的Surface的像素格式以及大小記錄下來,即分別將參數(shù)format、w和h的值保存 在成員變量mFormat、mWidth、mHeight和mReqFormat、mReqWidth、mReqHeight中。

    ?? ? ?Layer類的成員函數(shù)setBuffers接下來再檢查參數(shù)flags的ISurfaceComposer::eSecure位是否等于1。如果等于 1的話,就將成員變量mSecure的值設(shè)置為true,否則就設(shè)置為false。當(dāng)參數(shù)flags的 ISurfaceComposer::eSecure位等于1的時候,就表示正在創(chuàng)建的Surface的UI數(shù)據(jù)是可以安全地從一個進(jìn)程拷貝到另外一個進(jìn) 程的。有些Surface的UI數(shù)據(jù)是不可以隨便拷貝的,因?yàn)檫@涉及到安全問題,例如,用來創(chuàng)建屏幕截圖的Surface的UI數(shù)據(jù)就是不可以隨便從一個 進(jìn)程拷貝到另外一個進(jìn)程的,因?yàn)槠聊唤貓D可能會包含隱私信息。

    ?? ? ?Layer類的成員函數(shù)setBuffers接下來又檢查要創(chuàng)建的Surface的像素格式的Alpha通道的高8位是否大于低8位。如果是的話,就將成員變量mNeedsBlending的值設(shè)置為true,表示在渲染時要執(zhí)行混合操作。

    ?? ? ?Layer類的成員函數(shù)setBuffers接下來還檢查要創(chuàng)建的Surface的像素格式的Red通道的大小是否大于系統(tǒng)第1個顯示屏的像素格式的 Red通道的大小。如果是的話,就將成員變量mNeedsDithering的值設(shè)置為true,表示在渲染時要執(zhí)行抖動操作。

    ?? ? ?最后,Layer類的成員函數(shù)setBuffers就創(chuàng)建了一個SurfaceLayer對象,并且保存成員變量mSurface中。

    ?? ? ?接下來,我們就繼續(xù)分析SurfaceLayer對象的創(chuàng)建過程。

    ?? ? ?Step 7. new SurfaceLayer

    [cpp] view plaincopy
  • Layer::SurfaceLayer::SurfaceLayer(const?sp<SurfaceFlinger>&?flinger,??
  • ????????const?sp<Layer>&?owner)??
  • ????:?Surface(flinger,?owner->getIdentity(),?owner)??
  • {??
  • }??
  • ?? ? ? 這個函數(shù)定義在文件frameworks/base/services/surfaceflinger/Layer.cpp中。

    ?? ? ? SurfaceLayer類的構(gòu)造函數(shù)的實(shí)現(xiàn)很簡單,它只是使用參數(shù)flinger以及owner來初始其父類Surface,其中,參數(shù)flinger 指向的是SurfaceFlinger服務(wù),而參數(shù)owner指向的是正在創(chuàng)建的SurfaceLayer對象的宿主Layer對象。

    ?? ? ? 這一步執(zhí)行完成之后, ?沿著調(diào)用路徑返回到SurfaceFlinger類的成員函數(shù)createSurface中,這時候就創(chuàng)建好一個Layer對象及其內(nèi)部的一個 SurfaceLayer對象了,接下來,我們繼續(xù)分析SurfaceFlinger類的成員函數(shù)addClientLayer的實(shí)現(xiàn),以便可以了解 SurfaceFlinger服務(wù)是如何維護(hù)它所創(chuàng)建的Layer的,即它所創(chuàng)建的Surface。

    ?? ? ? Step 8.?SurfaceFlinger.addClientLayer

    [cpp] view plaincopy
  • ssize_t?SurfaceFlinger::addClientLayer(const?sp<Client>&?client,??
  • ????????const?sp<LayerBaseClient>&?lbc)??
  • {??
  • ????Mutex::Autolock?_l(mStateLock);??
  • ??
  • ????//?attach?this?layer?to?the?client??
  • ????ssize_t?name?=?client->attachLayer(lbc);??
  • ??
  • ????//?add?this?layer?to?the?current?state?list??
  • ????addLayer_l(lbc);??
  • ??
  • ????return?name;??
  • }??
  • ?? ? ??這個函數(shù)定義在文件frameworks/base/services/surfaceflinger/SurfaceFlinger.cpp中。

    ?? ? ? 參數(shù)client指向了一個Client對象,它是用來描述當(dāng)前正在請求SurfaceFlinger服務(wù)的一個Android應(yīng)用程序的;參數(shù)lbc指 向的是我們在前面Step 4中所創(chuàng)建的一個Layer對象。函數(shù)首先調(diào)用參數(shù)client所指向的一個Client對象的成員函數(shù)attachLayer來關(guān)聯(lián)參數(shù)lbc所指向的 一個Layer對象,以表示參數(shù)lbc所指向的一個Layer對象是由參數(shù)client所指向的一個Client對象所描述的一個Android應(yīng)用程序 請求創(chuàng)建的,接下來再調(diào)用SurfaceFlinger類的成員函數(shù)addLayer_l來將參數(shù)lbc所指向的一個Layer對象保存在 SurfaceFlinger的內(nèi)部。

    ?? ? ? 接下來,我們首先分析Client類的成員函數(shù)attachLayer的實(shí)現(xiàn),接著再分析SurfaceFlinger類的成員函數(shù)addLayer_l的實(shí)現(xiàn)。

    ?? ? ? Step 9.?Client.attachLayer

    [cpp] view plaincopy
  • ssize_t?Client::attachLayer(const?sp<LayerBaseClient>&?layer)??
  • {??
  • ????int32_t?name?=?android_atomic_inc(&mNameGenerator);??
  • ????mLayers.add(name,?layer);??
  • ????return?name;??
  • }??
  • ?? ? ??這個函數(shù)定義在文件frameworks/base/services/surfaceflinger/SurfaceFlinger.cpp中。

    ?? ? ? 從前面Android應(yīng)用程序與SurfaceFlinger服務(wù)的連接過程分析一 文可以知道,Client類的成員變量mNameGenerator是用來生成Surface名稱的,它的初始值等于1,每當(dāng)Android應(yīng)用程序請求 SurfaceFlinger服務(wù)為它創(chuàng)建一個Surface,SurfaceFlinger服務(wù)就會將對應(yīng)的Client對象的成員變量 mNameGenerator的值增加1,這樣就可以依次得到名稱等于1、2、3......的Surface。

    ?? ? ? 為正在創(chuàng)建的Surface生成好名稱name之后,Client類的成員函數(shù)attachLayer就以變量name為關(guān)鍵字,將用來描述正在創(chuàng)建的 Surface的一個Layer對象layer保存Client類的成員變量mLayers所描述的一個Map中。從這里就可以知道,一個Android 應(yīng)用程序所創(chuàng)建的Surface,都保存在與它所對應(yīng)的一個Client對象的成員變量mLayers中。

    ?? ? ?step 10.?SurfaceFlinger.addLayer_l

    [cpp] view plaincopy
  • status_t?SurfaceFlinger::addLayer_l(const?sp<LayerBase>&?layer)??
  • {??
  • ????ssize_t?i?=?mCurrentState.layersSortedByZ.add(layer);??
  • ????return?(i?<?0)???status_t(i)?:?status_t(NO_ERROR);??
  • }??
  • ?? ? ?這個函數(shù)定義在文件frameworks/base/services/surfaceflinger/SurfaceFlinger.cpp中。

    ?? ? ?SurfaceFlinger類的成員變量mCurrentState指向了一個State對象,這個State對象內(nèi)部有一個成員變量 layersSortedByZ,它用來描述一個類型為LayerVector的向量,用來保存SurfaceFlinger服務(wù)所創(chuàng)建的每一個 Layer,并且這些Layer是按照Z軸坐示來排列的。這樣,SurfaceFlinger服務(wù)在渲染Surface的時候,就可以根據(jù)這個向量來計算 可見性。

    ?? ? ?這一步執(zhí)行完成之后,回到SurfaceFlinger類的成員函數(shù)createSurface中,這時候SurfaceFlinger服務(wù)就將前面所 創(chuàng)建的一個Layer對象保存好在內(nèi)部了,接下來就會調(diào)用這個Layer對象的成員函數(shù)getSurface來獲得在前面Step 6中所創(chuàng)建的一個SurfaceLayer對象,以便可以將它的一個Binder代理對象返回請求Surface的Android應(yīng)用程序。

    ?? ? ?Layer類的成員函數(shù)getSurface是從父類LayerBaseClient繼承下來的,因此,接下來我們就繼續(xù)分析LayerBaseClient類的成員函數(shù)getSurface的實(shí)現(xiàn)。

    ?? ? ?Step 11.?LayerBaseClient.getSurface

    [cpp] view plaincopy
  • sp<LayerBaseClient::Surface>?LayerBaseClient::getSurface()??
  • {??
  • ????sp<Surface>?s;??
  • ????Mutex::Autolock?_l(mLock);??
  • ????s?=?mClientSurface.promote();??
  • ????if?(s?==?0)?{??
  • ????????s?=?createSurface();??
  • ????????mClientSurface?=?s;??
  • ????}??
  • ????return?s;??
  • }??
  • ?? ? ? 這個函數(shù)定義在文件frameworks/base/services/surfaceflinger/LayerBase.cpp中。

    ?? ? ??LayerBaseClient類的成員變量mClientSurface是一個類型為Surface的弱指針,它指向了一個Surface子類對 象。函數(shù)首先將LayerBaseClient類的成員變量mClientSurface升級為一個強(qiáng)指針s。如果升級失敗,即得到的強(qiáng)指針的值等于0, 那么就說明要么還沒有初始化LayerBaseClient類的成員變量mClientSurface,要么LayerBaseClient類的成員變量 mClientSurface所指向的一個Surface子類對象已經(jīng)被銷毀了。在這種情況下,函數(shù)就會調(diào)用由其子類來重寫的成員函數(shù) createSurface來獲得一個Surface子類對象,并且保存在成員變量mClientSurface中。最后再將得到的Surface子類對 象返回給調(diào)用者。弱指針升級為強(qiáng)指針的原理,可以參考Android系統(tǒng)的智能指針(輕量級指針、強(qiáng)指針和弱指針)的實(shí)現(xiàn)原理分析一文。

    ?? ? ?在我們這個場景中,LayerBaseClient的子類即為Layer類,因此,接下來我們就繼續(xù)分析它的成員函數(shù)createSurface的實(shí)現(xiàn)。

    ?? ? ?Step 12. Layer.createSurface

    [cpp] view plaincopy
  • sp<LayerBaseClient::Surface>?Layer::createSurface()?const??
  • {??
  • ????return?mSurface;??
  • }??
  • ?? ? ?這個函數(shù)定義在文件frameworks/base/services/surfaceflinger/Layer.cpp中。

    ?? ? ?從前面的Step 6可以知道,?Layer類的成員變量mSurface已經(jīng)指向了一個SurfaceLayer對象,因此,函數(shù)就可以直接將它返回給調(diào)用者。

    ?? ? ?這一步執(zhí)行完成之后,回到SurfaceFlinger類的成員函數(shù)createSurface中,這時候SurfaceFlinger服務(wù)就完成了 Android應(yīng)用程序所請求創(chuàng)建的Surface了,最后就會將用來描述這個Surface的一個urfaceLayer對象的一個Binder代理對 象返回Android應(yīng)用程序,以便Android應(yīng)用程序可以將它封裝成一個SurfaceControl對象,如前面的Step 1所示。

    ?? ? ?接下來,我們就回到Android應(yīng)用程序這一側(cè),繼續(xù)分析SurfaceControl對象的創(chuàng)建過程。

    ?? ? ?Step 13. new SurfaceControl

    [cpp] view plaincopy
  • SurfaceControl::SurfaceControl(??
  • ????????const?sp<SurfaceComposerClient>&?client,??
  • ????????const?sp<ISurface>&?surface,??
  • ????????const?ISurfaceComposerClient::surface_data_t&?data,??
  • ????????uint32_t?w,?uint32_t?h,?PixelFormat?format,?uint32_t?flags)??
  • ????:?mClient(client),?mSurface(surface),??
  • ??????mToken(data.token),?mIdentity(data.identity),??
  • ??????mWidth(data.width),?mHeight(data.height),?mFormat(data.format),??
  • ??????mFlags(flags)??
  • {??
  • }??
  • ?? ? ?這個函數(shù)定義在文件frameworks/base/libs/surfaceflinger_client/Surface.cpp中。

    ?? ? ?SurfaceControl類的構(gòu)造函數(shù)的實(shí)現(xiàn)很簡單,它只是對各個成員變量進(jìn)行初始化,其中,我們需要重點(diǎn)關(guān)注的是,SurfaceControl 類的成員變量mSurface指向的是一個類型為BpSurface的Binder代理對象,這個Binder代理對象引用的是由 SurfaceFlinger服務(wù)所創(chuàng)建的一個類型為SurfaceLayer的Binder本地對象。

    ?? ? ?這一步執(zhí)行完成之后,返回到開機(jī)動畫應(yīng)用程序bootanim中,即BootAnimation類的成員函數(shù)readyToRun中,接下來它就會調(diào)用 在這一步所創(chuàng)建的SurfaceControl對象的成員函數(shù)getSurface來獲得一個Surface對象。

    ?? ? ?接下來,我們就繼續(xù)分析SurfaceControl類的成員函數(shù)getSurface的實(shí)現(xiàn)。

    ?? ? ?Step 14. SurfaceControl.getSurface

    [cpp] view plaincopy
  • sp<Surface>?SurfaceControl::getSurface()?const??
  • {??
  • ????Mutex::Autolock?_l(mLock);??
  • ????if?(mSurfaceData?==?0)?{??
  • ????????mSurfaceData?=?new?Surface(const_cast<SurfaceControl*>(this));??
  • ????}??
  • ????return?mSurfaceData;??
  • }??
  • ?? ? ?這個函數(shù)定義在文件frameworks/base/libs/surfaceflinger_client/Surface.cpp中。

    ?? ? ?SurfaceControl類的成員函數(shù)getSurface第一次被調(diào)用時,成員變量mSurfaceData的值等于0,因此,函數(shù)接下來就會創(chuàng)建一個Surface對象,并且保存在成員變量mSurfaceData中。

    ?? ? ?接下來,我們就繼續(xù)分析Surface對象的創(chuàng)建過程。

    ?? ? ?Step 15. new Surface

    [cpp] view plaincopy
  • Surface::Surface(const?sp<SurfaceControl>&?surface)??
  • ????:?mBufferMapper(GraphicBufferMapper::get()),??
  • ??????mClient(SurfaceClient::getInstance()),??
  • ??????mSharedBufferClient(NULL),??
  • ??????mInitCheck(NO_INIT),??
  • ??????mSurface(surface->mSurface),??
  • ??????mIdentity(surface->mIdentity),??
  • ??????mFormat(surface->mFormat),?mFlags(surface->mFlags),??
  • ??????mWidth(surface->mWidth),?mHeight(surface->mHeight)??
  • {??
  • ????init();??
  • }??
  • ?? ? ? 這個函數(shù)定義在文件frameworks/base/libs/surfaceflinger_client/Surface.cpp中。

    ?? ? ? Surface類的成員變量mBufferMapper指向了一個GraphicBufferMapper對象,它是用來將分配到的圖形緩沖區(qū)映射到 Android應(yīng)用程序進(jìn)程的地址空間的,在接下來的一篇文章介紹Surface的渲染過程時,我們再詳細(xì)分析。

    ?? ? ? Surface類的成員變量mClient指向了Android應(yīng)用程序進(jìn)程中的一個SurfaceClient單例。從前面Android應(yīng)用程序與SurfaceFlinger服務(wù)之間的共享UI元數(shù)據(jù)(SharedClient)的創(chuàng)建過程分析一 文可以知道,這個SurfaceClient單例是有來創(chuàng)建Android應(yīng)用程序與SurfaceFlinger服務(wù)的共享UI元數(shù)據(jù)的。當(dāng) SurfaceClient類的成員函數(shù)getInstance第一次在進(jìn)程中被調(diào)用時,Android應(yīng)用程序便會請求SurfaceFlinger服 務(wù)創(chuàng)建這塊共享UI元數(shù)據(jù)。

    ?? ? ? Surface類的成員變量mSharedBufferClient指向了一個SharedBufferClient對象。文章開始時提 到,SharedBufferClient是用來在Android應(yīng)用程序這一側(cè)描述一個Surface的UI元數(shù)據(jù)緩沖區(qū)堆棧的,后面我們再分析它的創(chuàng) 建過程。

    ?? ? ??Surface類的成員變量mSurface指向了一個類型為BpSurface的Binder代理對象。從Surface類的構(gòu)造函數(shù)就可以看出,這個Binder代理對象引用的是在前面Step 6中創(chuàng)建的一個SurfaceLayer對象。

    ?? ? ??Surface類的其余成員變量mIdentity、mFormat、mFlags、mWidth和mHeight分別用來描述一個Surface的ID、像素格式、用途、寬度和高度。

    ?? ? ??Surface類的構(gòu)造函數(shù)接下來調(diào)用另外一個成員函數(shù)init進(jìn)一步執(zhí)行初始化的工作,接下來,我們就繼續(xù)分析Surface類的成員函數(shù)init的實(shí)現(xiàn)。

    ?? ? ? Step 16. Surface.init

    [cpp] view plaincopy
  • void?Surface::init()??
  • {??
  • ????ANativeWindow::setSwapInterval??=?setSwapInterval;??
  • ????ANativeWindow::dequeueBuffer????=?dequeueBuffer;??
  • ????ANativeWindow::cancelBuffer?????=?cancelBuffer;??
  • ????ANativeWindow::lockBuffer???????=?lockBuffer;??
  • ????ANativeWindow::queueBuffer??????=?queueBuffer;??
  • ????ANativeWindow::query????????????=?query;??
  • ????ANativeWindow::perform??????????=?perform;??
  • ??
  • ????DisplayInfo?dinfo;??
  • ????SurfaceComposerClient::getDisplayInfo(0,?&dinfo);??
  • ????const_cast<float&>(ANativeWindow::xdpi)?=?dinfo.xdpi;??
  • ????const_cast<float&>(ANativeWindow::ydpi)?=?dinfo.ydpi;??
  • ????//?FIXME:?set?real?values?here??
  • ????const_cast<int&>(ANativeWindow::minSwapInterval)?=?1;??
  • ????const_cast<int&>(ANativeWindow::maxSwapInterval)?=?1;??
  • ????const_cast<uint32_t&>(ANativeWindow::flags)?=?0;??
  • ??
  • ????mNextBufferTransform?=?0;??
  • ????mConnected?=?0;??
  • ????mSwapRectangle.makeInvalid();??
  • ????mNextBufferCrop?=?Rect(0,0);??
  • ????//?two?buffers?by?default??
  • ????mBuffers.setCapacity(2);??
  • ????mBuffers.insertAt(0,?2);??
  • ??
  • ????if?(mSurface?!=?0?&&?mClient.initCheck()?==?NO_ERROR)?{??
  • ????????int32_t?token?=?mClient.getTokenForSurface(mSurface);??
  • ????????if?(token?>=?0)?{??
  • ????????????mSharedBufferClient?=?new?SharedBufferClient(??
  • ????????????????????mClient.getSharedClient(),?token,?2,?mIdentity);??
  • ????????????mInitCheck?=?mClient.getSharedClient()->validate(token);??
  • ????????}??
  • ????}??
  • }??
  • ?? ? ? 這個函數(shù)定義在文件frameworks/base/libs/surfaceflinger_client/Surface.cpp中。

    ?? ? ? 這個函數(shù)的初始化工作分為兩部分。

    ?? ? ? 第一部分初始化工作是與OpenGL庫相關(guān)的,主要就是設(shè)置OpenGL指定的一系列回調(diào)接口,以及設(shè)置設(shè)備顯示屏信息。前面提到,Surface類是從 ANativeWindow類繼承下來的,作為OpenGL庫與Android系統(tǒng)的本地窗口的連接橋梁。

    ?? ? ? ANativeWindow類定義了setSwapInterval、dequeueBuffer、cancelBuffer、lockBuffer、 queueBuffer、query和perform一共7個回調(diào)接口,它們分別被設(shè)置為Surface類的靜態(tài)成員函數(shù) setSwapInterval、dequeueBuffer、cancelBuffer、lockBuffer、queueBuffer、query和 perform。我們主要關(guān)注dequeueBuffer和queueBuffer兩個回調(diào)接口,前者用來從UI元數(shù)據(jù)緩沖區(qū)堆棧中獲得一個緩沖區(qū),而后 者用來將一個緩沖區(qū)插入到UI元數(shù)據(jù)緩沖區(qū)堆棧的待渲染隊(duì)列中。在接下來的一篇文章介紹Surface的渲染過程時,我們再詳細(xì)分析這兩個回調(diào)接口。

    ?? ? ?ANativeWindow類還定義了四個成員變量xdpi、ydpi、minSwapInterval、maxSwapInterval和 flags,這幾個成員變量也是要由Surface類來初始化的。成員變量xdpi和ydpi用來描述設(shè)備顯示度的密度,即每英寸點(diǎn)數(shù)。設(shè)備顯示屏的密碼 信息可以通過調(diào)用SurfaceComposerClient類的靜態(tài)成員函數(shù)getDisplayInfo來獲得。成員變量 minSwapInterval和maxSwapInterval用來描述前后兩個緩沖區(qū)進(jìn)行交換的最小和最大時間間隔。成員變量flags用來描述一些 標(biāo)志信息。

    ?? ? ?第二部分初始化工作是與UI元數(shù)據(jù)緩沖區(qū)相關(guān)。

    ?? ? ?Surface類的成員變量mNextBufferTransform、mSwapRectangle和mNextBufferCrop分別用來描述下一個要渲染的圖形緩沖區(qū)的旋轉(zhuǎn)方向、裁剪區(qū)域和紋理坐標(biāo)。

    ?? ? ?Surface類的成員變量mBuffers用來描述一個類型為sp<GraphicBuffer>的Vector,主要是用來保存一個 Surface所使用的圖形緩沖區(qū)(GraphicBuffer)的。一開始的時候,這個向量的大小被設(shè)置為2,后面會根據(jù)實(shí)際需要來增加容量。

    ?? ? ?Surface類的成員變量mSharedBufferClient指向了一個SharedBufferClient對象,用來描述一個UI元數(shù)據(jù)緩沖區(qū)堆棧,它的創(chuàng)建過程是最重要的,因此,接下來我們就詳細(xì)分析這個過程。

    ?? ? ?Surface類的成員函數(shù)init首先調(diào)用成員變量mClient的成員函數(shù)getTokenForSurface來獲得成員變量mSurface所 描述的一個Surface的token值。有了這個token值之后,接下就可以創(chuàng)建一個SharedBufferClient對象,并且保存 在?Surface類的成員變量mSharedBufferClient中了。

    ?? ? ?在前面的Step 15中提到,Surface類的成員變量mClient指向的是一個SurfaceClient對象,因此,接下來我們首先分析 SurfaceClient類的成員函數(shù)getTokenForSurface的實(shí)現(xiàn),接著再分析SharedBufferClient對象的創(chuàng)建過程。

    ?? ? ?從前面Android應(yīng)用程序與SurfaceFlinger服務(wù)之間的共享UI元數(shù)據(jù)(SharedClient)的創(chuàng)建過程分析一 文可以知道,SurfaceClient類的成員函數(shù)getTokenForSurface實(shí)際上是調(diào)用了其成員變量mClient所指向的一個類型為 BpSurfaceComposerClient的Binder代理對象的成員函數(shù)getTokenForSurface來請求 SurfaceFlinger服務(wù)返回一個Surface的token值。由于這個Binder代理對象引用的是一個類型為UserClient的 Binder本地對象,這個Binder本地對象是運(yùn)行在SurfaceFlinger服務(wù)這一側(cè)的。接下來,我們就直接分析UserClient類的成 員函數(shù)getTokenForSurface的實(shí)現(xiàn)。

    ?? ? ?Step 17.?UserClient.getTokenForSurface

    [cpp] view plaincopy
  • ssize_t?UserClient::getTokenForSurface(const?sp<ISurface>&?sur)?const??
  • {??
  • ????int32_t?name?=?NAME_NOT_FOUND;??
  • ????sp<Layer>?layer(mFlinger->getLayer(sur));??
  • ????if?(layer?==?0)?return?name;??
  • ??
  • ????//?if?this?layer?already?has?a?token,?just?return?it??
  • ????name?=?layer->getToken();??
  • ????if?((name?>=?0)?&&?(layer->getClient()?==?this))??
  • ????????return?name;??
  • ??
  • ????name?=?0;??
  • ????do?{??
  • ????????int32_t?mask?=?1LU<<name;??
  • ????????if?((android_atomic_or(mask,?&mBitmap)?&?mask)?==?0)?{??
  • ????????????//?we?found?and?locked?that?name??
  • ????????????status_t?err?=?layer->setToken(??
  • ????????????????????const_cast<UserClient*>(this),?ctrlblk,?name);??
  • ????????????if?(err?!=?NO_ERROR)?{??
  • ????????????????//?free?the?name??
  • ????????????????android_atomic_and(~mask,?&mBitmap);??
  • ????????????????name?=?err;??
  • ????????????}??
  • ????????????break;??
  • ????????}??
  • ????????if?(++name?>=?SharedBufferStack::NUM_LAYERS_MAX)??
  • ????????????name?=?NO_MEMORY;??
  • ????}?while(name?>=?0);??
  • ??
  • ????//LOGD("getTokenForSurface(%p)?=>?%d?(client=%p,?bitmap=%08lx)",??
  • ????//????????sur->asBinder().get(),?name,?this,?mBitmap);??
  • ????return?name;??
  • }??
  • ?? ? ? 這個函數(shù)定義在文件frameworks/base/services/surfaceflinger/SurfaceFlinger.cpp中。

    ?? ? ? 從前面的調(diào)用過程可以知道,參數(shù)sur指向了一個SurfaceLayer對象,并且這個SurfaceLayer對象是在前面的Step 6中創(chuàng)建的。

    ?? ? ? UserClient類的成員變量mFlinger指向了SurfaceFlinger服務(wù),函數(shù)首先調(diào)用它的成員函數(shù)getLayer來獲得參數(shù)sur 所指向的SurfaceLayer對象的宿主Layer對象layer,接著調(diào)用這個Layer對象layer的成員函數(shù)getToken來獲得它的 token值。如果這個token值大于等于0,那么就說明已經(jīng)為Layer對象layer分配過token值了,即已經(jīng)為參數(shù)sur所描述的 Surface分配過token值了。在這種情況下,就直接將該token值返回給Android應(yīng)用程序。否則的話,UserClient類的成員函數(shù) getTokenForSurface接下來就需要為參數(shù)sur所描述的Surface分配一個token值。

    ?? ? ??UserClient類的成員變量mBitmap是一個int32_t值,它是用來為Android應(yīng)用程序的Surface分配Token值的,即 如果它的第n位等于1,那么就表示值等于n的Token已經(jīng)被分配出去使用了。UserClient類的成員函數(shù)getTokenForSurface使 用一個while循環(huán)來在成員變量mBitmap中從低位到高位找到一個值等于0的位,接著再將位所在的位置值作為參數(shù)sur所描述的一個Surface 的token值,最后還會將這個token值設(shè)置到Layer對象layer里面去,這是通過調(diào)用Layer類的成員函數(shù)setToken來實(shí)現(xiàn)的。

    ?? ? ?接下來,我們就繼續(xù)分析Layer類的成員函數(shù)setToken的實(shí)現(xiàn)。

    ?? ? ?Step 18. Layer.setToken

    [cpp] view plaincopy
  • status_t?Layer::setToken(const?sp<UserClient>&?userClient,??
  • ????????SharedClient*?sharedClient,?int32_t?token)??
  • {??
  • ????sp<SharedBufferServer>?lcblk?=?new?SharedBufferServer(??
  • ????????????sharedClient,?token,?mBufferManager.getDefaultBufferCount(),??
  • ????????????getIdentity());??
  • ??
  • ????status_t?err?=?mUserClientRef.setToken(userClient,?lcblk,?token);??
  • ??
  • ????LOGE_IF(err?!=?NO_ERROR,??
  • ????????????"ClientRef::setToken(%p,?%p,?%u)?failed",??
  • ????????????userClient.get(),?lcblk.get(),?token);??
  • ??
  • ????if?(err?==?NO_ERROR)?{??
  • ????????//?we?need?to?free?the?buffers?associated?with?this?surface??
  • ????}??
  • ??
  • ????return?err;??
  • }??
  • ?? ? ??這個函數(shù)定義在文件frameworks/base/services/surfaceflinger/Layer.cpp中。

    ?? ? ? 參數(shù)userClient指向了一個UserClient對象,而參數(shù)sharedClient指向了該UserClient對象內(nèi)部的成員變量ctrlblk所指向的一個SharedClient對象。從前面Android應(yīng)用程序與SurfaceFlinger服務(wù)之間的共享UI元數(shù)據(jù)(SharedClient)的創(chuàng)建過程分析一文可以知道,這個SharedClient對象是用來描述一組UI元數(shù)據(jù)緩沖區(qū)堆棧的。

    ?? ? ? Layer類的成員變量mBufferManager指向了一個BufferManager對象,通過調(diào)用它的成員函數(shù) getDefaultBufferCount就可以獲得一個UI元數(shù)據(jù)緩沖區(qū)堆棧的大小,即這個堆棧里面所包含的UI元數(shù)據(jù)緩沖區(qū)的個數(shù)。有了這些信息之 后,Layer類的成員函數(shù)setToken就可以創(chuàng)建一個SharedBufferServer對象lcblk了,并且會將這個 SharedBufferServer對象lcblk保存在Layer類的成員變量mUserClientRef所描述的一個ClientRef對象的內(nèi) 部。這是通過調(diào)用ClientRef類的成員函數(shù)setToken來實(shí)現(xiàn)的,如下所示:

    [cpp] view plaincopy
  • status_t?Layer::ClientRef::setToken(const?sp<UserClient>&?uc,??
  • ????????const?sp<SharedBufferServer>&?sharedClient,?int32_t?token)?{??
  • ????Mutex::Autolock?_l(mLock);??
  • ??
  • ????{?//?scope?for?strong?mUserClient?reference??
  • ????????sp<UserClient>?userClient(mUserClient.promote());??
  • ????????if?(mUserClient?!=?0?&&?mControlBlock?!=?0)?{??
  • ????????????mControlBlock->setStatus(NO_INIT);??
  • ????????}??
  • ????}??
  • ??
  • ????mUserClient?=?uc;??
  • ????mToken?=?token;??
  • ????mControlBlock?=?sharedClient;??
  • ????return?NO_ERROR;??
  • }??
  • ?? ? ?這個函數(shù)同樣是定義在文件frameworks/base/services/surfaceflinger/Layer.cpp中。

    ?? ? ?ClientRef類有三個成員變量mUserClient、mToken和mControlBlock。其中,mUserClient是一個類型為 UserClient的弱指針,它指向了參數(shù)uc所描述的一個UserClient對象,mToken是一個int32_t值,用來描述它的宿主 Layer對象的token值,mControlBlock是一個類型為SharedBufferServer強(qiáng)指針,它指向了參數(shù) sharedCient所描述一個haredBufferServer對象,用來在SurfaceFlinger服務(wù)這一側(cè)描述一個UI元數(shù)據(jù)緩沖區(qū)堆 棧。

    ?? ? 回到Layer類的成員函數(shù)setToken中,接下來我們繼續(xù)分析一個SharedBufferServer對象的創(chuàng)建過程。

    ?? ? Step 19. new SharedBufferServer

    [cpp] view plaincopy
  • SharedBufferServer::SharedBufferServer(SharedClient*?sharedClient,??
  • ????????int?surface,?int?num,?int32_t?identity)??
  • ????:?SharedBufferBase(sharedClient,?surface,?identity),??
  • ??????mNumBuffers(num)??
  • {??
  • ????mSharedStack->init(identity);??
  • ????mSharedStack->token?=?surface;??
  • ????mSharedStack->head?=?num-1;??
  • ????mSharedStack->available?=?num;??
  • ????mSharedStack->queued?=?0;??
  • ????mSharedStack->reallocMask?=?0;??
  • ????memset(mSharedStack->buffers,?0,?sizeof(mSharedStack->buffers));??
  • ????for?(int?i=0?;?i<num?;?i++)?{??
  • ????????mBufferList.add(i);??
  • ????????mSharedStack->index[i]?=?i;??
  • ????}??
  • }??
  • ?? ? ? 這個函數(shù)定義在文件frameworks/base/libs/surfaceflinger_client/SharedBufferStack.cpp中。

    ?? ? ??SharedBufferServer類的構(gòu)造函數(shù)主要是用來初始它所描述的一個UI元數(shù)據(jù)緩沖區(qū)堆棧的,這個UI元數(shù)據(jù)緩沖區(qū)堆棧是通過其父類的成 員變量mSharedStack所指向的一個SharedBufferStack對象來描述的。SharedBufferStack類的各個成員變量的含 義可以參考前面前面Android應(yīng)用程序與SurfaceFlinger服務(wù)之間的共享UI元數(shù)據(jù)(SharedClient)的創(chuàng)建過程分析一文,這里不再復(fù)述。

    ?? ? ? 這一步執(zhí)行完成之后,沿著調(diào)用路徑,一直返回到前面的Step 16中,即Surface類的成員函數(shù)init中,這時候Android應(yīng)用程序就獲得了正在創(chuàng)建的Surface的token值,接下來就可以以這個 token值為參數(shù),來創(chuàng)建一個SharedBufferClient對象了。

    ?? ? ? Step 20. new SharedBufferClient

    [cpp] view plaincopy
  • SharedBufferClient::SharedBufferClient(SharedClient*?sharedClient,??
  • ????????int?surface,?int?num,?int32_t?identity)??
  • ????:?SharedBufferBase(sharedClient,?surface,?identity),??
  • ??????mNumBuffers(num),?tail(0)??
  • {??
  • ????SharedBufferStack&?stack(?*mSharedStack?);??
  • ????tail?=?computeTail();??
  • ????queued_head?=?stack.head;??
  • }??
  • ?? ? ??這個函數(shù)定義在文件frameworks/base/libs/surfaceflinger_client/SharedBufferStack.cpp中。

    ?? ? ??SharedBufferClient類的構(gòu)造函數(shù)主要是用來初始化成員變量tail和queued_head的值。這兩個成員變量的含義可以參考前 面Android應(yīng)用程序與SurfaceFlinger服務(wù)的關(guān)系概述和學(xué)習(xí)計劃一文中的圖6,這里不再詳述。

    ?? ? ? 這里我們需要注意的是,這里的參數(shù)sharedClient指向了一個SharedClient對象,這個SharedClient對象與在前面Step 18中用來創(chuàng)建SharedBufferServer對象的SharedClient對象描述的是同一塊匿名共享內(nèi)存,而且這里的參數(shù)surface與在 前面Step 18中用來創(chuàng)建SharedBufferServer對象的token的值是相等的,這意味著這一步所創(chuàng)建的SharedBufferClient對象與 前面Step 19所創(chuàng)建的SharedBufferServer對象描述的是同一個SharedBufferStack對象,即同一個UI元數(shù)據(jù)緩沖區(qū)堆棧,并且這個 UI元數(shù)據(jù)緩沖區(qū)堆棧已經(jīng)在前面的Step 19中初始化好了。

    ?? ? ? 至此,Android應(yīng)用程序請求SurfaceFlinger服務(wù)創(chuàng)建Surface的過程就分析完成了。我們需要重點(diǎn)掌握的是,當(dāng)Android應(yīng)用 程序請求SurfaceFlinger服務(wù)創(chuàng)建一個Surface的時候,需要在SurfaceFlinger服務(wù)這一側(cè)創(chuàng)建一個Layer對象、一個 Layer::SurfaceLayer對象和一個SharedBufferServer對象,同時又需要在Android應(yīng)用程序這一側(cè)創(chuàng)建一個 SurfaceControl對象、一個Surface對象和一個SharedBufferClient對象。掌握了這些知識之后,在接下來的一篇文章 中,我們就可以分析Android應(yīng)用程序請求SurfaceFlinger服務(wù)渲染Surface的過程了,敬請期待!

    老羅的新浪微博:http://weibo.com/shengyangluo,歡迎關(guān)注!

    總結(jié)

    以上是生活随笔為你收集整理的Android应用程序请求SurfaceFlinger服务创建Surface的过程分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    国产99久久九九精品免费 | 99视频在线 | 国产麻豆视频在线观看 | 亚洲视频1区2区 | 亚洲成人软件 | 黄色大片日本 | 欧美精品久久久久久久免费 | 欧美日韩精品在线播放 | 午夜av一区二区三区 | 午夜手机电影 | 免费视频在线观看网站 | 亚洲精品美女免费 | 最新真实国产在线视频 | 欧美一级黄大片 | 久久人视频| 香蕉视频一级 | 午夜婷婷在线观看 | 日韩午夜高清 | 欧美日本在线视频 | 丁香六月久久综合狠狠色 | 中国美女一级看片 | 99精品视频在线观看免费 | 91在线免费播放 | 亚洲综合成人专区片 | 国产成人免费av电影 | 在线观看视频一区二区三区 | 激情视频在线高清看 | 天天爽夜夜操 | 亚洲成a人片77777kkkk1在线观看 | 亚洲国产精品影院 | 韩日视频在线 | 久久久久久久av麻豆果冻 | 久久久久国产精品厨房 | 在线你懂的视频 | 中文资源在线播放 | 黄色网址a| 啪啪凸凸 | 丁香婷婷在线 | 精品1区2区 | 久久精品影片 | 国产小视频免费观看 | 国产精品免费观看网站 | 亚洲精品av中文字幕在线在线 | 免费www视频| 国产一级片免费视频 | 婷婷久久国产 | 四虎亚洲精品 | 欧美一级免费高清 | 在线成人短视频 | 国产一区黄色 | 狠狠色香婷婷久久亚洲精品 | 色视频在线观看 | 91免费网址| 免费的成人av | 久久蜜臀一区二区三区av | 超碰人人在线观看 | 免费观看91视频大全 | 一区二区三区日韩在线观看 | 久草在线中文视频 | 超碰成人免费电影 | 免费av视屏 | 日韩大片在线免费观看 | 国产99久久久久久免费看 | www.伊人色.com | 91在线国产观看 | 亚州日韩中文字幕 | 中文一区在线 | 一区二区在线不卡 | 欧美一级在线看 | 可以免费观看的av片 | 亚洲韩国一区二区三区 | 欧美不卡在线 | 国产又粗又猛又黄又爽 | 91精品综合在线观看 | 久久免费一 | 久久午夜影视 | 奇米网网址 | 在线观看完整版免费 | 97超碰国产在线 | 97色资源 | 开心婷婷色 | 成 人 黄 色 视频免费播放 | 婷婷色五| 99色婷婷 | 色综合天天视频在线观看 | 伊人电影天堂 | 亚洲免费激情 | 亚洲一区二区高潮无套美女 | 天天伊人网 | 亚洲欧美视频在线播放 | 激情五月婷婷激情 | 国产精品精品久久久 | 国产成人av一区二区三区在线观看 | 中文字幕在线观看视频一区二区三区 | 日本夜夜草视频网站 | 美女在线免费视频 | 四川妇女搡bbbb搡bbbb搡 | 99激情网 | 9999在线| 韩国三级av在线 | 婷婷www| 日韩欧美视频在线 | 一区二区三区在线视频111 | 久久久久区 | 国产精品成人一区二区三区 | 国产精品 欧美 日韩 | 玖玖在线资源 | 91在线精品一区二区 | 在线电影播放 | 亚洲精品观看 | 69国产精品视频 | 夜色.com| 国产一区二区在线视频观看 | 国产中文字幕视频在线观看 | 国产高清免费观看 | 午夜久久网站 | 国产精品毛片一区视频播不卡 | 视频在线日韩 | 国产免费资源 | 精品久久一二三区 | 日韩高清在线观看 | 干狠狠| 久99久精品视频免费观看 | 久久爱导航 | 国产精品一区二区三区在线播放 | 色婷婷午夜 | 亚洲欧美视频一区二区三区 | 天天操天天能 | 最新国产视频 | 欧美午夜久久久 | 日韩在线视频网站 | www中文在线 | 亚洲精品国偷拍自产在线观看 | 国产露脸91国语对白 | 91精品国自产在线偷拍蜜桃 | 国产精品视频观看 | 久久免费大片 | 在线免费观看麻豆 | 色综合天天色综合 | 免费观看9x视频网站在线观看 | 国产精品一区二区三区在线免费观看 | 欧美久久综合 | 国产美女精彩久久 | 国产精品每日更新 | 欧美亚洲成人xxx | 亚洲精品在线视频播放 | 99久久精品国产网站 | 88av网站| 粉嫩av一区二区三区四区在线观看 | 久久久国产精品一区二区三区 | 日韩欧美精品在线观看 | www91在线 | 国产成人一区二区三区在线观看 | 久久久精品小视频 | 久久久久久毛片 | 三级黄色a| 最近中文字幕 | 天天视频色版 | 欧美 日韩 性 | 在线成人免费 | 日日夜夜av| 在线观看免费高清视频大全追剧 | 东方av在| 日韩在线色视频 | 日韩乱色精品一区二区 | 91成人黄色| 成人国产精品久久久久久亚洲 | 久久99久久久久久 | 国产成人免费 | 久草视频在线资源 | 精品美女久久久久 | 午夜精选视频 | 日韩理论电影在线观看 | 亚洲人成精品久久久久 | 私人av | 色噜噜在线观看视频 | 国产一区在线免费观看视频 | 韩国三级一区 | 久久久午夜电影 | 中文在线a在线 | 欧美日韩精品免费观看视频 | 国产黄色精品视频 | 婷婷激情五月综合 | 激情综合色播五月 | 青草视频在线看 | 中文字幕国产一区 | 麻豆视频在线观看免费 | 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 久要激情网| 99精品视频在线观看视频 | 很黄很黄的网站免费的 | a级成人毛片 | 国产精品中文字幕在线播放 | 超碰人人舔 | 精品久操 | 久久草网 | 亚洲精品国产精品国自产观看 | 国产成人亚洲在线观看 | 婷婷六月中文字幕 | 天天插天天操天天干 | 福利视频 | 久久免费影院 | 色丁香婷婷 | 国产成人av一区二区三区在线观看 | 日本二区三区在线 | 国产区网址 | 国产成人黄色片 | 色偷偷男人的天堂av | 亚洲精品啊啊啊 | 国产一区二区在线免费观看 | 99国内精品久久久久久久 | 亚洲成人免费观看 | 毛片网站在线看 | 欧美一级专区免费大片 | 亚洲国产三级 | 西西444www高清大胆 | 五月天开心| 婷婷丁香七月 | 国产精品视频全国免费观看 | 伊人五月天综合 | 国产91精品一区二区 | 日韩色视频在线观看 | 亚洲免费不卡 | 日韩精品一区二区三区高清免费 | 日韩一区二区在线免费观看 | 久久影院一区 | 97人人精品 | 免费看成人av | 五月婷婷六月丁香激情 | 在线播放亚洲 | 97av视频在线观看 | 夜夜躁日日躁狠狠久久88av | 五月天国产精品 | 日韩免费在线观看视频 | 91看片麻豆 | 最新av网站在线观看 | 亚洲国产日韩欧美在线 | 99综合电影在线视频 | 成人在线观看日韩 | 91男人影院 | www.在线观看av | 欧美日韩精品免费观看视频 | 国产免费二区 | 欧美日韩二三区 | 日韩视频免费观看高清 | 97超碰在线免费 | 久久久亚洲精华液 | 中文字幕亚洲不卡 | 精品视频成人 | 激情综合网婷婷 | www.久久久.com | 亚洲精品一区二区18漫画 | 欧美日韩不卡在线视频 | 久久久久激情 | 国产视频1区2区 | 99视频在线观看一区三区 | 色偷偷男人的天堂av | 亚洲欧美成aⅴ人在线观看 四虎在线观看 | av高清影院 | 五月婷香| 亚州黄色一级 | 中文字幕乱在线伦视频中文字幕乱码在线 | 国产91精品一区二区麻豆网站 | 色片网站在线观看 | 丁香花在线视频观看免费 | 97免费| 亚洲激情国产精品 | 国产精品99久久久久久久久久久久 | 成人av免费在线观看 | 四虎成人精品永久免费av | 亚州成人av在线 | 免费网站黄 | 亚欧洲精品视频在线观看 | 日韩成人在线一区二区 | 国产高清区 | 亚洲精品欧洲精品 | 国产中文字幕网 | 欧美精品久久久久久久亚洲调教 | 婷婷网五月天 | 美女久久久久 | 麻豆91小视频 | 国产成人久久av免费高清密臂 | 天天综合网久久综合网 | 午夜av一区二区三区 | 久久综合精品国产一区二区三区 | 日本黄色大片免费看 | 色婷婷综合久久久久 | 久久a国产| 草久久久久 | 麻豆传媒视频在线免费观看 | 国产精品v欧美精品v日韩 | 少妇搡bbbb搡bbb搡忠贞 | 久久久久久久久毛片精品 | 国产专区在线视频 | 成人黄色电影视频 | 亚洲国产69 | 国产精品美女999 | 日韩欧美在线视频一区二区 | 日本久久久久久久久 | www九九热 | 成人在线免费观看网站 | 久久99九九99精品 | 视频一区亚洲 | 日韩精品免费在线观看 | 国产成人精品一区二区在线观看 | 国产淫片| 日韩毛片在线免费观看 | 三级a视频 | 日本激情中文字幕 | 日韩剧 | 国产亚州精品视频 | 在线观看91视频 | 欧美一进一出抽搐大尺度视频 | avav片| 349k.cc看片app| 一级一片免费看 | 91精品久久久久久 | 操操碰| 国产欧美最新羞羞视频在线观看 | 久久视频在线看 | 999日韩| 在线国产视频 | 日韩电影一区二区在线 | 欧美在线一级片 | 国产精品久久久久久久久久白浆 | 国产精品99精品久久免费 | 亚洲最新在线 | 日韩 精品 一区 国产 麻豆 | 免费成人av在线看 | 亚洲色图美腿丝袜 | 免费网站观看www在线观看 | 久久久影院一区二区三区 | 亚洲爱av | 在线免费观看黄色大片 | 在线婷婷 | 久久久久亚洲精品 | 激情开心色 | 久久美女免费视频 | 在线观看日韩免费视频 | 天天草天天插 | 狠狠色丁香婷婷综合久小说久 | 亚洲综合欧美精品电影 | 亚洲视频www| 国产成人精品一区二区三区 | 一级黄色电影网站 | 亚洲成年人在线播放 | 色狠狠久久av五月综合 | 操操操日日 | 久久免费精彩视频 | 天天射狠狠干 | 国产自偷自拍 | 日韩在线免费 | 嫩嫩影院理论片 | 国模一区二区三区四区 | 欧美久久电影 | 色吧久久| 中文字幕色综合网 | 96亚洲精品久久 | 极品国产91在线网站 | 久久99精品国产一区二区三区 | 美女网站在线观看 | 深爱激情五月网 | 99国产一区| 国产三级精品三级在线观看 | 日韩电影中文 | 中文字幕有码在线 | 亚洲伦理电影在线 | 久久久久久久国产精品 | 国产精品va在线 | 美女视频黄免费的久久 | а天堂中文最新一区二区三区 | 免费视频成人 | 狠狠色狠狠色综合日日小说 | 亚洲精品乱码久久久久久蜜桃欧美 | 丁香六月激情 | 久久免费视频精品 | 国产毛片久久久 | 中文字幕av免费在线观看 | 精品国产一区二区三区四区在线观看 | 91重口视频| 亚洲年轻女教师毛茸茸 | 国产视频综合在线 | 久久国产精品免费一区二区三区 | 9999精品视频| 麻豆精品91 | 亚洲最快最全在线视频 | 国产最新在线观看 | 日本黄区免费视频观看 | 国产亚洲精品免费 | 精品国产大片 | 欧美精品v国产精品v日韩精品 | 综合国产在线 | 国产精品第三页 | 日韩一区二区在线免费观看 | 欧美综合色在线图区 | 九九电影在线 | 在线 成人 | 欧美日韩亚洲在线观看 | 91av在线不卡 | 国产黄网站在线观看 | 99草视频| 粉嫩av一区二区三区四区五区 | 日韩精品欧美专区 | 中文国产在线观看 | 日韩伦理一区二区三区av在线 | 亚洲一区二区三区四区精品 | 婷婷丁香综合 | 国产在线观看午夜 | 91精品久久久久久久91蜜桃 | 成年人视频在线免费观看 | 国产97碰免费视频 | 中文字幕字幕中文 | 亚洲精品视频观看 | 最新超碰在线 | 精品久久久久久国产 | 久久久国产精品免费 | 91免费网 | 国产精品久久久久久五月尺 | 在线小视频你懂的 | 国产精品女人久久久 | 亚洲午夜久久久久久久久久久 | 成年人在线免费看 | 四虎国产永久在线精品 | 久久 国产一区 | 国产精品一区二区三区久久久 | 国产夫妻av在线 | 国产一级二级在线观看 | 伊人影院在线观看 | 国产视频亚洲视频 | 欧美日韩二三区 | 国产高清黄 | 天天综合狠狠精品 | av电影不卡在线 | 亚洲精品在线免费观看视频 | 激情视频一区 | 九九九热精品免费视频观看 | 国产精品久久99精品毛片三a | 夜夜夜夜操 | 日韩视频一区二区三区在线播放免费观看 | 黄色在线免费观看网站 | 国产成人一区二区三区在线观看 | 91中文字幕在线播放 | 五月天久久久久 | 91网址在线观看 | 深爱激情亚洲 | zzijzzij亚洲成熟少妇 | 日韩中文字幕视频在线 | 国产精品va | 91cn国产在线 | 97伊人网 | 亚洲精品在线播放视频 | 天天看天天干天天操 | 久操视频在线免费看 | 久久综合久久伊人 | 婷婷五综合 | 91色视频| 91麻豆网站 | 在线播放日韩av | a久久免费视频 | 在线观看 国产 | 91在线视频网址 | 婷婷电影在线观看 | 久久久资源 | 天天爽天天摸 | 亚洲网站在线 | 久久都是精品 | 久久国产精品99久久人人澡 | 天天摸天天干天天操天天射 | 亚洲精品视频免费在线 | 久久高清免费观看 | 日韩国产精品久久久久久亚洲 | 夜夜躁日日躁狠狠久久av | 一级黄色av | 美女免费视频网站 | 黄色一级免费 | 亚洲激情精品 | 国产成人精品在线播放 | 日韩黄色大片在线观看 | 久久久免费视频播放 | 黄色福利网 | 欧美精品一区二区三区一线天视频 | 99精品久久久久 | 国内精品久久久久国产 | 波多野结衣在线中文字幕 | 麻豆系列在线观看 | 久久手机免费视频 | 91成人免费电影 | 欧美大片www | 亚洲黄色在线免费观看 | 91久久精品一区二区三区 | 日韩深夜在线观看 | 日韩精品一区二区在线 | 人人狠狠综合久久亚洲 | av电影在线观看 | 日韩午夜精品 | 欧美日韩不卡在线观看 | 日韩免费观看高清 | 又黄又爽免费视频 | 一区二区三区污 | 日韩在线观看你懂的 | 中文字幕在线网址 | 在线观看黄色国产 | 黄色av电影免费观看 | 久久乐九色婷婷综合色狠狠182 | 中文字幕亚洲五码 | 玖草影院| 国产精品成人免费 | 69国产盗摄一区二区三区五区 | 免费久久久久久 | 日韩乱理| 伊人五月天 | 久久国色夜色精品国产 | 午夜电影中文字幕 | 国产精品婷婷 | 婷婷色六月天 | 亚洲一区免费在线 | 久草视频2 | 国产黄色在线网站 | 久久黄色免费观看 | 99久久国产免费免费 | 成人免费观看网站 | 福利电影一区二区 | 婷婷色综合 | 久久综合久色欧美综合狠狠 | 爱爱av在线 | 97色se | 久久99热这里只有精品 | 96亚洲精品久久久蜜桃 | 亚洲理论片在线观看 | 久久久久精 | 欧美另类xxx | 中文字幕在线播放av | 福利视频 | 国产区在线看 | 日韩视频在线一区 | 国产精品专区h在线观看 | 日本久久精 | 五月婷婷综合激情 | 成人黄色片在线播放 | 手机成人在线电影 | 亚洲国产成人高清精品 | 天天插日日射 | 免费视频a | 久久精品二区 | 免费在线中文字幕 | 69亚洲视频 | 国产资源网站 | 人人澡超碰碰97碰碰碰软件 | 97国产精品 | 成人夜晚看av | 99在线精品免费视频九九视 | 国产精品一区二区av麻豆 | 综合亚洲视频 | 在线91视频 | 国产免费叼嘿网站免费 | 欧美精品被| 国产1级毛片 | 精选久久| 日日夜夜精品免费观看 | 欧美一级电影免费观看 | 日韩深夜在线观看 | 99久久夜色精品国产亚洲 | 91毛片在线 | 国产精品久久久久久久午夜 | 久久久久久久毛片 | 成人午夜网址 | 夜夜爽www | 午夜精品剧场 | 91免费观看网站 | av在线电影网站 | 九九视频在线观看视频6 | 美女视频黄在线观看 | 丁香花在线观看视频在线 | 黄色国产在线 | 91精品对白一区国产伦 | 99在线精品免费视频九九视 | 福利视频在线看 | 久久福利精品 | 色网站在线免费观看 | 色婷婷亚洲综合 | 久久天天综合网 | 久久成人精品视频 | 欧美一区三区四区 | 亚洲福利精品 | 欧美激情第八页 | 狠狠的操你 | 在线激情电影 | 欧美一级片在线 | 国产精品久久久久9999 | 国产精品99久久久精品免费观看 | 成人午夜免费福利 | 日本黄色免费在线观看 | 久久99国产精品久久99 | 国产成人精品不卡 | 在线看片中文字幕 | 亚洲人av免费网站 | 国产成人精品一区二区三区免费 | 国产成人三级一区二区在线观看一 | 亚洲国产手机在线 | 久久高清毛片 | 视频在线精品 | 婷婷色网址| 欧美成人精品在线 | 国产精品粉嫩 | 国产在线永久 | 香蕉在线视频观看 | 综合久久精品 | av在线电影播放 | 欧美日韩网址 | 久久久久久久久久久久久国产精品 | 91精品国产乱码 | 中文字幕久久精品一区 | 精品日韩在线一区 | 在线直播av | 国产精品成人一区 | 国产精品门事件 | 97天堂网 | 久草在线高清 | 四虎影视成人精品国库在线观看 | 粉嫩一区二区三区粉嫩91 | av亚洲产国偷v产偷v自拍小说 | 国产一区二区三区在线免费观看 | 日韩18p| 国产一在线精品一区在线观看 | 三级动图 | 狠狠色丁香久久婷婷综合_中 | 国产精品久久久久999 | 色大片免费看 | 日韩手机在线观看 | 中文字幕视频在线播放 | 精品一区二区免费 | 婷婷丁香激情综合 | 97福利| 久久综合福利 | 久久久久久高潮国产精品视 | 日韩精品中文字幕av | 香蕉91视频 | 99精品视频免费看 | 天天综合网 天天综合色 | 久久久亚洲电影 | 波多野结衣在线观看一区 | 欧美午夜理伦三级在线观看 | 日韩有码在线播放 | 91mv.cool在线观看 | 天天射射天天 | 超碰97中文 | 中文日韩在线视频 | 婷久久 | 久久免费的视频 | 97电院网手机版 | 中国精品少妇 | 久久综合久久综合九色 | 99久久日韩精品免费热麻豆美女 | 国产黄色在线观看 | 免费视频国产 | 十八岁以下禁止观看的1000个网站 | 欧美性极品xxxx娇小 | 亚洲精品视频在线看 | 亚洲精品玖玖玖av在线看 | 丁香色婷| 欧美小视频在线 | 最近最新mv字幕免费观看 | 99 久久久久| 青青网视频 | 久久av伊人 | 久久精品99视频 | 色在线视频 | 四虎国产精品永久在线国在线 | 2018好看的中文在线观看 | 麻豆首页| 午夜精品中文字幕 | 色网av| 成人黄色在线视频 | 成人性生交大片免费观看网站 | 久久久久亚洲精品男人的天堂 | 99免费在线观看视频 | 久久99精品波多结衣一区 | 人人澡人人爽欧一区 | 精品视频999 | 91麻豆精品国产91久久久使用方法 | 在线免费观看一区二区三区 | 免费一级特黄毛大片 | 91麻豆文化传媒在线观看 | 日韩免费观看一区二区 | 涩av在线 | 日韩免费电影网站 | 国产在线最新 | 黄色片视频免费 | 精品国产一区二区三区久久久 | 亚洲一区 av | 国产二区av | 天天射天天干 | 国产精品成人国产乱一区 | 亚洲欧美精品在线 | 国产精品中文字幕在线播放 | 日韩欧美高清一区二区 | 日产乱码一二三区别在线 | 久草视频免费看 | 一区二区三区国产欧美 | 欧产日产国产69 | 久久精品五月 | 天天色官网 | 久久综合一本 | av一级在线观看 | 中文成人字幕 | 超碰免费在线公开 | 免费在线观看一区二区三区 | 美女网站视频免费都是黄 | 高清不卡毛片 | 在线欧美a | 五月激情电影 | 国产一级淫片免费看 | 亚洲免费av在线播放 | 国产精品成久久久久 | 欧美成人aa | 天天综合导航 | 精品一区精品二区 | 亚洲h色精品 | 精品国内自产拍在线观看视频 | 久久这里只有精品1 | 国产在线视频一区二区 | 国产精品欧美久久久久无广告 | 综合伊人久久 | 国产在线无 | 欧美激情视频免费看 | 欧美与欧洲交xxxx免费观看 | 在线天堂中文www视软件 | 黄色小说在线免费观看 | 久久久网站 | 色综合天天综合 | 国产视频精选在线 | 成人中心免费视频 | 久久久久在线观看 | 99视频偷窥在线精品国自产拍 | 在线观看日本高清mv视频 | 在线观看 国产 | 中文字幕资源网 国产 | 97品白浆高清久久久久久 | 亚洲最大av在线播放 | 日韩一区二区免费播放 | 免费黄色在线网址 | 视频在线99 | 2022中文字幕在线观看 | 在线免费av播放 | 日韩欧美在线观看一区二区 | 人人涩 | 欧美日韩在线视频观看 | 亚洲欧美日韩在线一区二区 | 一级黄色片在线观看 | 色婷婷狠狠 | 国产麻豆精品95视频 | 天天色综合久久 | 一区二区三区精品在线 | 国产无套一区二区三区久久 | 中文字幕一区三区 | 国产原创av在线 | 精品中文字幕视频 | 日批在线观看 | 国产欧美精品一区二区三区 | 狠狠躁18三区二区一区ai明星 | 久久精品亚洲一区二区三区观看模式 | 国产99久久精品一区二区300 | 福利视频一区二区 | 久久久在线 | 最近中文字幕高清字幕在线视频 | 亚洲三级视频 | 欧美伦理电影一区二区 | 日韩欧美视频免费观看 | 性色av免费看 | 日本狠狠色 | av大全在线| 在线观看日本高清mv视频 | 亚洲经典视频在线观看 | 三级动态视频在线观看 | 日韩一区在线播放 | 国产精品区免费视频 | 日日干天天爽 | 久久字幕网 | 香蕉视频久久 | 国产a级精品 | 国产精品久久久久一区二区国产 | 久久久免费少妇 | 69精品视频在线观看 | 国色天香在线观看 | 久久精品视频在线 | 久久成熟| 深爱激情婷婷网 | 欧美在线18| 999久久久免费视频 午夜国产在线观看 | 伊色综合久久之综合久久 | 最新日本中文字幕 | 欧美性生活久久 | 中文字幕乱码日本亚洲一区二区 | 激情av在线播放 | 毛片一区二区 | 国产麻豆传媒 | 字幕网资源站中文字幕 | 中文字幕精品三区 | 亚洲资源在线 | 色婷婷88av视频一二三区 | 国产成人亚洲在线观看 | 国内精品久久久久久久影视麻豆 | 久久精品视频国产 | 91久久精品日日躁夜夜躁国产 | 六月丁香婷 | 在线免费精品视频 | 99色视频 | 丝袜美腿亚洲综合 | 在线之家官网 | 亚洲精品久久久久中文字幕二区 | 久久 精品一区 | 亚洲欧洲成人精品av97 | 国产精品黄色影片导航在线观看 | 国产无套一区二区三区久久 | 99久久激情视频 | 园产精品久久久久久久7电影 | 久久精品屋 | 五月天久久综合网 | 日韩电影在线观看一区二区三区 | 日本久久久久久 | 成人av资源站 | 久久高视频 | 麻豆精品视频在线观看免费 | 国产免费精彩视频 | 91av视频在线播放 | 韩国av免费观看 | 亚洲人成免费 | 国产 日韩 在线 亚洲 字幕 中文 | 久久精品视频免费 | 日韩视频欧美视频 | 在线观看www视频 | 久久综合精品国产一区二区三区 | 全久久久久久久久久久电影 | www91在线观看 | 国产精品va视频 | 中文字幕乱码电影 | 9999国产精品| 国产精品爽爽久久久久久蜜臀 | 91视频在线国产 | 岛国av在线免费 | 国产超碰在线观看 | 丝袜+亚洲+另类+欧美+变态 | 亚洲美女精品区人人人人 | 国产精品12345 | 精品国产一区二区三区在线观看 | 美女免费网站 | 亚洲精品午夜久久久久久久 | av在线影视| 国产成人a亚洲精品v | 成人中心免费视频 | 日韩中文字幕亚洲一区二区va在线 | 国产高清第一页 | 欧美 日韩 久久 | 久久久久麻豆 | 亚洲一区欧美激情 | 国产在线观看中文字幕 | 久久免费视频在线观看6 | 欧美日韩另类在线观看 | 日日干网 | 国产主播大尺度精品福利免费 | 黄色91在线观看 | 亚洲欧美成人 | 三上悠亚一区二区在线观看 | 亚洲精品动漫久久久久 | 国产女人18毛片水真多18精品 | 国产伦精品一区二区三区… | 天天躁日日躁狠狠 | 五月婷婷视频 | 午夜999 | 在线视频麻豆 | 国产精品99久久久久久有的能看 | 国产不卡毛片 | 色片网站在线观看 | 亚州av免费 | 91精品国产自产在线观看永久 | 久久久99国产精品免费 | 韩国精品一区二区三区六区色诱 | 在线观看91网站 | 日韩mv欧美mv国产精品 | 天天干天天玩天天操 | 国产黄色精品网站 | 人人爽人人澡人人添人人人人 | 天天插天天狠天天透 | 91免费试看 | 蜜臀aⅴ精品一区二区三区 久久视屏网 | 91激情视频在线 | 最新成人在线 | 夜夜夜夜爽 | 毛片视频电影 | 成人毛片a | 久久国产色| 国产精品久久久网站 | 午夜色站 | 国产在线久草 | 在线观看日本高清mv视频 | 美女网站视频免费都是黄 | 天天干天天操天天入 | 亚洲 欧美 变态 国产 另类 | 国产成人精品一区二 | 韩国av永久免费 | 久久国产免费看 | 国产视频在 | 99久久精品午夜一区二区小说 | 精品一区二区三区香蕉蜜桃 | 亚洲国产精品资源 | 精品在线播放 | 亚洲精品国产成人av在线 | 国产精品美女久久久网av | 日日夜夜国产 | 成人午夜精品久久久久久久3d | 国内免费久久久久久久久久久 | 在线精品在线 | 久久久精品在线观看 | 精品亚洲网 | 99久久精品国产一区二区成人 | 精品一区二区三区电影 | 日韩精品无 | 久久久久久免费视频 | 97超碰超碰久久福利超碰 | 操高跟美女 | 国产视频一区在线 | 亚洲另类交 | 国产一区二区不卡在线 | 91人人爽久久涩噜噜噜 | 五月天亚洲婷婷 | av一级片| 亚洲福利精品 | 久久精品国产免费观看 | 欧美日韩免费网站 | 亚洲午夜久久久久久久久 | 国产一区自拍视频 | 国产精品久久久久9999 | 欧美大香线蕉线伊人久久 | 免费精品国产 | 精品在线观看免费 | 午夜久久影院 | 国产视频首页 | 五月婷婷欧美视频 | 国产成人1区 | 玖操| 免费看色网站 | 亚洲综合激情网 | 中文在线字幕免费观看 | 黄色成人影院 | 免费在线观看黄 | 国产精品久久一区二区无卡 | 九月婷婷综合网 | 午夜精品久久一牛影视 | 亚洲精品91天天久久人人 | 免费看黄在线观看 | 免费看黄20分钟 | 国产日本高清 | 精品一二三区视频 | 亚洲欧洲日韩 | 国产精品久久久久久模特 | bayu135国产精品视频 | 日产中文字幕 | 国产91对白在线播 | 麻豆国产在线视频 | 91丨九色丨国产丨porny精品 | 欧美久久久久久久久久久久 | 亚洲精品影视 | 日韩天堂在线观看 | 六月丁香久久 | 久久三级视频 | 伊人影院av | av三级av| 婷婷综合国产 | 天天天干| 久久久久99精品成人片三人毛片 | 欧美视频xxx | 亚洲国产中文字幕在线视频综合 | 狠狠撸电影| 久久另类小说 | 国产99久久久国产 | 亚洲成a人片在线www | 在线电影中文字幕 | 国产高清精品在线 | 欧美最爽乱淫视频播放 | 在线欧美最极品的av | 日日日日日 | 91香蕉视频黄 | 国产一区 在线播放 | av电影在线观看完整版一区二区 | 日韩高清一区在线 | 在线视频婷婷 | 午夜男人影院 | 久久久久久久久久电影 | 四虎在线免费 | 黄污网站在线 | 亚洲精品视频在线看 | 男女啪啪免费网站 | 亚洲精品欧洲精品 | 一区二区三区四区五区六区 | 黄色免费高清视频 | 99国产在线观看 | 毛片永久新网址首页 | 91看成人 |