Android 系統(tǒng)啟動

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

系統(tǒng)架構(gòu)圖.png

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

啟動流程
  1. Android設(shè)備上電后,首先會從處理器片上ROM的啟動引導(dǎo)代碼開始執(zhí)行,片上ROM會尋找Bootloader代碼,并加載到內(nèi)存。(這一步由“芯片廠商”負(fù)責(zé)設(shè)計(jì)和實(shí)現(xiàn))
  2. Bootloader開始執(zhí)行,首先負(fù)責(zé)完成硬件的初始化,然后找到Linux內(nèi)核代碼,并加載到內(nèi)存。(這一步由“設(shè)備廠商”負(fù)責(zé)設(shè)計(jì)和實(shí)現(xiàn))
  3. 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程序。
  4. 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”字樣
  1. Zygote進(jìn)程啟動:創(chuàng)建java虛擬機(jī)并為java虛擬機(jī)注冊JNI方法,創(chuàng)建服務(wù)器端Socket,啟動SystemServer進(jìn)程。
  2. SystemServer進(jìn)程啟動: 啟動Binder線程池和SystemServiceManager,并且啟動各種系統(tǒng)服務(wù)。
  3. 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ù)包括:


image.png

當(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

最后編輯于
?著作權(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ù)。

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