目錄
第2章名爲 Android 系統啓動,共有六個小節的內容:
- 1、init進程啓動過程
- 2、Zygote進程啓動過程
- 3、SystemServer處理過程
- 4、Launcher啓動過程
- 5、Android系統啓動流程
- 6、本章小節
2.1、init 進程啓動過程
init 進程是 Android 系統中用戶空間的第一個進程,進程號爲 1 ,是 Android 系統啓動流程中一個關鍵的步驟,作爲第一個進程,它被賦予了很多極其重要的工作職責,比如創建 Zygote (孵化器)和屬性服務等。 init 進程是由多個源文件共同組成的,這些文件位於源碼目錄 system/core/init 中。
2.1.1、引入init 進程
爲了講解 init 進程,首先要了解 Android 系統啓動流程的前幾步,以引入 init 進程。
1、啓動電源以及系統啓動
當電源按下時引導芯片代碼從預定義的地方(固化在 ROM)開始執行。加載引導程序BootLoader 到RAM 中,然後執行。
2、引導程序 Bootloader
引導程序 BootLoader 是在 Android 操作系統開始運行前的一個小程序,它的主要作用是把系統 OS 拉起來並運行。
3、Linux 內核啓動
當內核啓動時,設置緩存、被保護存儲器、計劃列表、加載驅動。在內核完成系統設置後,它首先在系統文件中尋找 init.rc 文件,井啓動 init 進程。
4、init 進程啓動
init 進程做的工作比較多 ,主要用來初始化和啓動屬性服務,也用來啓動 Zygote 進程。
從上面的步驟可以看出, 當我們按下啓動電源時,系統啓動後會加載引導程序, 引導程序又啓動 Linux 內核,在 Linux 內核加載完成後,第一件事就是要啓動 init 進程。
2.1.7、init進程啓動總結
init 進程啓動做了很多的工作,總的來說主要做了以下三件事:
- 創建和掛載啓動所需的文件目 錄。
- 初始化和啓動屬性服務。
- 解析 init.rc 配置文件並啓動 Zygote 進程。
2.2、Zygote進程啓動過程
在 上一小節節中我們學習了 init 進程啓動過程,在啓動過程中主要做了三件事,其中一件就是創建了 Zygote 進程,本節接着學習 Zygote 進程啓動過程, 首先我們要了解 Zygote 是什麼。
2.2.1、Zygote概述
在 Android 系統中, DVM (Dalvik 虛擬機)和 ART 、 應用程序進程以及運行系統的關鍵服務的 SystemServer 進程都是由 Zygote 進程來創建的,我們也將它稱爲孵化器。
2.2.4、Zygote進程啓動總結
Zygote 進程啓動共做了如下幾件事 :
- 創建 AppRuntime 並調用其 start 方法,啓動 Zygote 進程。
- 創建 Java 虛擬機併爲 Java 虛擬機註冊 JNI 方法 。
- 通過JNI調用 Zygotelnit 的 main 函數進入 Zygote 的 Java 框架層。
- 通過 registerZygoteSocket 方法創建服務器端 Socket ,並通過 runSelectLoop 方法等待 AMS 的請求來創建新的應用程序進程。
- 啓動 SystemServer 進程。
2.3、SystemServer 處理過程
SystemServer 進程主要用於創建系統服務,我們熟知的 AMS 、 WMS 和 PMS 都是由它來創建的。
2.3.3、SystemServer 進程總結
SystemServer 進程被創建後,主要做了如下工作:
- 1 啓動 Binder 線程池,這樣就可以與其他進程進行通信 。
- 2 創建 SystemServiceManager ,其用於對系統的服務進行創建、啓動和生命週期管理。
- 3 啓動各種系統服務。
2.4、Launcher 啓動過程
此前已經學習了 Android 系統啓動流程的 init 進程、 Zygote 進程和 SystemServer 進程,最後我們來學習 Launcher 的啓動過程。
2.4.1、Launcher 概述
系統啓動的最後一步是啓動一個應用程序用來顯示系統中已經安裝的應用程序,這個應用程序就叫作 Launcher 。Launcher 在啓動過程中會請求 PackageManagerService 返回系統中已經安裝的應用程序的信息,並將這些信息封裝成一個快捷圖標列表顯示在系統屏幕上,這樣用戶可以通過點擊這些快捷圖標來啓動相應的應用程序。
通俗來講 Launcher 就是 Andro id 系統的桌面,它的作用主要有以下兩點:
- (1)作爲 Android 系統的啓動器,用於啓動應用程序 。
- (2)作爲 Android 系統的桌面,用於顯示和管理應用程序的快捷圖標或者其他桌面組件。
2.5、Android 系統啓動流程
結合本章前 4 節的內容,我們可以清晰地總結出 Android 系統啓動流程,這個流程主要有以下幾個部分。
1、啓動電源以及系統啓動
當電源按下時引導芯片代碼從預定義的地方(固化在 ROM )開始執行。加載引導程序BootLoader 到 RAM ,然後執行。
2、引導程序 Bootloader
引導程序 BootLoader 是在 Android 操作系統開始運行前的一個小程序,它的主要作用是把系統 OS 拉起來並運行。
3、Linux 內核啓動
當內核啓動時 ,設置緩存、被保護存儲器、計劃列表、加載驅動。當內核完成系統設置時,它首先在系統文件中尋找 init.rc 文件,並啓動 init 進程 。
4、init 進程啓動
初始化和啓動屬性服務,井且啓動 Zygote 進程。
5、Zygote 進程啓動
創 建 Java 虛擬機井爲 Java 虛擬機註冊 JNI 方告,創建服務器端 Socket ,啓動SystemServer 進程。
6、SystemServer 進程啓動
啓動 B inder 線程池和 SystemServiceManager,並且啓動各種系統服務。
7、Launcher 啓動
被 SystemServer 進程啓動的 AMS 會啓動 Launcher, Launcher 啓動後會將己安裝應用的快捷圖標顯示到界面上。
結合上面的流程,給出 Android 系統啓動流程圖 ,如圖 2-4 所示 。
2.6、本章小節
爲了更好地理解 Android 系統啓動流程,本章中我們先後學習了 init 進程啓動過程、Zygote 進程啓動過程、 SystemServer 進程處理過程和 Launcher 啓動過程,這些進程的啓動過程其實細節很多也很複雜, 而本章更注重流程 ,因此並不會對每一個細節進行深挖,如果想要深拉就需要讀者自行閱讀源碼。另外,本章所講到的知識會和後面章節有所關聯,是全書的基礎章節。