小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Android系統(tǒng)Surface機(jī)制的SurfaceFlinger服務(wù)的啟動(dòng)過(guò)程分析

 老匹夫 2014-07-28

        在前面一篇文章中,我們簡(jiǎn)要介紹了Android系統(tǒng)Surface機(jī)制中的SurfaceFlinger服務(wù)。SurfaceFlinger服務(wù)是在System進(jìn)程中啟動(dòng)的,并且負(fù)責(zé)統(tǒng)一管理設(shè)備的幀緩沖區(qū)。SurfaceFlinger服務(wù)在啟動(dòng)的過(guò)程中,會(huì)創(chuàng)建兩個(gè)線(xiàn)程,其中一個(gè)線(xiàn)程用來(lái)監(jiān)控控制臺(tái)事件,而另外一個(gè)線(xiàn)程用來(lái)渲染系統(tǒng)的UI。在本文中,我們就將詳細(xì)分析SurfaceFlinger服務(wù)的啟動(dòng)過(guò)程。

        從前面Android系統(tǒng)進(jìn)程Zygote啟動(dòng)過(guò)程的源代碼分析一文可以知道,System進(jìn)程是由Zygote進(jìn)程啟動(dòng)的,并且是以Java層的SystemServer類(lèi)的靜態(tài)成員函數(shù)main為入口函數(shù)的。因此,接下來(lái)我們就從SystemServer類(lèi)的靜態(tài)成員函數(shù)main開(kāi)始,分析SurfaceFlinger服務(wù)的啟動(dòng)過(guò)程,如圖1所示。


圖1 SurfaceFlinger服務(wù)的啟動(dòng)過(guò)程

       SurfaceFlinger服務(wù)的啟動(dòng)過(guò)程可以劃分為8個(gè)步驟,接下來(lái)我們就詳細(xì)分析每一個(gè)步驟。

       Step 1. SystemServer.main

  1. public class SystemServer  
  2. {  
  3.     ......  
  4.   
  5.     native public static void init1(String[] args);  
  6.   
  7.     public static void main(String[] args) {  
  8.         ......  
  9.   
  10.         System.loadLibrary("android_servers");  
  11.         init1(args);  
  12.     }  
  13.   
  14.     ......  
  15. }  
        這個(gè)函數(shù)定義在文件frameworks/base/services/java/com/android/server/SystemServer.java中。

        SystemServer類(lèi)的靜態(tài)成員函數(shù)main首先將android_servers庫(kù)加載到System進(jìn)程中來(lái),接著調(diào)用另外一個(gè)靜態(tài)成員函數(shù)init1來(lái)啟動(dòng)那些使用C++語(yǔ)言來(lái)實(shí)現(xiàn)的系統(tǒng)服務(wù)。

        SystemServer類(lèi)的靜態(tài)成員函數(shù)init1是一個(gè)JNI方法,它是由C++層的函數(shù)android_server_SystemServer_init1來(lái)實(shí)現(xiàn)的,接下來(lái)我們就繼續(xù)分析它的實(shí)現(xiàn)。

        Step 2. SystemServer.init1

  1. static void android_server_SystemServer_init1(JNIEnv* env, jobject clazz)  
  2. {  
  3.     system_init();  
  4. }  
       這個(gè)函數(shù)定義在文件frameworks/base/services/jni/com_android_server_SystemServer.cpp 中。

       SystemServer類(lèi)的靜態(tài)成員函數(shù)init1調(diào)用另外一個(gè)函數(shù)system_init來(lái)啟動(dòng)那些使用C++語(yǔ)言來(lái)實(shí)現(xiàn)的系統(tǒng)服務(wù),它的實(shí)現(xiàn)在文件frameworks/base/cmds/system_server/library/system_init.cpp中,如下所示:

  1. extern "C" status_t system_init()  
  2. {  
  3.     LOGI("Entered system_init()");  
  4.   
  5.     sp<ProcessState> proc(ProcessState::self());  
  6.     ......  
  7.   
  8.     char propBuf[PROPERTY_VALUE_MAX];  
  9.     property_get("system_init.startsurfaceflinger", propBuf, "1");  
  10.     if (strcmp(propBuf, "1") == 0) {  
  11.         // Start the SurfaceFlinger   
  12.         SurfaceFlinger::instantiate();  
  13.     }  
  14.   
  15.     ......  
  16.   
  17.     if (proc->supportsProcesses()) {  
  18.         LOGI("System server: entering thread pool.\n");  
  19.         ProcessState::self()->startThreadPool();  
  20.         IPCThreadState::self()->joinThreadPool();  
  21.         LOGI("System server: exiting thread pool.\n");  
  22.     }  
  23.     return NO_ERROR;  
  24. }  
       函數(shù)首先獲得System進(jìn)程中的一個(gè)ProcessState單例,并且保存在變量proc中,后面會(huì)通過(guò)調(diào)用它的成員函數(shù)supportsProcesses來(lái)判斷系統(tǒng)是否支持Binder進(jìn)程間通信機(jī)制。我們知道,在Android系統(tǒng)中,每一個(gè)需要使用Binder進(jìn)程間通信機(jī)制的進(jìn)程內(nèi)部都有一個(gè)ProcessState單例,它是用來(lái)和Binder驅(qū)動(dòng)程序建立連接的,具體可以參考Android系統(tǒng)進(jìn)程間通信(IPC)機(jī)制Binder中的Server啟動(dòng)過(guò)程源代碼分析一文。

       函數(shù)接下來(lái)就檢查系統(tǒng)中是否存在一個(gè)名稱(chēng)為“system_init.startsurfaceflinger”的屬性。如果存在的話(huà),就將它的值獲取回來(lái),并且保存在緩沖區(qū)proBuf中。如果不存在的話(huà),那么函數(shù)property_get就會(huì)將緩沖區(qū)proBuf的值設(shè)置為“1”。當(dāng)緩沖區(qū)proBuf的值等于“1”的時(shí)候,就表示需要在System進(jìn)程中將SurfaceFlinger服務(wù)啟動(dòng)起來(lái),這是通過(guò)調(diào)用SurfaceFlinger類(lèi)的靜態(tài)成員函數(shù)instantiate來(lái)實(shí)現(xiàn)的。

       函數(shù)最后檢查系統(tǒng)是否支持Binder進(jìn)程間通信機(jī)制。如果支持的話(huà),那么接下來(lái)就會(huì)調(diào)用當(dāng)前進(jìn)程中的ProcessState單例的成員函數(shù)startThreadPool來(lái)啟動(dòng)一個(gè)Binder線(xiàn)程池,并且調(diào)用當(dāng)前線(xiàn)程中的IPCThreadState單例來(lái)將當(dāng)前線(xiàn)程加入到前面所啟動(dòng)的Binder線(xiàn)程池中去。從前面Android系統(tǒng)進(jìn)程Zygote啟動(dòng)過(guò)程的源代碼分析Android應(yīng)用程序進(jìn)程啟動(dòng)過(guò)程的源代碼分析兩篇文章可以知道,System進(jìn)程前面在初始化運(yùn)行時(shí)庫(kù)的過(guò)程中,已經(jīng)調(diào)用過(guò)當(dāng)前進(jìn)程中的ProcessState單例的成員函數(shù)startThreadPool來(lái)啟動(dòng)Binder線(xiàn)程池了,因此,這里其實(shí)只是將當(dāng)前線(xiàn)程加入到這個(gè)Binder線(xiàn)程池中去。有了這個(gè)Binder線(xiàn)程池之后,SurfaceFlinger服務(wù)在啟動(dòng)完成之后,就可以為系統(tǒng)中的其他組件或者進(jìn)程提供服務(wù)了。

       假設(shè)系統(tǒng)存在一個(gè)名稱(chēng)為“system_init.startsurfaceflinger”的屬性,并且它的值等于“1”,接下來(lái)我們就繼續(xù)分析SurfaceFlinger類(lèi)的靜態(tài)成員函數(shù)instantiate的實(shí)現(xiàn),以便可以了解SurfaceFlinger服務(wù)的啟動(dòng)過(guò)程。由于SurfaceFlinger類(lèi)的靜態(tài)成員函數(shù)instantiate是從父類(lèi)BinderService繼承下來(lái)的,因此,接下來(lái)我們要分析的實(shí)際上是BinderService類(lèi)的靜態(tài)成員函數(shù)instantiate的實(shí)現(xiàn)。

       Step 3. BinderService.instantiate

  1. template<typename SERVICE>  
  2. class BinderService  
  3. {  
  4. public:  
  5.     ......  
  6.   
  7.     static void instantiate() { publish(); }  
  8.   
  9.     ......  
  10. };  
       這個(gè)函數(shù)定義在文件frameworks/base/include/binder/BinderService.h中。

       BinderService類(lèi)的靜態(tài)成員函數(shù)instantiate的實(shí)現(xiàn)很簡(jiǎn)單,它只是調(diào)用BinderService類(lèi)的另外一個(gè)靜態(tài)成員函數(shù)publish來(lái)繼續(xù)執(zhí)行啟動(dòng)SurfaceFlinger服務(wù)的操作。

       Step 4. BinderService.publish

  1. template<typename SERVICE>  
  2. class BinderService  
  3. {  
  4. public:  
  5.     static status_t publish() {  
  6.         sp<IServiceManager> sm(defaultServiceManager());  
  7.         return sm->addService(String16(SERVICE::getServiceName()), new SERVICE());  
  8.     }  
  9.   
  10.     ......  
  11. };  
       這個(gè)函數(shù)定義在文件frameworks/base/include/binder/BinderService.h中。

       BinderService是一個(gè)模板類(lèi),它有一個(gè)模板參數(shù)SERVICE。當(dāng)BinderService類(lèi)被SurfaceFlinger類(lèi)繼承時(shí),模板參數(shù)SERVICE的值就等于SurfaceFlinger。因此,BinderService類(lèi)的靜態(tài)成員函數(shù)publish所執(zhí)行的操作就是創(chuàng)建一個(gè)SurfaceFlinger實(shí)例,用來(lái)作為系統(tǒng)的SurfaceFlinger服務(wù),并且將這個(gè)服務(wù)注冊(cè)到Service Manager中去,這樣系統(tǒng)中的其它組件或者進(jìn)程就可以通過(guò)Service Manager來(lái)獲得SurfaceFlinger服務(wù)的Binder代理對(duì)象,進(jìn)而使用它所提供的服務(wù)。Binder進(jìn)程間通信機(jī)制中的服務(wù)對(duì)象的注冊(cè)過(guò)程可以參考Android系統(tǒng)進(jìn)程間通信(IPC)機(jī)制Binder中的Server啟動(dòng)過(guò)程源代碼分析一文。

       接下來(lái),我們就繼續(xù)分析SurfaceFlinger服務(wù)的創(chuàng)建過(guò)程。

       Step 5. new SurfaceFlinger

  1. SurfaceFlinger::SurfaceFlinger()  
  2.     :   BnSurfaceComposer(), Thread(false),  
  3.         ......  
  4. {  
  5.     init();  
  6. }  

       這個(gè)函數(shù)定義在文件frameworks/base/services/surfaceflinger/SurfaceFlinger.cpp中。

       從前面Android系統(tǒng)Surface機(jī)制的SurfaceFlinger服務(wù)簡(jiǎn)要介紹和學(xué)習(xí)計(jì)劃一文可以知道,SurfaceFlinger類(lèi)繼承了BnSurfaceComposer類(lèi),而后者是一個(gè)實(shí)現(xiàn)了ISurfaceComposer接口的Binder本地對(duì)象類(lèi)。此外,SurfaceFlinger類(lèi)還繼承了Thread類(lèi),后者是用來(lái)創(chuàng)建一個(gè)線(xiàn)程的,這個(gè)線(xiàn)程就是我們?cè)?a target="_blank">Android系統(tǒng)Surface機(jī)制的SurfaceFlinger服務(wù)簡(jiǎn)要介紹和學(xué)習(xí)計(jì)劃一文中提到的UI渲染線(xiàn)程,它的線(xiàn)程執(zhí)行體函數(shù)為SurfaceFlinger類(lèi)的成員函數(shù)threadLoop。后面在分析SurfaceFlinger服務(wù)渲染UI的過(guò)程時(shí),我們?cè)俜治鯯urfaceFlinger類(lèi)的成員函數(shù)threadLoop的實(shí)現(xiàn)。注意,在初始化SurfaceFlinger的父類(lèi)Thread時(shí),傳進(jìn)去的參數(shù)為false,表示先不要將SurfaceFlinger服務(wù)的UI渲染線(xiàn)程啟動(dòng)起來(lái),等到后面再啟動(dòng)。

       SurfaceFlinger服務(wù)在創(chuàng)建的過(guò)程中,會(huì)調(diào)用SurfaceFlinger類(lèi)的成員函數(shù)init來(lái)執(zhí)行初始化的操作,接下來(lái),我們就繼續(xù)分析它的實(shí)現(xiàn)。

       Step 6. SurfaceFlinger.init

  1. void SurfaceFlinger::init()  
  2. {  
  3.     LOGI("SurfaceFlinger is starting");  
  4.   
  5.     // debugging stuff...   
  6.     char value[PROPERTY_VALUE_MAX];  
  7.     property_get("debug.sf.showupdates", value, "0");  
  8.     mDebugRegion = atoi(value);  
  9.     property_get("debug.sf.showbackground", value, "0");  
  10.     mDebugBackground = atoi(value);  
  11.   
  12.     LOGI_IF(mDebugRegion,       "showupdates enabled");  
  13.     LOGI_IF(mDebugBackground,   "showbackground enabled");  
  14. }  
        這個(gè)函數(shù)定義在文件frameworks/base/services/surfaceflinger/SurfaceFlinger.cpp中。

        SurfaceFlinger類(lèi)的成員函數(shù)init的實(shí)現(xiàn)很簡(jiǎn)單,它分別獲得系統(tǒng)中兩個(gè)名稱(chēng)為“debug.sf.showupdates”和“debug.sf.showbackground”的屬性的值,并且分別保存在SurfaceFlinger類(lèi)的成員變量mDebugRegion和mDebugBackground中。這兩個(gè)成員變量是與調(diào)試相關(guān)的,我們不關(guān)心。

        這一步執(zhí)行完成之后,返回到前面的Step 4中,即BinderService類(lèi)的靜態(tài)成員函數(shù)publish中,這時(shí)候在前面的Step 5中所創(chuàng)建的一個(gè)SurfaceFlinger實(shí)例就會(huì)被注冊(cè)到Service Manager中,這是通過(guò)調(diào)用Service Manager的Binder代理對(duì)象的成員函數(shù)addService來(lái)實(shí)現(xiàn)的。由于Service Manager的Binder代理對(duì)象的成員函數(shù)addService的第二個(gè)參數(shù)是一個(gè)類(lèi)型為IBinder的強(qiáng)指針引用。從前面Android系統(tǒng)的智能指針(輕量級(jí)指針、強(qiáng)指針和弱指針)的實(shí)現(xiàn)原理分析一文可以知道,當(dāng)一個(gè)對(duì)象第一次被一個(gè)強(qiáng)指針引用時(shí),那么這個(gè)對(duì)象的成員函數(shù)onFirstRef就會(huì)被調(diào)用。因此,接下來(lái)前面所創(chuàng)建的SurfaceFlinger實(shí)例的成員函數(shù)onFirstRef就會(huì)被調(diào)用,以便可以繼續(xù)執(zhí)行初始化操作。

        Step 7. SurfaceFlinger.onFirstRef

  1. void SurfaceFlinger::onFirstRef()  
  2. {  
  3.     run("SurfaceFlinger", PRIORITY_URGENT_DISPLAY);  
  4.   
  5.     // Wait for the main thread to be done with its initialization   
  6.     mReadyToRunBarrier.wait();  
  7. }<SPAN style="FONT-FAMILY: Arial, Helvetica, sans-serif"><SPAN style="WHITE-SPACE: normal">  
  8. </SPAN></SPAN>  

       這個(gè)函數(shù)定義在文件frameworks/base/services/surfaceflinger/SurfaceFlinger.cpp中。

       函數(shù)首先調(diào)用從父類(lèi)繼承下來(lái)的成員函數(shù)run來(lái)啟動(dòng)一個(gè)名秒為“SurfaceFlinger”的線(xiàn)程,用來(lái)執(zhí)行UI渲染操作。這就是前面我們所說(shuō)的UI渲染線(xiàn)程了。這個(gè)UI渲染線(xiàn)程創(chuàng)建完成之后,首先會(huì)調(diào)用SurfaceFlinger類(lèi)的成員函數(shù)readyToRun來(lái)執(zhí)行一些初始化操作,接著再循環(huán)調(diào)用SurfaceFlinger類(lèi)的成員函數(shù)threadLoop來(lái)作為線(xiàn)程的執(zhí)行體。

       mReadyToRunBarrier是SurfaceFlinger類(lèi)的一個(gè)成員變量,它的類(lèi)型是Barrier,用來(lái)描述一個(gè)屏障,是通過(guò)條件變量來(lái)實(shí)現(xiàn)的。我們可以把它看作是一個(gè)線(xiàn)程同步工具,即阻塞當(dāng)前線(xiàn)程,直到SurfaceFlinger服務(wù)的UI渲染線(xiàn)程執(zhí)行完成初始化操作為止。

       接下來(lái),我們就繼續(xù)分析SurfaceFlinger類(lèi)的成員函數(shù)readyToRun的實(shí)現(xiàn),以便可以了解SurfaceFlinger服務(wù)的UI渲染線(xiàn)程的初始化過(guò)程。

       Step 8. SurfaceFlinger.oreadyToRun

       這個(gè)函數(shù)定義在文件frameworks/base/services/surfaceflinger/SurfaceFlinger.cpp文件中,用來(lái)初始化SurfaceFlinger服務(wù)的UI渲染線(xiàn)程,我們分段來(lái)閱讀:

  1. status_t SurfaceFlinger::readyToRun()  
  2. {  
  3.     LOGI(   "SurfaceFlinger's main thread ready to run. "  
  4.             "Initializing graphics H/W...");  
  5.   
  6.     // we only support one display currently   
  7.     int dpy = 0;  
  8.   
  9.     {  
  10.         // initialize the main display   
  11.         GraphicPlane& plane(graphicPlane(dpy));  
  12.         DisplayHardware* const hw = new DisplayHardware(this, dpy);  
  13.         plane.setDisplayHardware(hw);  
  14.     }  
        這段代碼首先創(chuàng)建了一個(gè)DisplayHardware對(duì)象hw,用來(lái)描述設(shè)備的顯示屏,并且用這個(gè)DisplayHardware對(duì)象來(lái)初始化SurfaceFlinger類(lèi)的成員變量mGraphicPlanes所描述的一個(gè)GraphicPlane數(shù)組的第一個(gè)元素。在DisplayHardware對(duì)象hw的創(chuàng)建過(guò)程中,會(huì)創(chuàng)建另外一個(gè)線(xiàn)程,用來(lái)監(jiān)控控制臺(tái)事件,即監(jiān)控硬件幀緩沖區(qū)的睡眠和喚醒事件。在后面一篇文章中介紹SurfaceFlinger服務(wù)是如何管理硬件幀緩沖區(qū)時(shí),我們就會(huì)看到這個(gè)控制臺(tái)事件監(jiān)控線(xiàn)程的創(chuàng)建過(guò)程。

       我們接著往下閱讀代碼:

  1. // create the shared control-block   
  2. mServerHeap = new MemoryHeapBase(4096,  
  3.         MemoryHeapBase::READ_ONLY, "SurfaceFlinger read-only heap");  
  4. LOGE_IF(mServerHeap==0, "can't create shared memory dealer");  
  5.   
  6. mServerCblk = static_cast<surface_flinger_cblk_t*>(mServerHeap->getBase());  
  7. LOGE_IF(mServerCblk==0, "can't get to shared control block's address");  
  8.   
  9. new(mServerCblk) surface_flinger_cblk_t;  
       這段代碼首先創(chuàng)建了一塊大小為4096,即4KB的匿名共享內(nèi)存,接著將這塊匿名共享內(nèi)存結(jié)構(gòu)化為一個(gè)surface_flinger_cblk_t對(duì)象來(lái)訪問(wèn)。這個(gè)surface_flinger_cblk_t對(duì)象就保存在SurfaceFlinger類(lèi)的成員變量mServerCblk中。

       這塊匿名共享內(nèi)存用來(lái)保存設(shè)備顯示屏的屬性信息,例如,寬度、高度、密度和每秒多少幀等信息,后面我們就會(huì)看到這塊匿名共享內(nèi)存的初始化過(guò)程。為什么會(huì)使用匿名共享內(nèi)存來(lái)保存設(shè)備顯示屏的屬性信息呢?這是為了方便將這些信息傳遞給系統(tǒng)中的其它進(jìn)程訪問(wèn)的。系統(tǒng)中的其它進(jìn)程可以通過(guò)調(diào)用調(diào)用SurfaceFlinger服務(wù)的代理對(duì)象的成員函數(shù)getCblk來(lái)獲得這塊匿名共享內(nèi)存的內(nèi)容。

       我們?cè)俳又麻喿x代碼:

  1. // initialize primary screen   
  2. // (other display should be initialized in the same manner, but   
  3. // asynchronously, as they could come and go. None of this is supported   
  4. // yet).   
  5. const GraphicPlane& plane(graphicPlane(dpy));  
  6. const DisplayHardware& hw = plane.displayHardware();  
  7. const uint32_t w = hw.getWidth();  
  8. const uint32_t h = hw.getHeight();  
  9. const uint32_t f = hw.getFormat();  
  10. hw.makeCurrent();  
        這段代碼首先獲得SurfaceFlinger類(lèi)的成員變量mGraphicPlanes所描述的一個(gè)GraphicPlane數(shù)組的第一個(gè)元素plane,接著再設(shè)置它的寬度、長(zhǎng)度和像素格式等作息,最后再調(diào)用它里面的一個(gè)DisplayHardware對(duì)象hw的成員函數(shù)makeCurrent來(lái)將它作為系統(tǒng)的主顯示屏。這個(gè)DisplayHardware對(duì)象hw是在前面第一段代碼中創(chuàng)建的,在創(chuàng)建的過(guò)程中,它會(huì)執(zhí)行一些初始化操作,這里將它設(shè)置為系統(tǒng)主顯示屏之后,后面就可以將系統(tǒng)的UI渲染在它上面了。在后面一篇文章中介紹SurfaceFlinger服務(wù)是如何管理硬件幀緩沖區(qū)時(shí),我們?cè)俜治鯠isplayHardware類(lèi)的成員函數(shù)makeCurrent的實(shí)現(xiàn)。

       我們繼續(xù)往下閱讀代碼:

  1. // initialize the shared control block   
  2. mServerCblk->connected |= 1<<dpy;  
  3. display_cblk_t* dcblk = mServerCblk->displays + dpy;  
  4. memset(dcblk, 0, sizeof(display_cblk_t));  
  5. dcblk->w            = plane.getWidth();  
  6. dcblk->h            = plane.getHeight();  
  7. dcblk->format       = f;  
  8. dcblk->orientation  = ISurfaceComposer::eOrientationDefault;  
  9. dcblk->xdpi         = hw.getDpiX();  
  10. dcblk->ydpi         = hw.getDpiY();  
  11. dcblk->fps          = hw.getRefreshRate();  
  12. dcblk->density      = hw.getDensity();  
       這段代碼將系統(tǒng)主顯示屏的屬性信息保存在前面所創(chuàng)建的一塊匿名共享內(nèi)存中,以便可以將系統(tǒng)主顯示屏的屬性信息返回給系統(tǒng)中的其它進(jìn)程訪問(wèn)。

       我們?cè)倮^續(xù)往下閱讀代碼:

  1. // Initialize OpenGL|ES   
  2. glPixelStorei(GL_UNPACK_ALIGNMENT, 4);  
  3. glPixelStorei(GL_PACK_ALIGNMENT, 4);  
  4. glEnableClientState(GL_VERTEX_ARRAY);  
  5. glEnable(GL_SCISSOR_TEST);  
  6. glShadeModel(GL_FLAT);  
  7. glDisable(GL_DITHER);  
  8. glDisable(GL_CULL_FACE);  
  9.   
  10. const uint16_t g0 = pack565(0x0F,0x1F,0x0F);  
  11. const uint16_t g1 = pack565(0x17,0x2f,0x17);  
  12. const uint16_t textureData[4] = { g0, g1, g1, g0 };  
  13. glGenTextures(1, &mWormholeTexName);  
  14. glBindTexture(GL_TEXTURE_2D, mWormholeTexName);  
  15. glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);  
  16. glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);  
  17. glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);  
  18. glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);  
  19. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0,  
  20.         GL_RGB, GL_UNSIGNED_SHORT_5_6_5, textureData);  
  21.   
  22. glViewport(0, 0, w, h);  
  23. glMatrixMode(GL_PROJECTION);  
  24. glLoadIdentity();  
  25. glOrthof(0, w, h, 0, 0, 1);  
        這段代碼用來(lái)初始化OpenGL庫(kù),因?yàn)镾urfaceFlinger服務(wù)是通過(guò)OpenGL庫(kù)提供的API來(lái)渲染系統(tǒng)的UI的。這里我們就不詳細(xì)分析OpenGL庫(kù)的初始化過(guò)程中,有興趣的讀者可以參考官方網(wǎng)站:http://cn./。

        我們?cè)倮^續(xù)往下閱讀最后一段代碼:

  1.     LayerDim::initDimmer(this, w, h);  
  2.   
  3.     mReadyToRunBarrier.open();  
  4.   
  5.     /* 
  6.      *  We're now ready to accept clients... 
  7.      */  
  8.   
  9.     // start boot animation   
  10.     property_set("ctl.start""bootanim");  
  11.   
  12.     return NO_ERROR;  
  13. }  
        這段代碼做了三件事情。

        第一件事情是調(diào)用LayerDim類(lèi)的靜態(tài)成員函數(shù)initDimmer來(lái)初始化LayerDim類(lèi)。LayerDim類(lèi)是用來(lái)描述一個(gè)具有顏色漸變功能的Surface的,這種類(lèi)型的Surface與普通的Surface不一樣,前者是在后者的基礎(chǔ)上創(chuàng)建和渲染的。

        第二件事情是調(diào)用SurfaceFlinger類(lèi)的成員變量mReadyToRunBarrier所描述的一個(gè)屏障的成員函數(shù)open來(lái)告訴System進(jìn)程的主線(xiàn)程,即在前面的Step 7中正在等待的線(xiàn)程,SurfaceFlinger服務(wù)的UI渲染線(xiàn)程已經(jīng)創(chuàng)建并且初始化完成了,這時(shí)候System進(jìn)程的主線(xiàn)程就可以繼續(xù)向前執(zhí)行其它操作了。

       第三件事情是調(diào)用函數(shù)property_set來(lái)設(shè)置系統(tǒng)中名稱(chēng)為“ctl.start”的屬性,即將它的值設(shè)置為“bootanim”。從前面Android系統(tǒng)的開(kāi)機(jī)畫(huà)面顯示過(guò)程分析一文可以知道,ctl.start是Android系統(tǒng)的一個(gè)控制屬性,當(dāng)它的值等于““bootanim”的時(shí)候,就表示要啟動(dòng)Android系統(tǒng)的開(kāi)機(jī)動(dòng)畫(huà)。從這里就可以看出,當(dāng)我們看到Android系統(tǒng)的開(kāi)機(jī)動(dòng)畫(huà)時(shí),就說(shuō)明Android系統(tǒng)的SurfaceFlinger服務(wù)已經(jīng)啟動(dòng)起來(lái)了。

       至此,我們就分析完成SurfaceFlinger服務(wù)的啟動(dòng)過(guò)程中了。在分析過(guò)程中,有兩個(gè)比較重要的知識(shí)點(diǎn):第一個(gè)知識(shí)點(diǎn)是系統(tǒng)主顯示屏的創(chuàng)建和初始化過(guò)程,第二個(gè)知識(shí)點(diǎn)是UI渲染線(xiàn)程的執(zhí)行過(guò)程。在接下來(lái)的第一篇文章中,我們將詳細(xì)分析第一個(gè)知識(shí)點(diǎn)。在分析第一個(gè)知識(shí)點(diǎn)的過(guò)程中,會(huì)涉及到SurfaceFlinger服務(wù)的控制臺(tái)事件監(jiān)控線(xiàn)程的創(chuàng)建過(guò)程,因此,結(jié)合Step 2提到的Binder線(xiàn)程,以及Step 7提到的UI渲染線(xiàn)程,我們將在接下來(lái)的第二篇文章中,綜合描述SurfaceFlinger服務(wù)的線(xiàn)程協(xié)作模型。有了前面的基礎(chǔ)知識(shí)之后,在接下來(lái)的第三篇文章中,我們就將詳細(xì)分析第二個(gè)知識(shí)點(diǎn)。敬請(qǐng)關(guān)注!

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

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多