資源描述:
《android系統(tǒng)啟動(dòng)過(guò)程(1)》由會(huì)員上傳分享,免費(fèi)在線(xiàn)閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、1Android系統(tǒng)的啟動(dòng)過(guò)程1.1啟動(dòng)過(guò)程Android系統(tǒng)完整的啟動(dòng)過(guò)程,可分為L(zhǎng)inux系統(tǒng)層、Android系統(tǒng)服務(wù)層、Zygote進(jìn)程模型三個(gè)階段,從開(kāi)機(jī)到啟動(dòng)HomeLauncher完成具體的任務(wù)細(xì)節(jié)可分為七個(gè)步驟。1.啟動(dòng)BootLoader2.加載系統(tǒng)內(nèi)核3.啟動(dòng)Init和其它重要守護(hù)進(jìn)程4.啟動(dòng)Zygote進(jìn)程5.啟動(dòng)Runtime進(jìn)程,初始化ServiceManager。ServiceManager用于binder通訊,負(fù)責(zé)綁定服務(wù)的注冊(cè)與查找。6.啟動(dòng)SystemService7
2、.啟動(dòng)HomeLaucher8.啟動(dòng)其它應(yīng)用程序1.1.1BootLoaderAndroid系統(tǒng)是基于Linux操作系統(tǒng)的,所以它最初的啟動(dòng)過(guò)程和Linux一樣。當(dāng)設(shè)備通電后首先執(zhí)行BootLoader引導(dǎo)裝載器,BootLoader是在操作系統(tǒng)內(nèi)核運(yùn)行之前運(yùn)行的一段小程序。通過(guò)這段小程序初始化硬件設(shè)備、建立內(nèi)存空間映射圖,從而將系統(tǒng)的軟硬件環(huán)境引導(dǎo)進(jìn)入合適的狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的運(yùn)行環(huán)境。1.1.2啟動(dòng)Init和守護(hù)進(jìn)程當(dāng)系統(tǒng)內(nèi)核加載完成之后,會(huì)首先啟動(dòng)Init守護(hù)進(jìn)程,它是內(nèi)
3、核啟動(dòng)的第一個(gè)用戶(hù)級(jí)進(jìn)程,進(jìn)程號(hào)永遠(yuǎn)是1。當(dāng)Init進(jìn)程啟動(dòng)后,如(圖11)它還負(fù)責(zé)啟動(dòng)其他的一些重要守護(hù)進(jìn)程,主要包括:Usbd進(jìn)程(USBDaemon):USB連接后臺(tái)進(jìn)程,負(fù)責(zé)管理USB連接。adbd進(jìn)程(AndroidDebugBridgeDaemon):ADB連接后臺(tái)進(jìn)程,負(fù)責(zé)管理ADB連接。debuggerd進(jìn)程(DebuggerDaemon):調(diào)試器后臺(tái)進(jìn)程,負(fù)責(zé)管理調(diào)試請(qǐng)求及調(diào)試過(guò)程。rild進(jìn)程(RadioInterfaceLayerDaemon):無(wú)線(xiàn)接口層后臺(tái)進(jìn)程,負(fù)責(zé)管理無(wú)線(xiàn)
4、通信服務(wù)。圖11Init和其它重要守護(hù)進(jìn)程的啟動(dòng),圖片來(lái)源:http://www-igm.univ-mlv.fr/~dr/XPOSE2008/android/fonct.html1.1.1啟動(dòng)Zygote進(jìn)程如(圖12)所示,當(dāng)Init進(jìn)程和一些重要的守護(hù)進(jìn)程啟動(dòng)完成之后,將啟動(dòng)Zygote進(jìn)程。Zygote進(jìn)程在系統(tǒng)運(yùn)行期間,當(dāng)接收到創(chuàng)建虛擬機(jī)請(qǐng)求時(shí),將孵化DalvikVM實(shí)例。圖12Zygote進(jìn)程的啟動(dòng)Zygote進(jìn)程啟動(dòng)后,首先初始化一個(gè)DalvikVM實(shí)例,然后為它加載資源與系統(tǒng)共享庫(kù)
5、,并開(kāi)啟Socket監(jiān)聽(tīng)服務(wù),當(dāng)收到創(chuàng)建DalvikVM實(shí)例請(qǐng)求時(shí),會(huì)通過(guò)COW(copyonwrite)技術(shù)最大程度地復(fù)用自己,生成一個(gè)新的DalvikVM實(shí)例。DalvikVM實(shí)例的創(chuàng)建方法基于linux系統(tǒng)的fork原理。Zygote進(jìn)程孵化DalvikVM實(shí)例流程如(圖13)所示:圖13Zygote進(jìn)程孵化DalvikVM實(shí)例流程1.1.2啟動(dòng)Runtime進(jìn)程和初始化ServiceManager當(dāng)Zygote進(jìn)程啟動(dòng)完成之后,Init進(jìn)程會(huì)啟動(dòng)Runtime進(jìn)程。Runtime進(jìn)程首先初
6、始化服務(wù)管理器(ServiceManager),并把它注冊(cè)為綁定服務(wù)(Binderservices)的默認(rèn)上下文管理器,負(fù)責(zé)綁定服務(wù)的注冊(cè)與查找。圖14Runtime進(jìn)程啟動(dòng)過(guò)程1.1.1啟動(dòng)系統(tǒng)服務(wù)當(dāng)Runtime進(jìn)程啟動(dòng)ServiceManager后,將會(huì)啟動(dòng)SystemService。SystemService的啟動(dòng)流程如下所示:1)如(圖15)所示,Runtime進(jìn)程向Zygote進(jìn)程發(fā)送啟動(dòng)系統(tǒng)服務(wù)(SystemService)的請(qǐng)求,Zygote進(jìn)程收到請(qǐng)求后,會(huì)“孵化”出一個(gè)新的Da
7、lvikVM實(shí)例并啟動(dòng)系統(tǒng)服務(wù)進(jìn)程。2)如(圖16)所示,SystemService首先啟動(dòng)兩個(gè)本地服務(wù)(由C或C++編寫(xiě)的native服務(wù)):SurfaceFlinger和AudioFlinger。這兩個(gè)本地系統(tǒng)服務(wù)向服務(wù)管理器注冊(cè)成為IPC服務(wù)對(duì)象,以便在需要它們的時(shí)候很容易查找到。3)如(圖17所示),SystemService然后啟動(dòng)一些Java層的Android系統(tǒng)管理服務(wù),包括硬件服務(wù)和系統(tǒng)框架核心平臺(tái)服務(wù),并將它們注冊(cè)成IPC服務(wù)對(duì)象。這些服務(wù)啟動(dòng)的代碼位于SystemServer.
8、java的run函數(shù)當(dāng)中。4)當(dāng)SystemService加載完所有的系統(tǒng)服務(wù)后就意味著系統(tǒng)就準(zhǔn)備好了,整個(gè)系統(tǒng)的進(jìn)程圖如(圖18)。然后SystemService會(huì)向所有服務(wù)發(fā)送一個(gè)系統(tǒng)準(zhǔn)備完畢(systemready)的廣播消息。圖15SystemServer啟動(dòng)過(guò)程圖16AndroidNativeSystemservice的啟動(dòng)圖17Androidmanagedservices的啟動(dòng)圖18系統(tǒng)準(zhǔn)備完畢1.1.1啟動(dòng)Launcher如(圖1