【系統之音】Android系統啟動篇
- 2019 年 10 月 3 日
- 筆記
前言
轉載請聲明,轉自【https://www.cnblogs.com/andy-songwei/p/11429421.html】謝謝!
對於一個Android應用層開發者來說,了解Android系統的啟動流程對理解Android系統有很大的幫助。這其中包含了大量的細節,而且前面很多步驟包含了C/C++實現的native層邏輯,作為一個應用層的開發者來說,很難也沒必要掌握得太深入。本文簡單整理了Android系統的啟動流程,對具體細節感興趣的朋友可以自行深入研究。
Android系統啟動流程
Android系統的啟動流程,從按power按鍵啟動電源開始,到Launcher應用程式啟動完成結束,這裡大致可以分為如下7個步驟。
1、開啟電源執行BootLoader引導程式
當按下電源後,會引導晶片程式碼從預定義的地方開始執行(該預定義的地方固化在ROM中),將引導程式BootLoader載入到RAM中執行。ROM和RAM是記憶體的中的兩個部分,前者是Read-Only-Memmory的縮寫,顧名思義,就是只讀的記憶體,這其中會預先存儲一些資訊,比如這裡系統啟動時需要的資訊。後者是Read-Acess-Memmory的縮寫,寫入的記憶體,在程式運行過程中可以動態寫入數據,系統關閉後,數據會被清除。
2、BootLoader拉起並執行作業系統
BootLoader執行時,會拉起並運行作業系統。BootLoader是一個引導程式,是在Android作業系統開始運行前的一個小程式,它的作用就是拉起並運行作業系統。
3、作業系統啟動init進程
Android作業系統基於Linux內核實現,所以此時Linux內核開始啟動,進行系統設置。當完成系統設置後,會首先在系統文件中尋找init.rc腳本文件,並啟動init進程。
4、init進程啟動
init,通過名稱可以判斷它的作用是做一些初始化的工作。init進程是Android系統中用戶空間的第一個進程,進程號為1,是Android系統啟動中的一個關鍵進程,作為第一個進程,它被賦予了很多重要的職責,簡單概括為:
(1)創建和掛載啟動系統所需要的文件目錄。
(2)初始化和啟動屬性服務。這裡的屬性服務,類似於Windows作業系統中的註冊表管理器,用來記錄用戶、軟體等的一些資訊。
(3)解析init.rc配置文件,並啟動Zygote進程。
5、Zygote進程啟動
Zygote的中文翻譯為“受精卵”,是生命的開始,從字面意思,我們大致可以領會到它在Android系統中的地位。Dalvik/ART,應用程式進程以及運行系統的關鍵服務SystemServer都是由Zygote進程創建的,所以一般也稱它為孵化器。Zygote需要做很多工作,歸納起來大致有如下幾條:
(1)創建Dalvik/ART
(2)從Native層進入到Java框架層。也就是說Zygote開創了Java框架層,這一步是通過Native層通過JNI方式調用ZygoteInit類的main方法來實現。Zygote的路徑為:frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
(3)ZygoteInit的main方法中會創建一個Service端的Socket,名稱為“zygote”,用於等待AMS請求Zygote創建新的應用程式進程。
(4)ZygoteInit的main方法中還會通過fork方式創建並啟動SystemServer進程。
6、SytemServer進程啟動
SytemServer是運行系統的關鍵服務,主要用於創建系統服務,比如AMS,WMS,PMS等。它的主要職責為:
(1)啟動Binder執行緒池。該過程主要通過ZygoteInit.nativeZygoteInit()來調用Native層的方法來實現啟動Binder執行緒池的,這樣SystemServer就可以使用Binder與其他進程進行通訊。
(2)創建SystemServerManager(SSM),並啟動各種服務。這個過程是在SystemServer的main方法中調用實現的,可以參考如下的源碼。SystemServerManager用於對系統的服務進行創建、啟動和生命周期管理。這裡啟動的各種服務包括引導服務、核心服務、其他服務三類:引導服務包括AMS、PowerMS、PackageMS等;核心服務包括BatteryService等;其他服務包括WMS等,SystemUI也是在這裡啟動的。
1 //=========SystemServer.java========= 2 public static void main(String[] args) { 3 new SystemServer().run(); 4 } 5 private void run() { 6 ...... 7 //創建消息Looper 8 Looper.prepareMainLooper(); 9 // 載入動態庫libandroid_servers.so,初始化native服務 10 System.loadLibrary("android_servers"); 11 ...... 12 //初始化系統context 13 createSystemContext(); 14 //創建SystemServiceManager 15 mSystemServiceManager = new SystemServiceManager(mSystemContext); 16 ...... 17 //啟動引導服務,如AMS等 18 startBootstrapServices(); 19 //啟動核心服務 20 startCoreServices(); 21 //啟動其它服務,如WMS,SystemUI等 22 startOtherServices(); 23 .... 24 }
每一種服務類型包含哪些具體的服務,可以通過上述源碼中第18、20、22行進入到對應的方法中查看。
7、啟動Launcher
系統啟動的最後一步是啟動一個應用程式來顯示系統中已經安裝的應用程式,這個應用程式就是Launcher。這一步由SystemServer創建的AMS來啟動,前面第5點“Zygote進程啟動”中講過,創建一個Socket,來等待AMS請求Zygote創建新的應用程式。Launcher在啟動過程中會請求PowerManagerService返回系統中已經安裝的應用程式的資訊,並將這些資訊封裝成一個快捷圖標列表顯示在系統螢幕上,這樣用戶可以通過點擊這些圖標來啟動對應的應用程式。總結來說,就是兩點:
(1)作為Android系統的啟動器,用於啟動應用程式。
(2)作為Android系統的桌面,用於顯示和管理應用程式的快捷圖標或者其它桌面組件。
Android系統啟動流程圖
根據上述流程,可以得到如下流程圖:

結語
本文整理的內容來源於劉望舒的《Android進階解密》第二章,該流程基於Android8.0,有興趣更深入了解的可以通過本書來進行學習。本文中如果有描述不當或不正確的地方,請不吝賜教,萬分感激。