Android 系統(tǒng)啟動(dòng)流程

開機(jī)過(guò)程

? ? 在大部分有操作系統(tǒng)的智能設(shè)備中,系統(tǒng)啟動(dòng)多數(shù)都有大致相同的流程:設(shè)備通過(guò)開機(jī)鍵完成上電,設(shè)備內(nèi)部會(huì)去讀取存儲(chǔ)在固件上的一小段程序,該程序去讀內(nèi)存上的一段只讀(read-only)內(nèi)存,在獲取到內(nèi)存后,開始自我運(yùn)行完成它自己要做的工作。它最主要的任務(wù)就是授權(quán)允許其他類類型的存儲(chǔ)--硬盤和主存,可以被訪問(wèn)。然后引導(dǎo)啟動(dòng)固件中操作系統(tǒng)部分程序開始加載并運(yùn)行在主存中??偟膩?lái)說(shuō),大部分個(gè)人電腦,智能手機(jī),平板等都是類似的啟動(dòng)過(guò)程。

Android 開機(jī)過(guò)程

Andorid系統(tǒng)啟動(dòng)流程圖

Android 啟動(dòng)流程分為以下六步:

1.Boot Rom: 這個(gè)過(guò)程就是我們常常按下開機(jī)鍵開始啟動(dòng)。當(dāng)按下開機(jī)鍵后,事先存放在ROM固定位置的程序就開始工作,加載bootloader到RAM中開始執(zhí)行。

2.BootLoader:bootloaders是包含了很多讓設(shè)備如何啟動(dòng)和找到System Kernel 的指令的底層代碼,很多設(shè)備制造商可以在這部分做它們自己的定制。bootloader在操作系統(tǒng)之前運(yùn)行,它執(zhí)行分兩個(gè)階段:

a) 在第一個(gè)階段,它檢測(cè)外部的RAM,并加載啟動(dòng)第二階段要執(zhí)行的程序

b)在第二階段,bootloader設(shè)置網(wǎng)絡(luò),內(nèi)存等為啟動(dòng)kernel做準(zhǔn)備。

3.Kernel:一旦kernel啟動(dòng),它就是開始創(chuàng)建緩存(cache),保護(hù)內(nèi)存(protected memory),系統(tǒng)調(diào)度(scheduling),加載驅(qū)動(dòng),啟動(dòng)kernel守護(hù)進(jìn)程,掛載文件系統(tǒng),初始化IO(Input/Output),啟動(dòng)中斷,初始化進(jìn)程表。當(dāng)kernel啟動(dòng)完成系統(tǒng)啟動(dòng)后,它就開始啟動(dòng)系統(tǒng)第一個(gè)進(jìn)程--Init進(jìn)程。

4.Init:Init進(jìn)程系統(tǒng)啟動(dòng)后第一個(gè)進(jìn)程,我們可以說(shuō)它是系統(tǒng)所有進(jìn)程的始祖。

Init進(jìn)程有2個(gè)責(zé)任:

a.掛載系統(tǒng)目錄 比如/sys , /dev? ,/proc 等

b.運(yùn)行init.rc 腳本。init.rc是負(fù)責(zé)kernel之上操作系統(tǒng)的初始化。(init.rc部分在實(shí)際開發(fā)中,會(huì)經(jīng)常遇到,比如用來(lái)啟動(dòng)自己定制的系統(tǒng)服務(wù),腳本等等,在后面文章會(huì)有詳細(xì)介紹)

Init進(jìn)程進(jìn)程會(huì)啟動(dòng)所有的本地服務(wù)(native service),這有點(diǎn)類似linux 系統(tǒng)啟動(dòng)引導(dǎo)程序。

5.Zygote and Dalvik VM:Zygote是一個(gè)隨系統(tǒng)啟動(dòng)而啟動(dòng)的VM(虛擬機(jī))進(jìn)程。我們知道Android應(yīng)用進(jìn)程是運(yùn)行在虛擬機(jī)上的,當(dāng)app_process 啟動(dòng)Zygote時(shí),它首先創(chuàng)建Dalvik VM虛擬機(jī)并且調(diào)用Zygote main()函數(shù)。Zygote通過(guò)/dev/socket/zygote 接收到啟動(dòng)應(yīng)用的請(qǐng)求。一旦請(qǐng)求接收到,它就會(huì)觸發(fā)fork()函數(shù)去創(chuàng)建進(jìn)程。

當(dāng)一個(gè)進(jìn)程fork時(shí),它會(huì)給它自己做一個(gè)克隆,復(fù)制它自己到另一個(gè)內(nèi)存空間。當(dāng)Zygote 完成這些后,它會(huì)創(chuàng)建一個(gè)新的虛擬機(jī)(Dalvik VM)線程,用來(lái)預(yù)加載所有APP需要的類和資源,預(yù)加載會(huì)讓進(jìn)程創(chuàng)建虛擬機(jī)(VM)和加載資源非常高效。

它可以讓虛擬機(jī)之前共享代碼來(lái)達(dá)到大大縮短應(yīng)用啟動(dòng)時(shí)間的目的。

6.SystemServer:在Zygote預(yù)加載所有必要的類(Java Classes)和資源后,它就開始啟動(dòng)System Server了。System server是系統(tǒng)服務(wù)的核心,在啟動(dòng)System server第一件事就是去加載android_server這個(gè)本地庫(kù)(native library),這個(gè)庫(kù)里提供了與native機(jī)制溝通的接口。
然后native init 方法就會(huì)啟動(dòng)很多navtive service,在設(shè)置啟動(dòng)native service后,它就會(huì)創(chuàng)建一個(gè)server線程,這個(gè)線程會(huì)根據(jù)啟動(dòng)順序去啟動(dòng)系統(tǒng)中剩下其他的系統(tǒng)服務(wù)。
每個(gè)服務(wù)都是運(yùn)行在System server創(chuàng)建的單獨(dú)的虛擬機(jī)線程中的,一旦系統(tǒng)服務(wù)全部啟動(dòng)并運(yùn)行在內(nèi)存中,Android就完成了它的啟動(dòng)過(guò)程。
此時(shí)我們熟悉的“ACTION_BOOT_COMPLETED”廣播就會(huì)被系統(tǒng)發(fā)出了。

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

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

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