【乘風破浪】Android系統啟動篇
前言
轉載請宣告,轉自【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,用於等待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,有興趣更深入瞭解的可以通過本書來進行學習。本文中如果有描述不當或不正確的地方,請不吝賜教,萬分感激。