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

前言html

       轉載請聲明,轉自【http://www.noobyard.com/article/p-xqjaqrmf-cb.html】謝謝!java

       對於一個Android應用層開發者來講,瞭解Android系統的啓動流程對理解Android系統有很大的幫助。這其中包含了大量的細節,並且前面不少步驟包含了C/C++實現的native層邏輯,做爲一個應用層的開發者來講,很難也不必掌握得太深刻。本文簡單整理了Android系統的啓動流程,對具體細節感興趣的朋友能夠自行深刻研究。android

 

Android系統啓動流程小程序

       Android系統的啓動流程,從按power按鍵啓動電源開始,到Launcher應用程序啓動完成結束,這裏大體能夠分爲以下7個步驟。框架

  一、開啓電源執行BootLoader引導程序oop

       當按下電源後,會引導芯片代碼從預約義的地方開始執行(該預約義的地方固化在ROM中),將引導程序BootLoader加載到RAM中執行。ROM和RAM是內存的中的兩個部分,前者是Read-Only-Memmory的縮寫,顧名思義,就是隻讀的內存,這其中會預先存儲一些信息,好比這裏系統啓動時須要的信息。後者是Read-Acess-Memmory的縮寫,寫入的內存,在程序運行過程當中能夠動態寫入數據,系統關閉後,數據會被清除。學習

  二、BootLoader拉起並執行操做系統spa

       BootLoader執行時,會拉起並運行操做系統。BootLoader是一個引導程序,是在Android操做系統開始運行前的一個小程序,它的做用就是拉起並運行操做系統。操作系統

  三、操做系統啓動init進程線程

       Android操做系統基於Linux內核實現,因此此時Linux內核開始啓動,進行系統設置。當完成系統設置後,會首先在系統文件中尋找init.rc腳本文件,並啓動init進程。

  四、init進程啓動

       init,經過名稱能夠判斷它的做用是作一些初始化的工做。init進程是Android系統中用戶空間的第一個進程,進程號爲1,是Android系統啓動中的一個關鍵進程,做爲第一個進程,它被賦予了不少重要的職責,簡單歸納爲:

      (1)建立和掛載啓動系統所須要的文件目錄。

      (2)初始化和啓動屬性服務。這裏的屬性服務,相似於Windows操做系統中的註冊表管理器,用來記錄用戶、軟件等的一些信息。

      (3)解析init.rc配置文件,並啓動Zygote進程。

  五、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進程。

  六、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 }

每一種服務類型包含哪些具體的服務,能夠經過上述源碼中第1八、20、22行進入到對應的方法中查看。

  七、啓動Launcher

       系統啓動的最後一步是啓動一個應用程序來顯示系統中已經安裝的應用程序,這個應用程序就是Launcher。這一步由SystemServer建立的AMS來啓動,前面第5點「Zygote進程啓動」中講過,建立一個Socket,來等待AMS請求Zygote建立新的應用程序。Launcher在啓動過程當中會請求PowerManagerService返回系統中已經安裝的應用程序的信息,並將這些信息封裝成一個快捷圖標列表顯示在系統屏幕上,這樣用戶能夠經過點擊這些圖標來啓動對應的應用程序。總結來講,就是兩點:

      (1)做爲Android系統的啓動器,用於啓動應用程序。

      (2)做爲Android系統的桌面,用於顯示和管理應用程序的快捷圖標或者其它桌面組件。

 

Android系統啓動流程圖

       根據上述流程,能夠獲得以下流程圖:

 

 

結語

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