Android 系統(tǒng)啟動

一、Android 啟動過程

1、啟動電源以及系統(tǒng)啟動
當電源按下時引導(dǎo)芯片代碼從預(yù)定義的代碼可以執(zhí)行,加載BootLoader到RAM中,然后執(zhí)行。

2、引導(dǎo)程序BootLoader
引導(dǎo)程序BootLoader是在Android操作系統(tǒng)開始運行之前的一個小程序,它的主要作用是把系統(tǒng)OS拉起來并運行。

3、Linux內(nèi)核的啟動
當系統(tǒng)啟動時,設(shè)置緩存、計劃列表、加載驅(qū)動等,在內(nèi)核完成系統(tǒng)設(shè)置后,它首先在系統(tǒng)文件中尋找init.rc文件,并啟動init進程。

4、init進程啟動
主要用來初始化和啟動屬性服務(wù),也用來啟動Zygote進程。

二、init進程啟動總結(jié)

init進程是Android 系統(tǒng)中用戶空間的第一個進程,進程號為1,是Android系統(tǒng)啟動進程中一個關(guān)鍵的步驟,它被賦予了很多極其重要的工作職責。

init進程啟動做了很多工作,總的來說主要做了以下三件事:
1、創(chuàng)建和掛載啟動所需的文件目錄。
2、初始化和啟動屬性服務(wù)
3、解析init.rc配置文件并啟動Zygote進程。

三、Zygote進程啟動過程

1、Zygote概述
? ? ? ? ?在Android 系統(tǒng)中,DVM(Dalvik虛擬機)和ART、應(yīng)用程序進程以及運行系統(tǒng)的關(guān)鍵服務(wù)的SystemServer進程都是由Zygote進程創(chuàng)建的,我們將它稱為孵化器。它通過fock(復(fù)制進程)的形式來創(chuàng)建應(yīng)用程序進程和SystemServer進程,由于Zygote進程在啟動時會創(chuàng)建DVM或者ART,因此通過fock而創(chuàng)建的應(yīng)用程序進程和SystemServer進程可以在內(nèi)部獲取一個DVM或者ART的實例副本。

2、Zygote進程的啟動
? ? ? ? init啟動Zygote時主要是調(diào)用app_main.cpp的main函數(shù)中的AppRuntime.cpp的start方法來啟動Zygote進程的。(可以app_main.cpp和AppRuntime.cpp)。

? ? ? ?在AppRuntime.cpp的start方法中,會啟動Java虛擬機、為Java虛擬機注冊JNI方法、通過JNI調(diào)用ZygoteInit的main方法。? 為什么要使用JNI呢?因為ZygoteInit.java是用Java語音編寫的,當前運行的邏輯在Native中,這就需要通過JNI來調(diào)用Java。這樣Zygote就從Native層進入了Java框架層。

? ? ? ?可以閱讀ZygoteInit.java的main方法。在該方法中做了四件重要的事。
a、創(chuàng)建Server端的Socket,socketName的值為“zygote”
? ? ? ? ? ?zygoteServer.registerServerSocket(socketName)
? ? ? 這個Socket用于等待ActivityMangerService請求Zygote來創(chuàng)建新的應(yīng)用程序進程。

b、預(yù)加載類和資源
? ? ? ? ? ?preload(bootTimeingsTraceLog)

c、啟動SystemServer進程
? ? ? ? ? ?startSystemServer(...)
? ? ? ? ? ?這樣系統(tǒng)服務(wù)也會由SystemServer進程啟動起來

d、等待AMS請求創(chuàng)建新的應(yīng)用程序進程
? ? ? ? ? ?zygoteServer.runSelectLoop(..)

四、SystemServer處理過程

? ? ? ? ? SystemServer主要是用于創(chuàng)建系統(tǒng)服務(wù),比如AMS、WMS、PMS都是由它創(chuàng)建的。(還是ZygoteInit.java類)
? ? ? ? ? 在啟動SystemServer時會調(diào)用ZygoteInit的zygoteInit(),在該方法中做了兩個重要的事。

1、啟動Binder線程池
? ? ? ? ZygoteInit.nativeZygoteInit()//調(diào)用native層的代碼,用來啟動Binder線程池。
啟動了Binder線程池,這樣SystemServer進程就可以使用Binder與其他進程通信了。

2、RuntimeInit.applicationInit(...)
? ? ? ? ?進入SystemServer的main(),在該方法中調(diào)用了run()

run()中創(chuàng)建消息Looper、加載動態(tài)庫lib、創(chuàng)建SSM(SystemServerManager)
SSM會對系統(tǒng)服務(wù)進行創(chuàng)建、啟動和生命周期的管理。

官方把系統(tǒng)服務(wù)分為三種類型:引導(dǎo)服務(wù)、核心服務(wù)、其他服務(wù)。

創(chuàng)建Binder線程池。

創(chuàng)建SystemServiceManager,其用于對系統(tǒng)的服務(wù)進行創(chuàng)建、啟動和生命周期管理。

啟動各種系統(tǒng)服務(wù)。

五、Launcher啟動過程

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容