Android的啟動流程作為整個(gè)Android系統(tǒng)的開端,這部分的流程時(shí)刻影響著應(yīng)用層的方方面面。這些知識也是作為Android開發(fā)進(jìn)階必須要了解的一部分。

因此,本文通過流程圖來探索一下Android的啟動過程。

- Android設(shè)備上電后,首先會從處理器片上ROM的啟動引導(dǎo)代碼開始執(zhí)行,片上ROM會尋找Bootloader代碼,并加載到內(nèi)存。(這一步由“芯片廠商”負(fù)責(zé)設(shè)計(jì)和實(shí)現(xiàn))
- Bootloader開始執(zhí)行,首先負(fù)責(zé)完成硬件的初始化,然后找到Linux內(nèi)核代碼,并加載到內(nèi)存。(這一步由“設(shè)備廠商”負(fù)責(zé)設(shè)計(jì)和實(shí)現(xiàn))
- Linux內(nèi)核開始啟動,設(shè)置緩存、被保護(hù)存儲器、計(jì)劃列表,加載驅(qū)動。當(dāng)內(nèi)核完成系統(tǒng)設(shè)置,它首先在系統(tǒng)文件中尋找”init”文件,然后啟動root進(jìn)程或者系統(tǒng)的第一個(gè)進(jìn)程--init程序。
- init進(jìn)程啟動:初始化和啟動屬性服務(wù),并且啟動Zygote進(jìn)程
init程序最核心的工作主要有3點(diǎn):
- 創(chuàng)建和掛載一些系統(tǒng)目錄/設(shè)備節(jié)點(diǎn),設(shè)置權(quán)限,如:/dev, /proc, and /sys
- 解析 init.rc 和 init.<hardware>.rc,并啟動屬性服務(wù),以及一系列的服務(wù)和進(jìn)程。
- 顯示boot logo,默認(rèn)是“Android”字樣
- Zygote進(jìn)程啟動:創(chuàng)建java虛擬機(jī)并為java虛擬機(jī)注冊JNI方法,創(chuàng)建服務(wù)器端Socket,啟動SystemServer進(jìn)程。
- SystemServer進(jìn)程啟動: 啟動Binder線程池和SystemServiceManager,并且啟動各種系統(tǒng)服務(wù)。
- Launcher啟動:被SystemServer進(jìn)程啟動的AMS會啟動Launcher,Launcher啟動后會將已安裝應(yīng)用的快捷圖標(biāo)顯示到界面上。
init進(jìn)程
init進(jìn)程是Android系統(tǒng)中用戶控件的第一個(gè)進(jìn)程,進(jìn)程號是1。
- 創(chuàng)建和掛載啟動所需的文件目錄:
這是init進(jìn)程啟動開始的第一步,其中掛載了tmpfs、devpts、proc、sysfs和selinuxfs共5種文件系統(tǒng),這些都是系統(tǒng)運(yùn)行時(shí)目錄,顧名思義,只在系統(tǒng)運(yùn)行時(shí)才會存在,系統(tǒng)停止時(shí)會消失。 - 初始化和啟動屬性服務(wù)
- 解析init.rc配置文件并啟動Zygote進(jìn)程
Zygote
1.創(chuàng)建了一個(gè)Server端的Socket
2.預(yù)加載類和資源
3.啟動了SystemServer進(jìn)程
4.等待AMS請求創(chuàng)建新的應(yīng)用程序進(jìn)程
SystemServer
1.啟動Binder線程池
2.創(chuàng)建了SystemServiceManager(用于對系統(tǒng)服務(wù)進(jìn)行創(chuàng)建、啟動和生命周期管理)
3.啟動了各種服務(wù)
服務(wù)
服務(wù)包含2部分,一部分是本地服務(wù),另一部分是Android服務(wù),所有的這些服務(wù)都會向ServiceManager進(jìn)程注冊,由它統(tǒng)一管理,這些服務(wù)的啟動過程介紹如下:
本地服務(wù)
本地服務(wù)是指運(yùn)行在C++層的系統(tǒng)守護(hù)進(jìn)程,一部分本地服務(wù)是init進(jìn)程直接啟動的,它們定義在init.rc腳本和init.<hardware>.rc中,如 ueventd、servicemanager、debuggerd、rild、mediaserver等。還有一部分本地服務(wù),是由這些本地服務(wù)進(jìn)一步創(chuàng)建的,如mediaserver服務(wù)會啟動AudioFlinger, MediaPlayerService 等本地服務(wù)。
Android服務(wù)
Android服務(wù)是指運(yùn)行在Dalvik虛擬機(jī)進(jìn)程中的服務(wù),這些服務(wù)的創(chuàng)建過程描述如下:
init進(jìn)程會執(zhí)行app_process程序,創(chuàng)建Zygote進(jìn)程,它是Android系統(tǒng)最重要的進(jìn)程,所有后續(xù)的Android應(yīng)用程序都是由它fork出來的。
Zygote進(jìn)程會首先fork出"SystemServer"進(jìn)程,"SystemServer"進(jìn)程的全部任務(wù)就是將所有的Android核心服務(wù)啟動起來,這些服務(wù)包括:

當(dāng)所有的服務(wù)都啟動完畢后,SystemServer會打印出“Making services ready”,然后通過ActivityManager啟動Home界面,并發(fā)送“ACTION_BOOT_COMPLETED”廣播消息。
注意,這些Android服務(wù)并沒有各種運(yùn)行在獨(dú)立的進(jìn)程中,它們由SystemServer以線程的方式創(chuàng)建,所以都運(yùn)行在同一個(gè)進(jìn)程中,即SystemServer進(jìn)程中。
參考鏈接:
https://blog.51cto.com/ticktick/1659473
http://m.itdecent.cn/p/2c1318b0f527
https://blog.csdn.net/shaoenxiao/article/details/87088982