本篇文章主要介紹按下電源鍵開機(jī)后發(fā)生的事情悲关,和你按下桌面上的一個應(yīng)用圖標(biāo)后發(fā)生的事情胆绊。下面就讓我們一起來探索系統(tǒng)啟動和App啟動的前世今生吧间影。
本文的關(guān)鍵是三張示意圖,基本上全文都是圍繞這三張圖的一個解釋晴氨,請一定對照著圖片閱讀本文康嘉。另外,吃水不忘挖井人籽前,感謝這三張神圖的原作者亭珍,他們都是承載我們的巨人,讓我們站的更高枝哄,看得更遠(yuǎn)肄梨,走的更穩(wěn)。
Android系統(tǒng)啟動流程
在此之前挠锥,你需要首先了解Android系統(tǒng)的分層架構(gòu)众羡,詳見我的另一篇文章Android系統(tǒng)架構(gòu)簡介
Android系統(tǒng)啟動過程可以分為三個階段:Bootloader引導(dǎo)、Linux kernel啟動蓖租、Android啟動粱侣。詳見下圖:
BootLoader引導(dǎo)
BootLoader是一段引導(dǎo)程序,類似于Windows開機(jī)時的出現(xiàn)第一個畫面(有品牌商標(biāo)的那個)時的運(yùn)行程序蓖宦。顧名思義齐婴,它的任務(wù)是配置軟硬件環(huán)境,引導(dǎo)操作系統(tǒng)的啟動球昨。Linux kernel啟動
我們知道Android系統(tǒng)的最底層是Linux尔店,所以眨攘,BootLoader引導(dǎo)程序結(jié)束后會執(zhí)行Linux內(nèi)核主慰。Linux kernel會依次啟動:
- init進(jìn)程:第一個用戶級進(jìn)程嚣州。
- servicemanager服務(wù):所有servcie使用前都要在這里注冊。
- Zygote進(jìn)程:如圖所示共螺,通過Android Runtime運(yùn)行虛擬機(jī)该肴,然后啟動Zygote進(jìn)程。
- Android啟動
- Zygote進(jìn)程:負(fù)責(zé)虛擬機(jī)的初始化藐不。它是Android系統(tǒng)中第一個進(jìn)程(注意與前面的init進(jìn)程區(qū)分)匀哄,也是之后所有進(jìn)程的母進(jìn)程,其他進(jìn)程都是有此fork出來雏蛮∠呀溃考慮到zygote翻譯為“受精卵”,這一點(diǎn)就比較好理解了挑秉。
- SystemServer:超級管理進(jìn)程法梯,啟動所有系統(tǒng)核心服務(wù),負(fù)責(zé)Android系統(tǒng)的初始化工作犀概。由Zygote孵化出來立哑,是Zygote進(jìn)程的第一個子進(jìn)程。SystemServer會啟動很多服務(wù)姻灶,如ActiivityManagerService铛绰,WindowManagerService等。
- ActivityManagerService:由SystemServer來啟動产喉,System Service -> Activity Manager Service -> Launcher
- Home進(jìn)程:第一個app進(jìn)程捂掰,打開第一個Activity應(yīng)用Launcher,也就是我們的桌面應(yīng)用曾沈。安裝應(yīng)用程序時會在launcher出現(xiàn)對應(yīng)圖標(biāo)尘颓,所以說我們的桌面也是一個app。
Android應(yīng)用啟動流程
一張圖說明應(yīng)用的啟動流程晦譬。
上面提到疤苹,Launcher本身就是一個應(yīng)用程序,所以我們啟動app時的本質(zhì)是對Launcher這個app進(jìn)行操作敛腌。如圖所示卧土,launcer接收到點(diǎn)擊事件時調(diào)用startActivity方法,進(jìn)行activity的跳轉(zhuǎn)像樊。但是與我們平時開發(fā)app有所不同尤莺,我們要啟動的Activity所在的app運(yùn)行在另外一個進(jìn)程中,這就涉及到跨進(jìn)程通信(IPC生棍,Inter-Process Communication)颤霎。
Android中通過ActivityManagerService來實(shí)現(xiàn)和管理IPC,但是它不能直接讓開發(fā)者接觸到,而是用ActivityManager友酱,WifiManager晴音,LocationManager,WindowsManager等作為入口缔杉。我們這里用到的是ActivityManager锤躁,下面來詳細(xì)分析這個過程:
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)啟動流程中有提到系羞,它是zygote的第一個子進(jìn)程。
zygote進(jìn)程fork自身,開啟一個Linux進(jìn)程和一個主線程霸琴。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)存中
啟動 Activity梧乘。
可以看出杠人,啟動一個app的關(guān)鍵是新建一個進(jìn)程,關(guān)于新建進(jìn)程的詳細(xì)過程可參照下圖宋下,這里不再展開:
到這里嗡善,關(guān)于系統(tǒng)啟動流程和應(yīng)用啟動流程就解釋完了,希望對你有所幫助学歧。