一侍匙、啟動電源以及系統(tǒng)啟動
- 當(dāng)電源按下時引導(dǎo)芯片代碼從預(yù)定義的地方(固化在ROM)開始執(zhí)行氮惯,加載引導(dǎo)程序BootLoader到RAM,然后執(zhí)行。
二妇汗、引導(dǎo)程序BootLoader
- 引導(dǎo)程序BootLoader是在Android操作系統(tǒng)開始運行前的一個小程序帘不,它的主要作用是把系統(tǒng)OS拉起來并運行。
三杨箭、Linux內(nèi)核啟動
- 當(dāng)內(nèi)核啟動寞焙,設(shè)置緩存、被保護存儲器告唆、計劃列表棺弊、加載驅(qū)動。在內(nèi)核完成系統(tǒng)設(shè)置后擒悬,它首先在系統(tǒng)文件中尋找init.rc(啟動腳本)文件模她,并啟動init進程
注:init.rc是一個非常重要的配置文件,它是由Android初始化語言(Android Init Language)編寫的腳本懂牧,這種語言主要包含五種類型語句:Action侈净、Command、Service僧凤、Option和Import畜侦。在Android8.0中對init.rc文件進行了拆分,每個服務(wù)對應(yīng)一個rc文件躯保。
四旋膳、init進程啟動
- init進程是Android系統(tǒng)中用戶空間的第一個進程,進程號為1途事,是Android系統(tǒng)啟動流程中一個關(guān)鍵的步驟验懊。
- init進程做的工作比較多,主要用來創(chuàng)建和掛載啟動所需的文件目錄尸变、初始化和啟動屬性服務(wù)吮廉、啟動Zygote進程嘹害。
4.1 Zygote
- 在Android系統(tǒng)中,DVM和ART、應(yīng)用程序進程以及運行系統(tǒng)的關(guān)鍵服務(wù)的SystemServer進程都是由Zygote進程來創(chuàng)建的注益,我們稱它為孵化器予弧。它通過fock的形式來創(chuàng)建應(yīng)用程序進程和SystemServer進程薛匪,由于Zygote進程在啟動時會創(chuàng)建DVM或者ART打瘪,因此通過fock而創(chuàng)建的應(yīng)用程序進程和SystemServer進程可以在內(nèi)部獲取一個DVM或者ART的實例副本。
- Zygote進程是在init進程啟動時創(chuàng)建的酗昼,起初Zygote進程的名稱并不是叫"zygote"匙头,而是叫"app_process",這個名稱是在Android.mk中定義的仔雷,Zygote進程啟動后蹂析,Linux系統(tǒng)下的pctrl系統(tǒng)會調(diào)用app_process舔示,將其名稱換成了"zygote"。
- 從Android5.0開始电抚,Android開始支持64位程序惕稻,Zygote也就有了32位和64位的區(qū)別,分別對用不同的腳本:init.zygote32.rc蝙叛、init.zygote32_64.rc俺祠、init.zygote64.rc、init.zygote64_32.rc
4.2 Zygote進程啟動過程
- 創(chuàng)建AppRuntime并調(diào)用其start方法借帘,啟動Zygote進程蜘渣。
- 創(chuàng)建Java虛擬機并為Java虛擬機注冊JNI方法。
- 通過JNI調(diào)用ZygoteInit的main函數(shù)進入Zygote的Java框架層肺然。
- 通過registerZygoteSocket方法創(chuàng)建服務(wù)器端Socket蔫缸,并通過runSelectLoop方法等待AMS的請求來創(chuàng)建新的應(yīng)用程序進程。
- 啟動SystemServer進程际起。
4.3 SystemServer進程
- 啟動Binder線程池拾碌,這樣就可以與其他進程進行通信。
- 創(chuàng)建SystemServiceManager街望,其用于對系統(tǒng)的服務(wù)進行創(chuàng)建校翔、啟動和生命周期管理。
- 啟動各種系統(tǒng)服務(wù)(引導(dǎo)服務(wù)灾前、核心服務(wù)防症、其他服務(wù))。
五哎甲、Launcher啟動
- 通俗來講Launcher就是Android系統(tǒng)的桌面告希,它的作用主要有一下兩點:
- 作為Android系統(tǒng)的啟動器,用于啟動應(yīng)用程序烧给。
- 作為Android系統(tǒng)的桌面,用于顯示和管理應(yīng)用程序的快捷圖標(biāo)或者其他桌面組件喝噪。