Android 系統(tǒng)啟動流程簡析

前言

本文著重對 Android 系統(tǒng)啟動流程做一個(gè)簡析,旨在從宏觀上了解 Android 啟動流程,不涉及具體代碼細(xì)節(jié)。

Android 系統(tǒng)啟動流程

當(dāng)我們按下手機(jī)電源鍵時(shí),Android 系統(tǒng)就正式踏入了啟動流程。那么,在我們按下電源鍵時(shí),一直到顯示 Launcher 界面時(shí),Android 系統(tǒng)啟動經(jīng)歷了那些流程呢?下面我們就具體來講下大致的一些流程:

  1. 啟動電源
    按下電源鍵時(shí),硬件電路連通,CPU 會從只讀存儲器(ROM)的某個(gè)具體地址開始加載引導(dǎo)程序(即 Bootloader 代碼)到內(nèi)存(RAM),然后執(zhí)行 Bootloader。

  2. 引導(dǎo)程序:Bootloader
    引導(dǎo)程序并不隸屬于 Android 系統(tǒng),它的作用是初始化硬件設(shè)備,加載內(nèi)核文件等,為 Android 系統(tǒng)內(nèi)核啟動搭建好所需的環(huán)境(可以把 Bootloader 類比成 PC 的 BIOS)。
    Bootloader 引導(dǎo)程序是 Android 系統(tǒng)開機(jī)運(yùn)行的第一個(gè)程序,它是針對特定的主板與芯片的(與 CPU 及電路板的配置情況有關(guān)),因此,對于不同的設(shè)備制造商,它們的引導(dǎo)程序都是不同的。當(dāng)前比較受歡迎的引導(dǎo)程序有 uboot,redboot 等等。

? Bootloader 的引導(dǎo)程序一般分兩個(gè)階段執(zhí)行:

  • Stage 1:基本的硬件初始化,目的是為 Stage 2 的執(zhí)行以及隨后的 kernel 的執(zhí)行準(zhǔn)備好一些基本的硬件環(huán)境。
    Stage 1通常用匯編語言編寫,以達(dá)到短小精悍的目的。

  • Stage 2:初始化 Flash 設(shè)備,設(shè)置網(wǎng)絡(luò)、內(nèi)存等等,將 kernel 映像和根文件系統(tǒng)映像從 Flash 上讀到 RAM 空間中,加快內(nèi)核啟動速度。
    Stage 2 的代碼通常用 C 語言來實(shí)現(xiàn),以便于實(shí)現(xiàn)更復(fù)雜的功能和取得更好的代碼可讀性和可移植性。

綜上,引導(dǎo)程序的最終功能就是加載內(nèi)核文件到內(nèi)存中,然后啟動內(nèi)核。

  1. Linux 內(nèi)核啟動
    Linux 內(nèi)核開始啟動,初始化各種軟硬件環(huán)境,加載驅(qū)動程序,掛載根文件系統(tǒng)……,最重要的是,內(nèi)核啟動完成后,它會在系統(tǒng)文件中尋找 ”init” 文件,然后啟動 init 進(jìn)程。到此,Android 新世界正式開啟。

  2. init 進(jìn)程
    init 進(jìn)程是 Linux 系統(tǒng)中用戶空間的第一個(gè)進(jìn)程,進(jìn)程號為1,我們可以說它是 root 進(jìn)程或者所有進(jìn)程的父進(jìn)程。
    init 進(jìn)程有兩個(gè)責(zé)任,一是掛載目錄,比如/sys、/dev、/proc,二是運(yùn)行 init.rc 腳本(init 進(jìn)程在解析 init.rc 腳本時(shí),會創(chuàng)建 Zygote 進(jìn)程)。

:Android 系統(tǒng)以及各大 Linux 的發(fā)行版,他們的 Linux 內(nèi)核部分啟動過程都是差不多的,他們之間最大的區(qū)別就在于 init 程序的不同,因?yàn)?init 程序決定了系統(tǒng)在啟動過程中,究竟會啟動哪些守護(hù)進(jìn)程和服務(wù),以及呈現(xiàn)出怎樣的一個(gè)用戶UI界面。

因此,init 程序是分析 Android 啟動過程中最核心的程序。

  1. Zygote 進(jìn)程的創(chuàng)建
    init 進(jìn)程在解析 init.rc 腳本時(shí),會創(chuàng)建 Zygote 進(jìn)程,只有該進(jìn)程才會建立起真正的 Android 運(yùn)行空間,它是 Android 系統(tǒng)最重要的進(jìn)程之一。后續(xù) Android 中的應(yīng)用進(jìn)程都是由 Zygote 進(jìn)程 Fork 出來的,因此,Zygote 是 Android 系統(tǒng)所有應(yīng)用的父進(jìn)程(即 Java 進(jìn)程的鼻祖)。

:Zygote 進(jìn)程的出現(xiàn)是為了能更快的啟動應(yīng)用。因?yàn)樵?Android 中,每個(gè)應(yīng)用都有對應(yīng)一個(gè)虛擬機(jī)實(shí)例(VM)為應(yīng)用分配不同的內(nèi)存地址。如果 Android 系統(tǒng)為每一個(gè)應(yīng)用啟動不同的 VM 實(shí)例,就會消耗大量的內(nèi)存以及時(shí)間。因此,更好的辦法應(yīng)當(dāng)是通過創(chuàng)建一個(gè)虛擬機(jī)進(jìn)程,由該 VM 進(jìn)程預(yù)加載以及初始化核心庫類,然后,由該 VM 進(jìn)程 Fork 出其他虛擬機(jī)進(jìn)程,這樣就能達(dá)到代碼共享、低內(nèi)存占用以及最小的啟動時(shí)間,而這個(gè) VM 進(jìn)程就是 Zygote。

  1. SystemServer 進(jìn)程的創(chuàng)建
    Zygote 進(jìn)程做完初始化工作之后,會啟動 SystemServer 進(jìn)程,該進(jìn)程承載著 framework 的核心服務(wù)(與 Zygote 進(jìn)程一樣,SystemServer 進(jìn)程同樣是 Android 系統(tǒng)中最重要的進(jìn)程之一)。
    SystemServer 的主要的作用是啟動各種系統(tǒng)服務(wù),比如 ActivityManagerService,PackageManagerService,WindowManagerService 以及硬件相關(guān)的 Service 等服務(wù),我們平時(shí)熟知的各種系統(tǒng)服務(wù)其實(shí)都是在 SystemServer 進(jìn)程中啟動的(這些服務(wù)都運(yùn)行在同一進(jìn)程(即 SystemServer 進(jìn)程)的不同線程中),而當(dāng)我們的應(yīng)用需要使用各種系統(tǒng)服務(wù)的時(shí)候其實(shí)也是通過與 SystemServer 進(jìn)程通訊獲取各種服務(wù)對象的句柄進(jìn)而執(zhí)行相應(yīng)的操作的。

  2. 系統(tǒng)啟動完成
    一旦系統(tǒng)服務(wù)在內(nèi)存中跑起來了,Android 就完成了啟動過程。在這個(gè)時(shí)候 “ACTION_BOOT_COMPLETED” 開機(jī)啟動廣播就會發(fā)出去。

總結(jié)

我們知道,Android 系統(tǒng)是基于 Linux 系統(tǒng)的,因此,Android 系統(tǒng)的啟動過程大致是與 Linux 系統(tǒng)一致的:
Bootloader 啟動 Linux 內(nèi)核程序;Linux 內(nèi)核程序啟動完成后,就會創(chuàng)建 init 進(jìn)程(init 進(jìn)程是 Linux 系統(tǒng)用戶空間的第一個(gè)進(jìn)程,是所有進(jìn)程的父進(jìn)程),init 進(jìn)程分裂出更多名為 "daemons(守護(hù)進(jìn)程)" 的底層的 Linux 進(jìn)程, 諸如 android debug deamon, USB deamon 等,這些守護(hù)進(jìn)程處理底層硬件相關(guān)的接口。隨后,init 進(jìn)程通過 init.rc 腳本文件啟動 Zygote 進(jìn)程(Zygote 進(jìn)程是 Android 系統(tǒng)所有應(yīng)用的父進(jìn)程);Zygote 進(jìn)程是 Android 系統(tǒng)中最重要的進(jìn)程之一, Zygote 進(jìn)程初始化了第一個(gè) VM, 并且預(yù)加載了 framework 和眾多 App 所需要的通用資源(res),然后它開啟一個(gè) Socket 來監(jiān)聽請求, 根據(jù)請求孵化出新的 VM 來管理新的 App 進(jìn)程。一旦收到新的請求, Zygote 會基于自身預(yù)先加載的 VM 來孵化出一個(gè)新的 VM 創(chuàng)建一個(gè)新的進(jìn)程;在 Zygote 進(jìn)程啟動之后,Zygote 會孵化出一個(gè)超級管理進(jìn)程---SystemServer(該進(jìn)程是 Android 系統(tǒng)中最重要的進(jìn)程之一,上一個(gè)是 Zygote),SystemServer 會啟動 Android 系統(tǒng)所有的核心服務(wù)(系統(tǒng)服務(wù)運(yùn)行在 SystemServer 進(jìn)程的不同線程中);到此,Android 系統(tǒng)啟動完成,然后系統(tǒng)就會開始啟動 Launcher 應(yīng)用,我們就可以操作 App 了。

簡單理解:
當(dāng)我們按下手機(jī)電源鍵后,CPU 就會加載 Bootloader 引導(dǎo)程序;Bootloader會調(diào)起 Linux 內(nèi)核程序;Linux 內(nèi)核程序啟動完成后,就會創(chuàng)建 init 進(jìn)程;然后 init 進(jìn)程通過 init.rc 腳本來啟動 Zygote 進(jìn)程;Zygote 進(jìn)程又會創(chuàng)建 SystemServer 進(jìn)程,由該進(jìn)程去啟動 Android 系統(tǒng)各種系統(tǒng)服務(wù);到此,Android 系統(tǒng)已經(jīng)啟動完成。

最后,借助網(wǎng)上一張圖來看下 Android 系統(tǒ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ù)。

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