android開機流程/android啓動流程概述

轉自參考鏈接:

1.linux系統啓動

Android系統啓動流程的前幾步:
1.固化在ROM的引導芯片代碼開始執行,加載引導程序Bootloader到RAM上。
2.引導程序Bootloader開始執行//相當於PC的BIOS
3.啓動linux內核啓動
設置緩存、被保護存儲器、計劃列表,加載驅動。當內核完成系統設置,它首先在系統文件中尋找”init”文件,然後啓動root進程或者系統的第一個進程。

Linux系統啓動
這個階段啓動了Linux,Android是基於linux的,而Android系統是啓動init後啓動的

2.init進程啓動

init進程是Android系統中用戶空間的第一個進程,作爲第一個進程,它被賦予了很多極其重要的工作職責,比如創建zygote(孵化器)和屬性服務等。init進程是由多個源文件共同組成的,這些文件位於源碼目錄system/core/init。開機動畫也是在裏面啓動的

啓動Zygote
init進程主要任務是:

  1. 掛在文件和目錄
  2. 讀取int.rc配置文件,啓動Zygote和ServiceManger
  3. 啓動屬性服務,讀取默認屬性(定義在system/build.prop)和監聽屬性
  4. SurfaceFlinger服務啓動時,它會通過修改系統屬性ctl.start的值來通知init進程啓動應用程序bootanimation,然後播放開機動畫. 當System進程將系統中的關鍵服務都啓動起來之後,ActivityManagerService服務就會通知SurfaceFlinger服務boot Finished接着修改系統屬性ctl.stop的值,以便可以通知init進程停止執行應用程序bootanimation
  5. 最最主要的就是啓動Zygote.

3.啓動Zygote進程

在Android系統中,JavaVM(Java虛擬機)、應用程序進程以及運行系統的關鍵服務的SystemServer進程都是由Zygote進程來創建的,我們也將它稱爲孵化器。它通過fock(複製進程)的形式來創建應用程序進程和SystemServer進程,由於Zygote進程在啓動時會創建JavaVM,因此通過fock而創建的應用程序進程和SystemServer進程可以在內部獲取一個JavaVM的實例拷貝。
啓動SystemServer

  1. Zygote在啓動的時候創建了java虛擬機
  2. JNI調用ZygoteInit的main函數後,Zygote便進入了Java框架層
  3. Zygote啓動SystemService
  4. Zygote創建Socket,等待AMS啓動新進程的請求

4.啓動SystemServer

1.啓動Binder線程池,這樣就可以與其他進程進行通信。
2.創建SystemServiceManager用於對系統的服務進行創建、啓動和生命週期管理。
3.啓動各種系統服務。

啓動各種服務
Zygote啓動SyetemServer進程

  1. RuntimeInit.java的nativeZygoteInit函數主要做的就是啓動Binder線程池
  2. 調用SyetemServer進程的Main函數
  3. SystemService啓動引導服務,核心服務,其他服務

引導服務:

  • Installer 系統安裝apk時的一個服務類,啓動完成Installer服務之後才能啓動其他的系統服務
  • ActivityManagerService 負責四大組件的啓動、切換、調度。
  • PackageManagerService 用來對apk進行安裝、解析、刪除、卸載等等操作

核心服務:

  • BatteryService 管理電池相關的服務

其他服務:

  • InputManagerService 管理輸入事件
  • WindowManagerService 窗口管理服務
  • AudioService 音頻相關管理服務
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章