一、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ù)。