Android的系統(tǒng)啟動(dòng)流程和應(yīng)用啟動(dòng)流程

本篇文章主要介紹按下電源鍵開機(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)。詳見下圖:

Android系統(tǒng)啟動(dòng)流程
  1. 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)。

  2. 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)程。
  1. 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)流程。


app啟動(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è)過程:

  1. Launcher所在進(jìn)程通過binder發(fā)送消息給system_server進(jìn)程;

  2. 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)程。

  3. zygote進(jìn)程fork自身,開啟一個(gè)Linux進(jìn)程和一個(gè)主線程。ZygoteInit.main()方法來實(shí)例化Activity Thread對象,并最終返回新進(jìn)程的pid給ActivityManagerService.

  4. ActivityThread隨后依次調(diào)用Looper.prepareLoop()和Looper.loop()來開啟消息循環(huán).

  5. 通過ActivityThread把新建的進(jìn)程和Application綁定,然后加載app的classes到內(nèi)存中

  6. 啟動(dòng) Activity。

可以看出,啟動(dòng)一個(gè)app的關(guān)鍵是新建一個(gè)進(jìn)程,關(guān)于新建進(jìn)程的詳細(xì)過程可參照下圖,這里不再展開:


進(jìn)程的創(chuàng)建流程

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容