前言
對于一個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系統啟動流程圖
根據上述流程,可以得到如下流程圖:
結束
漫漫開發之路,我們只是其中的一小部分……只有不斷的學習、進階,才是我們的出路!才跟得上時代的進步!
今年年初我花一個月的時間收錄整理了一套知識體系,如果有想法深入的系統化的去學習的,可以私信我【安卓】,我會把我收錄整理的資料都送給大家,幫助大家更快的進階。
重要的事說三遍,轉發+轉發+轉發,讓更多需要的朋友們都可以看到并且領到!