天天看點

【系統之音】Android系統啟動篇

對于一個Android應用層開發者來說,了解Android系統的啟動流程對了解Android系統有很大的幫助。本文根據劉望舒的《Android進階解密》第二章中的内容進行了梳理,希望通過本文,能宏觀地了解Android系統的啟動流程,加深對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的縮寫,顧名思義,就是隻讀的記憶體,這其中會預先存儲一些資訊,比如這裡系統啟動時需要的資訊。後者是Random-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在啟動過程中會請求PackageManagerService傳回系統中已經安裝的應用程式的資訊,并将這些資訊封裝成一個快捷圖示清單顯示在系統螢幕上,這樣使用者可以通過點選這些圖示來啟動對應的應用程式。總結來說,就是兩點:

      (1)作為Android系統的啟動器,用于啟動應用程式。

      (2)作為Android系統的桌面,用于顯示和管理應用程式的快捷圖示或者其它桌面元件。

Android系統啟動流程圖

       根據上述流程,可以得到如下流程圖:

【系統之音】Android系統啟動篇

結語

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

繼續閱讀