一、啟動(dòng)電源以及系統(tǒng)啟動(dòng)
- 當(dāng)電源按下時(shí)引導(dǎo)芯片代碼從預(yù)定義的地方(固化在ROM)開(kāi)始執(zhí)行,加載引導(dǎo)程序BootLoader到RAM,然后執(zhí)行。
二、引導(dǎo)程序BootLoader
- 引導(dǎo)程序BootLoader是在Android操作系統(tǒng)開(kāi)始運(yùn)行前的一個(gè)小程序,它的主要作用是把系統(tǒng)OS拉起來(lái)并運(yùn)行。
三、Linux內(nèi)核啟動(dòng)
- 當(dāng)內(nèi)核啟動(dòng),設(shè)置緩存、被保護(hù)存儲(chǔ)器、計(jì)劃列表、加載驅(qū)動(dòng)。在內(nèi)核完成系統(tǒng)設(shè)置后,它首先在系統(tǒng)文件中尋找init.rc(啟動(dòng)腳本)文件,并啟動(dòng)init進(jìn)程
注:init.rc是一個(gè)非常重要的配置文件,它是由Android初始化語(yǔ)言(Android Init Language)編寫(xiě)的腳本,這種語(yǔ)言主要包含五種類型語(yǔ)句:Action、Command、Service、Option和Import。在Android8.0中對(duì)init.rc文件進(jìn)行了拆分,每個(gè)服務(wù)對(duì)應(yīng)一個(gè)rc文件。
四、init進(jìn)程啟動(dòng)
- init進(jìn)程是Android系統(tǒng)中用戶空間的第一個(gè)進(jìn)程,進(jìn)程號(hào)為1,是Android系統(tǒng)啟動(dòng)流程中一個(gè)關(guān)鍵的步驟。
- init進(jìn)程做的工作比較多,主要用來(lái)創(chuàng)建和掛載啟動(dòng)所需的文件目錄、初始化和啟動(dòng)屬性服務(wù)、啟動(dòng)Zygote進(jìn)程。
4.1 Zygote
- 在Android系統(tǒng)中,DVM和ART、應(yīng)用程序進(jìn)程以及運(yùn)行系統(tǒng)的關(guān)鍵服務(wù)的SystemServer進(jìn)程都是由Zygote進(jìn)程來(lái)創(chuàng)建的,我們稱它為孵化器。它通過(guò)fock的形式來(lái)創(chuàng)建應(yīng)用程序進(jìn)程和SystemServer進(jìn)程,由于Zygote進(jìn)程在啟動(dòng)時(shí)會(huì)創(chuàng)建DVM或者ART,因此通過(guò)fock而創(chuàng)建的應(yīng)用程序進(jìn)程和SystemServer進(jìn)程可以在內(nèi)部獲取一個(gè)DVM或者ART的實(shí)例副本。
- Zygote進(jìn)程是在init進(jìn)程啟動(dòng)時(shí)創(chuàng)建的,起初Zygote進(jìn)程的名稱并不是叫"zygote",而是叫"app_process",這個(gè)名稱是在Android.mk中定義的,Zygote進(jìn)程啟動(dòng)后,Linux系統(tǒng)下的pctrl系統(tǒng)會(huì)調(diào)用app_process,將其名稱換成了"zygote"。
- 從Android5.0開(kāi)始,Android開(kāi)始支持64位程序,Zygote也就有了32位和64位的區(qū)別,分別對(duì)用不同的腳本:init.zygote32.rc、init.zygote32_64.rc、init.zygote64.rc、init.zygote64_32.rc
4.2 Zygote進(jìn)程啟動(dòng)過(guò)程
- 創(chuàng)建AppRuntime并調(diào)用其start方法,啟動(dòng)Zygote進(jìn)程。
- 創(chuàng)建Java虛擬機(jī)并為Java虛擬機(jī)注冊(cè)JNI方法。
- 通過(guò)JNI調(diào)用ZygoteInit的main函數(shù)進(jìn)入Zygote的Java框架層。
- 通過(guò)registerZygoteSocket方法創(chuàng)建服務(wù)器端Socket,并通過(guò)runSelectLoop方法等待AMS的請(qǐng)求來(lái)創(chuàng)建新的應(yīng)用程序進(jìn)程。
- 啟動(dòng)SystemServer進(jìn)程。
4.3 SystemServer進(jìn)程
- 啟動(dòng)Binder線程池,這樣就可以與其他進(jìn)程進(jìn)行通信。
- 創(chuàng)建SystemServiceManager,其用于對(duì)系統(tǒng)的服務(wù)進(jìn)行創(chuàng)建、啟動(dòng)和生命周期管理。
- 啟動(dòng)各種系統(tǒng)服務(wù)(引導(dǎo)服務(wù)、核心服務(wù)、其他服務(wù))。
五、Launcher啟動(dòng)
- 通俗來(lái)講Launcher就是Android系統(tǒng)的桌面,它的作用主要有一下兩點(diǎn):
- 作為Android系統(tǒng)的啟動(dòng)器,用于啟動(dòng)應(yīng)用程序。
- 作為Android系統(tǒng)的桌面,用于顯示和管理應(yīng)用程序的快捷圖標(biāo)或者其他桌面組件。