Android系統啟動過程

  • 2019 年 10 月 8 日
  • 筆記

一。啟動電源以及系統啟動

  當電源按下時引導芯片代碼聰預定義的地方(固化在ROM)開始執行。加載引導程序到BootLoader到RAM,然後執行

二。引導程序BootLoader

  引導程序BootLoader是在Android操作系統開始運行前的一個小程序,它的主要作用是把系統OS拉起來並運行

三。Linux內核啟動

  當內核啟動時,設置緩存、被保護存儲器、計劃列表、加載驅動。當內核完成系統設置時,它首先在系統文件中尋找init.rc文件,並啟動init進程

四。init進程啟動

  初始化和啟動屬性服務,並且啟動Zygote進程

  1)創建和掛載啟動所需的文件目錄

  2)初始化和啟動屬性服務

  3)解析init.rc配置文件並啟動Zygote進程

五。Zygote進程

  創建Java虛擬機並為Java虛擬機註冊JNI方法,創建服務器端Socket,啟動SystemServer進程

  1)創建AppRuntime並調用其start方法,啟動Zygote進程

  2)創建Java虛擬機並為Java虛擬機註冊JNI方法

  3)通過JNI調用ZygoteInit的main函數進入Zygote的Java框架層

    3.1)創建一個Server端的Socket

    3.2)預加載類和資源

    3.3)啟動SystemServer資源

    3.4)等待AMS請求創建新的應用程序進程

  4)通過registerZygoteSocket方法創建服務器端Socket,並通過sunSelectLoop方法等待AMS的請求來創建新的應用程序進程

  5)啟動SystemServer進程

六。SystemServer進程啟動

  啟動Binder線程池和SystemServiceManager,並且啟動各種系統服務

  1)啟動Binder線程池,這樣就可以與其他進程進行通信

  2)創建SystemServiceManager,其用於對系統的服務進行創建、啟動和生命周期管理

  3)啟動各種系統服務

七。Launcher啟動

  被SystemServer進程啟動的AMS會啟動Launcher,Launcher啟動後會將已安裝應用的快捷圖標顯示到界面上

知識點:

1.與JVM相比,Dalvik虛擬機(DVM)是專門為移動設備定製的,允許在有限的內存中同時運行多個虛擬機的實例,並且每一個Dalvik應用作為一個獨立的Linux進程執行。獨立的進程可以防止在虛擬機崩潰的時候所有的程序都被關閉

2.DVM中的應用每次運行時,位元組碼都需要通過即時編譯器JIT轉換為機器碼,這會是的應用的運行效率降低。而在ART中,系統在安裝應用時會進行一次預編譯(AOT),將位元組碼預先編譯成機器碼並存儲在本地,這樣應用每次運行時就不需要執行編譯了,運行效率也大大提高

3.將控制硬件的動作放在硬件抽象層中,硬件抽象層的代碼在hardware/目錄中,這是手機廠商改動最大的部分,根據手機終端所採用的硬件平台不同會有不同的實現

4.init進程是Android系統中用戶空間的第一個進程,進程號為1

5.子進程有時雖然已經退出了,但是在系統進程表中還為它保留了一定的信息(比如進程號、退出狀態、運行時間等),這個子進程就被稱作殭屍進程

6.在Android8.0中對init.rc文件進行了拆分,每個服務對應一個rc文件,Zygote啟動腳本在init.zygote64.rc中定義

7.Windows平台有個註冊表管理器,註冊表的內容採用鍵值對的形式來記錄用戶、軟件的一些使用信息。即使系統或者軟件重啟,其還是能夠根據之前註冊表中的記錄,進行相應的初始化工作。Android也提供了一個類似的機制,叫做屬性服務

8.DVM和ART、應用程序進程以及運行系統的關鍵服務的SystemServer進程都是由Zygote進程來創建的,我們也稱它為孵化器

9.SystemServer進程主要用於創建系統服務,我們熟知的AMS、WMS和PMS都是由它來創建的

10.官方把系統服務分為三種類型,分別是引導服務、核心服務和其他服務

11.系統的運行模式分三種,分別是非工廠模式、低級工廠模式和高級工廠模式

12.通俗講Launcher就是系統的桌面,它的作用主要有以下兩點

  1)作為Android系統的啟動器,用於啟動應用程序

  2)作為Android系統的桌面,用於顯示和管理應用程序的快捷圖標或者其他桌面組件

–摘自《Android進階解密》