android啟動過程

從開機到桌面的過程為:
Bootloader ?Kernel ?Init進程 ? Zygote ? SystemServer ? ServiceManager ? Home Launcher

android服務包括系統服務和應用服務,系統服務是指Android在啟動過程中就已經啟動實現了的服務,對于系統服務又分為java服務,和本地服務,java服務是由java代碼編寫而成,由SystemServer進程提供,而本地服務是由c/c++實現的服務,由Init進程在系統啟動是啟動的服務,應用服務是由開發者自己實現的某些特定的服務。

Bootloader

當電源按下,引導芯片開始從預定義的地方(固話在ROM(只讀內存))開始執行。加載引導程序到RAM(隨機存取存貯器),然后執行。Bootloader是操作系統內核運行之前運行。可以初始化硬件設備,建立內存空間映射圖,從而將系統的軟硬件環境帶到一個合適的狀態,以便最終調用操作系統內核準備好正確的環境。

Kernel

Android內核啟動時,會設置緩存,被保護存儲器,計劃列表,加載驅動。當內核完成系統設置,它首先在系統文件中尋找“init”文件,然后啟動root進程或者系統的第一個進程。

init進程

init進程,它是一個由內核啟動的用戶級進程,內核自行啟動(已經被載入內存,開始運行,并已初始化所有的設備驅動程序和數據結構等)之后,就通過啟動一個用戶級程序的init方式,完成引導進程,init始終是第一個進程。

啟動過程就是代碼的init.c中的main函數執行過程:system\core\init\init.c在函數中執行了:文件夾建立,掛載,rc文件解析,屬性設置,啟動服務,執行動作,socket監聽,,,

  • rc文件解析
    .rc文件是android使用的初始化腳本文件,Android中有特定的格式以及規則。

Zygote

所有的應用程序進程以及系統服務進程(SystemServer)都是有Zygote進程孕育出來(fork)出來的,zygote本身是Native應用程序,與驅動內核無關。

我們知道,Android是基于Linux內核的,而Linux系統中,所有進程都是init進程的子孫進程,也就是說,所有的進程都是被init進程直接或間接的fork出來的,Zygote進程也不例外,它是在系統啟動的過程中。由init進程創建的(在系統啟動腳本system/core/rootdir/init.rc文件中)。

在java中,不同的虛擬機實例會為不同的應用分配不同的內存,假如Android應用能盡快的啟動,但如果Android系統為每個應用啟動不同的Dalvik虛擬機實例,就會消耗大量的內存以及時間。因此,為了克服這個問題,Android系統創造了“Zygote”。Zygote是一個虛擬機進程,預加載以及初始化核心類庫,讓Dalvik虛擬機共享代碼,降低了內存和啟動時間。

Zygote進程包含兩個主要模塊

1.Socket服務端,該Socket服務端用于接收啟動新的Dalcik進程命令。
2.Framework共享類及共享資源,當Zygote進程啟動后,會裝載一些共享類和資源,共享類是在preload-class文件中定義的,共享資源是在preload-resources文件中定義的。因為其他的Dalvik進程是由Zygote進程孵化出來的,因此只要Zygote裝載好了這些類和資源后,新的Dalvik進程就不需要裝載這些類和資源了,他們共享Zygote進程的資源和類。

Zygote啟動分為兩個階段:

  • starVm(&mJavaVM , &env) 啟動虛擬機
  • onVmCreated(env) 虛擬機啟動后的初始化
  • startReg(env) 注冊JNI函數
  • env->CallStaticVoidMethod(startClass, startMeth, strArray) 調用ZygoteInit類的main函數開創java世界               ②. SystemServer進程 --- 通過Java啟動
  • registerZygoteSocket()  為zygote進程注冊監聽socket
  • preload() 加載常用的JAVA類和系統資源
  • startSystemServer() 啟動SystemServer進程
  • runSelectLoopMode() 進入循環監聽模式
  • closeServerSocket() 進程退出時,關閉socket監聽

啟動系統服務

Zygote創建新的進程去啟動系統服務。你可以在ZygoteInit類的”startSystemServer”方法中找到源代碼。

核心服務:

啟動電源管理器

創建Activity管理器:

啟動電話注冊; 
啟動包管理器;
設置Activity管理服務為系統進程;
啟動上下文管理器;
啟動系統Context Providers;
啟動電池服務;
啟動定時管理器;
啟動傳感服務;
啟動窗口管理器;
啟動藍牙服務;
啟動掛載服務。

其他服務

引導完成

一旦系統服務在內存中跑起來了,Android就完成了引導過程。在這個時候“ACTION_BOOT_COMPLETED”開機啟動廣播就會發出去。

本文整理來自https://github.com/helen-x/AndroidInterview/blob/master/android/Android%E5%90%AF%E5%8A%A8%E8%BF%87%E7%A8%8B%E5%9B%BE%E8%A7%A3.md

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容