Android系统的开机画面显示过程分析(13)
生活随笔
收集整理的這篇文章主要介紹了
Android系统的开机画面显示过程分析(13)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
? ? ??WindowManagerService類的成員函數(shù)performEnableScreen的實現(xiàn)如下所示: public?class?WindowManagerService?extends?IWindowManager.Stub??? ????????implements?Watchdog.Monitor?{??? ????......??? ??? ????public?void?performEnableScreen()?{??? ????????synchronized(mWindowMap)?{??? ????????????if?(mDisplayEnabled)?{??? ????????????????return;??? ????????????}??? ????????????if?(!mSystemBooted)?{??? ????????????????return;??? ????????????}??? ??? ????????????......??? ??? ????????????mDisplayEnabled?=?true;??? ????????????......??? ??? ????????????try?{??? ????????????????IBinder?surfaceFlinger?=?ServiceManager.getService("SurfaceFlinger");??? ????????????????if?(surfaceFlinger?!=?null)?{??? ????????????????????//Slog.i(TAG,?"*******?TELLING?SURFACE?FLINGER?WE?ARE?BOOTED!");??? ????????????????????Parcel?data?=?Parcel.obtain();??? ????????????????????data.writeInterfaceToken("android.ui.ISurfaceComposer");??? ????????????????????surfaceFlinger.transact(IBinder.FIRST_CALL_TRANSACTION,??? ????????????????????????????????????????????data,?null,?0);??? ????????????????????data.recycle();??? ????????????????}??? ????????????}?catch?(RemoteException?ex)?{??? ????????????????Slog.e(TAG,?"Boot?completed:?SurfaceFlinger?is?dead!");??? ????????????}??? ????????}??? ??? ????????......??? ????}??? ??? ????......??? }???
?? ? ? ?WindowManagerService類的另外一個成員變量mDisplayEnabled用來描述WindowManagerService是否已經(jīng)初始化過系統(tǒng)的屏幕了,只有當(dāng)它的值等于false,并且系統(tǒng)已經(jīng)完成啟動,即WindowManagerService類的成員變量mSystemBooted等于true的情況下,WindowManagerService類的成員函數(shù)performEnableScreen才通知SurfaceFlinger服務(wù)停止顯示開機(jī)動畫。 ?? ? ? ?注意,WindowManagerService類的成員函數(shù)performEnableScreen是通過一個類型為IBinder.FIRST_CALL_TRANSACTION的進(jìn)程間通信請求來通知SurfaceFlinger服務(wù)停止顯示開機(jī)動畫的。 ? ? ? ? 在SurfaceFlinger服務(wù),類型為IBinder.FIRST_CALL_TRANSACTION的進(jìn)程間通信請求被定義為停止顯示開機(jī)動畫的請求,如下所示: class?BnSurfaceComposer?:?public?BnInterface<ISurfaceComposer>?? {?? public:?? ????enum?{?? ????????//?Note:?BOOT_FINISHED?must?remain?this?value,?it?is?called?from?? ????????//?Java?by?ActivityManagerService.?? ????????BOOT_FINISHED?=?IBinder::FIRST_CALL_TRANSACTION,?? ????????......?? ????};?? ?? ????virtual?status_t????onTransact(?uint32_t?code,?? ????????????????????????????????????const?Parcel&?data,?? ????????????????????????????????????Parcel*?reply,?? ????????????????????????????????????uint32_t?flags?=?0);?? };?? ?? ? ? ?BnSurfaceComposer類定義在文件frameworks/base/include/surfaceflinger/ISurfaceComposer.h中,它是SurfaceFlinger服務(wù)所要繼承的Binder本地對象類,其中。當(dāng)SurfaceFlinger服務(wù)接收到類型為IBinder::FIRST_CALL_TRANSACTION,即類型為BOOT_FINISHED的進(jìn)程間通信請求時,它就會將該請求交給它的成員函數(shù)bootFinished來處理。 ? ? ? ? SurfaceFlinger服務(wù)的成員函數(shù)bootFinished實現(xiàn)在文件frameworks/base/services/surfaceflinger/SurfaceFlinger.cpp中,如下所示: void?SurfaceFlinger::bootFinished()?? {?? ????const?nsecs_t?now?=?systemTime();?? ????const?nsecs_t?duration?=?now?-?mBootTime;?? ????LOGI("Boot?is?finished?(%ld?ms)",?long(ns2ms(duration))?);?? ????mBootFinished?=?true;?? ????property_set("ctl.stop",?"bootanim");?? }?? ?? ? ? 這個函數(shù)主要就是將系統(tǒng)屬性“ctl.stop”的值設(shè)置為“bootanim”。前面提到,每當(dāng)有一個系統(tǒng)屬性發(fā)生變化時,init進(jìn)程就會被喚醒,并且調(diào)用運行在它里面的函數(shù)handle_property_set_fd來處理這個系統(tǒng)屬性變化事件。在我們這個場景中,由于被改變的系統(tǒng)屬性的名稱是以"ctl."開頭的,即被改變的系統(tǒng)屬性是一個控制類型的屬性,因此,接下來函數(shù)handle_property_set_fd又會調(diào)用另外一個函數(shù)handle_control_message來處理該系統(tǒng)屬性變化事件。 ? ? ? ?函數(shù)handle_control_message實現(xiàn)在文件system/core/init/init.c中,如下所示: void?handle_control_message(const?char?*msg,?const?char?*arg)?? {?? ????if?(!strcmp(msg,"start"))?{?? ????????msg_start(arg);?? ????}?else?if?(!strcmp(msg,"stop"))?{?? ????????msg_stop(arg);?? ????}?else?{?? ????????ERROR("unknown?control?msg?'%s'\n",?msg);?? ????}?? }?? ?? ? ? 從前面的調(diào)用過程可以知道,參數(shù)msg和arg的值分別等于"stop"和“bootanim”,這表示要停止執(zhí)行名稱為“bootanim”的服務(wù),這是通過調(diào)用函數(shù)msg_stop來實現(xiàn)的。 ?? ? ? ? ?函數(shù)msg_stop也是實現(xiàn)在文件system/core/init/init.c中,如下所示: static?void?msg_stop(const?char?*name)?? {?? ????struct?service?*svc?=?service_find_by_name(name);?? ?? ????if?(svc)?{?? ????????service_stop(svc);?? ????}?else?{?? ????????ERROR("no?such?service?'%s'\n",?name);?? ????}?? }?? ?? ? ? 這個函數(shù)首先調(diào)用函數(shù)service_find_by_name來找到名稱等于name,即“bootanim”的服務(wù),然后再調(diào)用函數(shù)service_stop來停止這個服務(wù)。 ?? ? ? 前面提到,名稱為“bootanim”的服務(wù)對應(yīng)的應(yīng)用程序即為/system/bin/bootanimation。因此,停止名稱為“bootanim”的服務(wù)即為停止執(zhí)行應(yīng)用程序/system/bin/bootanimation,而當(dāng)應(yīng)用程序/system/bin/bootanimation停止執(zhí)行的時候,開機(jī)動畫就會停止顯示了。 ?? ? ? 至此,Android系統(tǒng)的三個開機(jī)畫面的顯示過程就分析完成了。通過這個三個開機(jī)畫面的顯示過程分析,我們學(xué)習(xí)到: ?? ? ? 1. 在內(nèi)核層,系統(tǒng)屏幕是使用一個稱為幀緩沖區(qū)的硬件設(shè)備來描述的,而用戶空間的應(yīng)用程序可以通過設(shè)備文件/dev/fb0或者/dev/graphics/fb0來操作這個硬件設(shè)備。實際上,幀緩沖區(qū)本身并不是一個真正的硬件,它只不過是對顯卡的一個抽象表示,不過,我們通過訪幀緩沖區(qū)就可以間接地操作顯卡內(nèi)存以及顯卡中的其它寄存器。 ?? ? ? 2. OpenGL是通過EGL接口來渲染屏幕,而EGL接口是通過ANativeWindow類來間接地渲染屏幕的。我們可以將ANativeWindow類理解成一個Android系統(tǒng)的本地窗口類,即相當(dāng)于是Windows系統(tǒng)中的窗口句柄概念,它最終是通過文件/dev/fb0或者/dev/graphics/fb0來渲染屏幕的。 ?? ? ? 3. init進(jìn)程在啟動的過程中,會將另外一個ueventd進(jìn)程也啟動起來。ueventd進(jìn)程對應(yīng)的可執(zhí)行文件與init進(jìn)程對應(yīng)的可執(zhí)行文件均為/init,不過ueventd進(jìn)程主要負(fù)責(zé)處理內(nèi)核發(fā)出的uevent事件,即負(fù)責(zé)管理系統(tǒng)中的設(shè)備文件。 ?? ? ? 4. 每當(dāng)我們設(shè)置一個系統(tǒng)屬性的時候,init進(jìn)程都會接收到一個系統(tǒng)屬性變化事件。當(dāng)發(fā)生變化的系統(tǒng)屬性的名稱等于“ctl.start”或者“ctl.stop”,那么實際上是向init進(jìn)程發(fā)出一個啟動或者停止服務(wù)的命令。 ?? ? ? 前面第1點和第2點的知識是與Android系統(tǒng)的UI實現(xiàn)相關(guān)的,而后面第3點和第4點是兩個額外獲得的知識點。 ? ? ? ?本文的目的并不是單純?yōu)榱私榻BAndroid系統(tǒng)的開機(jī)畫面,而是希望能夠以Android系統(tǒng)的開機(jī)畫面來作為切入點來分析Android系統(tǒng)的UI實現(xiàn)。在后面的文章中,我們就會根據(jù)本文所涉及到的知識點,來展開分析Android系統(tǒng)的UI實現(xiàn),敬請關(guān)注。
?? ? ? ?WindowManagerService類的另外一個成員變量mDisplayEnabled用來描述WindowManagerService是否已經(jīng)初始化過系統(tǒng)的屏幕了,只有當(dāng)它的值等于false,并且系統(tǒng)已經(jīng)完成啟動,即WindowManagerService類的成員變量mSystemBooted等于true的情況下,WindowManagerService類的成員函數(shù)performEnableScreen才通知SurfaceFlinger服務(wù)停止顯示開機(jī)動畫。 ?? ? ? ?注意,WindowManagerService類的成員函數(shù)performEnableScreen是通過一個類型為IBinder.FIRST_CALL_TRANSACTION的進(jìn)程間通信請求來通知SurfaceFlinger服務(wù)停止顯示開機(jī)動畫的。 ? ? ? ? 在SurfaceFlinger服務(wù),類型為IBinder.FIRST_CALL_TRANSACTION的進(jìn)程間通信請求被定義為停止顯示開機(jī)動畫的請求,如下所示:
總結(jié)
以上是生活随笔為你收集整理的Android系统的开机画面显示过程分析(13)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Intent进阶 和 Intent-fi
- 下一篇: 在win7下安装SQL sever200