Android系統啟動過程
- 2019 年 10 月 8 日
- 筆記

一。啟動電源以及系統啟動
當電源按下時引導芯片代碼聰預定義的地方(固化在ROM)開始執行。加載引導程序到BootLoader到RAM,然後執行
二。引導程序BootLoader
引導程序BootLoader是在Android操作系統開始運行前的一個小程序,它的主要作用是把系統OS拉起來並運行
三。Linux內核啟動
當內核啟動時,設置緩存、被保護存儲器、計劃列表、加載驅動。當內核完成系統設置時,它首先在系統文件中尋找init.rc文件,並啟動init進程
四。init進程啟動
初始化和啟動屬性服務,並且啟動Zygote進程
1)創建和掛載啟動所需的文件目錄
2)初始化和啟動屬性服務
3)解析init.rc配置文件並啟動Zygote進程
五。Zygote進程
創建Java虛擬機並為Java虛擬機註冊JNI方法,創建服務器端Socket,啟動SystemServer進程

1)創建AppRuntime並調用其start方法,啟動Zygote進程
2)創建Java虛擬機並為Java虛擬機註冊JNI方法
3)通過JNI調用ZygoteInit的main函數進入Zygote的Java框架層
3.1)創建一個Server端的Socket
3.2)預加載類和資源
3.3)啟動SystemServer資源
3.4)等待AMS請求創建新的應用程序進程
4)通過registerZygoteSocket方法創建服務器端Socket,並通過sunSelectLoop方法等待AMS的請求來創建新的應用程序進程
5)啟動SystemServer進程
六。SystemServer進程啟動
啟動Binder線程池和SystemServiceManager,並且啟動各種系統服務

1)啟動Binder線程池,這樣就可以與其他進程進行通信
2)創建SystemServiceManager,其用於對系統的服務進行創建、啟動和生命周期管理
3)啟動各種系統服務
七。Launcher啟動
被SystemServer進程啟動的AMS會啟動Launcher,Launcher啟動後會將已安裝應用的快捷圖標顯示到界面上

知識點:
1.與JVM相比,Dalvik虛擬機(DVM)是專門為移動設備定製的,允許在有限的內存中同時運行多個虛擬機的實例,並且每一個Dalvik應用作為一個獨立的Linux進程執行。獨立的進程可以防止在虛擬機崩潰的時候所有的程序都被關閉
2.DVM中的應用每次運行時,位元組碼都需要通過即時編譯器JIT轉換為機器碼,這會是的應用的運行效率降低。而在ART中,系統在安裝應用時會進行一次預編譯(AOT),將位元組碼預先編譯成機器碼並存儲在本地,這樣應用每次運行時就不需要執行編譯了,運行效率也大大提高
3.將控制硬件的動作放在硬件抽象層中,硬件抽象層的代碼在hardware/目錄中,這是手機廠商改動最大的部分,根據手機終端所採用的硬件平台不同會有不同的實現
4.init進程是Android系統中用戶空間的第一個進程,進程號為1
5.子進程有時雖然已經退出了,但是在系統進程表中還為它保留了一定的信息(比如進程號、退出狀態、運行時間等),這個子進程就被稱作殭屍進程
6.在Android8.0中對init.rc文件進行了拆分,每個服務對應一個rc文件,Zygote啟動腳本在init.zygote64.rc中定義
7.Windows平台有個註冊表管理器,註冊表的內容採用鍵值對的形式來記錄用戶、軟件的一些使用信息。即使系統或者軟件重啟,其還是能夠根據之前註冊表中的記錄,進行相應的初始化工作。Android也提供了一個類似的機制,叫做屬性服務
8.DVM和ART、應用程序進程以及運行系統的關鍵服務的SystemServer進程都是由Zygote進程來創建的,我們也稱它為孵化器
9.SystemServer進程主要用於創建系統服務,我們熟知的AMS、WMS和PMS都是由它來創建的
10.官方把系統服務分為三種類型,分別是引導服務、核心服務和其他服務
11.系統的運行模式分三種,分別是非工廠模式、低級工廠模式和高級工廠模式
12.通俗講Launcher就是系統的桌面,它的作用主要有以下兩點
1)作為Android系統的啟動器,用於啟動應用程序
2)作為Android系統的桌面,用於顯示和管理應用程序的快捷圖標或者其他桌面組件
–摘自《Android進階解密》