本篇文章主要介紹按下電源鍵開機(jī)后發(fā)生的事情,和你按下桌面上的一個(gè)應(yīng)用圖標(biāo)后發(fā)生的事情。下面就讓我們一起來探索系統(tǒng)啟動(dòng)和App啟動(dòng)的前世今生吧。
本文的關(guān)鍵是三張示意圖,基本上全文都是圍繞這三張圖的一個(gè)解釋,請一定對照著圖片閱讀本文。另外,吃水不忘挖井人,感謝這三張神圖的原作者,他們都是承載我們的巨人,讓我們站的更高,看得更遠(yuǎn),走的更穩(wěn)。
Android系統(tǒng)啟動(dòng)流程
在此之前,你需要首先了解Android系統(tǒng)的分層架構(gòu),詳見我的另一篇文章Android系統(tǒng)架構(gòu)簡介
Android系統(tǒng)啟動(dòng)過程可以分為三個(gè)階段:Bootloader引導(dǎo)、Linux kernel啟動(dòng)、Android啟動(dòng)。詳見下圖:

BootLoader引導(dǎo)
BootLoader是一段引導(dǎo)程序,類似于Windows開機(jī)時(shí)的出現(xiàn)第一個(gè)畫面(有品牌商標(biāo)的那個(gè))時(shí)的運(yùn)行程序。顧名思義,它的任務(wù)是配置軟硬件環(huán)境,引導(dǎo)操作系統(tǒng)的啟動(dòng)。Linux kernel啟動(dòng)
我們知道Android系統(tǒng)的最底層是Linux,所以,BootLoader引導(dǎo)程序結(jié)束后會執(zhí)行Linux內(nèi)核。Linux kernel會依次啟動(dòng):
- init進(jìn)程:第一個(gè)用戶級進(jìn)程。
- servicemanager服務(wù):所有servcie使用前都要在這里注冊。
- Zygote進(jìn)程:如圖所示,通過Android Runtime運(yùn)行虛擬機(jī),然后啟動(dòng)Zygote進(jìn)程。
- Android啟動(dòng)
- Zygote進(jìn)程:負(fù)責(zé)虛擬機(jī)的初始化。它是Android系統(tǒng)中第一個(gè)進(jìn)程(注意與前面的init進(jìn)程區(qū)分),也是之后所有進(jìn)程的母進(jìn)程,其他進(jìn)程都是有此fork出來??紤]到zygote翻譯為“受精卵”,這一點(diǎn)就比較好理解了。
- SystemServer:超級管理進(jìn)程,啟動(dòng)所有系統(tǒng)核心服務(wù),負(fù)責(zé)Android系統(tǒng)的初始化工作。由Zygote孵化出來,是Zygote進(jìn)程的第一個(gè)子進(jìn)程。SystemServer會啟動(dòng)很多服務(wù),如ActiivityManagerService,WindowManagerService等。
- ActivityManagerService:由SystemServer來啟動(dòng),System Service -> Activity Manager Service -> Launcher
- Home進(jìn)程:第一個(gè)app進(jìn)程,打開第一個(gè)Activity應(yīng)用Launcher,也就是我們的桌面應(yīng)用。安裝應(yīng)用程序時(shí)會在launcher出現(xiàn)對應(yīng)圖標(biāo),所以說我們的桌面也是一個(gè)app。
Android應(yīng)用啟動(dòng)流程
一張圖說明應(yīng)用的啟動(dòng)流程。

上面提到,Launcher本身就是一個(gè)應(yīng)用程序,所以我們啟動(dòng)app時(shí)的本質(zhì)是對Launcher這個(gè)app進(jìn)行操作。如圖所示,launcer接收到點(diǎn)擊事件時(shí)調(diào)用startActivity方法,進(jìn)行activity的跳轉(zhuǎn)。但是與我們平時(shí)開發(fā)app有所不同,我們要啟動(dòng)的Activity所在的app運(yùn)行在另外一個(gè)進(jìn)程中,這就涉及到跨進(jìn)程通信(IPC,Inter-Process Communication)。
Android中通過ActivityManagerService來實(shí)現(xiàn)和管理IPC,但是它不能直接讓開發(fā)者接觸到,而是用ActivityManager,WifiManager,LocationManager,WindowsManager等作為入口。我們這里用到的是ActivityManager,下面來詳細(xì)分析這個(gè)過程:
Launcher所在進(jìn)程通過binder發(fā)送消息給system_server進(jìn)程;
system_server進(jìn)程調(diào)用Process.start()方法向Zygote進(jìn)程發(fā)出創(chuàng)建新進(jìn)程請求。關(guān)于system server在上面的系統(tǒng)啟動(dòng)流程中有提到,它是zygote的第一個(gè)子進(jìn)程。
zygote進(jìn)程fork自身,開啟一個(gè)Linux進(jìn)程和一個(gè)主線程。ZygoteInit.main()方法來實(shí)例化Activity Thread對象,并最終返回新進(jìn)程的pid給ActivityManagerService.
ActivityThread隨后依次調(diào)用Looper.prepareLoop()和Looper.loop()來開啟消息循環(huán).
通過ActivityThread把新建的進(jìn)程和Application綁定,然后加載app的classes到內(nèi)存中
啟動(dòng) Activity。
可以看出,啟動(dòng)一個(gè)app的關(guān)鍵是新建一個(gè)進(jìn)程,關(guān)于新建進(jìn)程的詳細(xì)過程可參照下圖,這里不再展開:

到這里,關(guān)于系統(tǒng)啟動(dòng)流程和應(yīng)用啟動(dòng)流程就解釋完了,希望對你有所幫助。