前言
對(duì)于一個(gè)Android應(yīng)用層開(kāi)發(fā)者來(lái)說(shuō),了解Android系統(tǒng)的啟動(dòng)流程對(duì)理解Android系統(tǒng)有很大的幫助。這其中包含了大量的細(xì)節(jié),而且前面很多步驟包含了C/C++實(shí)現(xiàn)的native層邏輯,作為一個(gè)應(yīng)用層的開(kāi)發(fā)者來(lái)說(shuō),很難也沒(méi)必要掌握得太深入。本文簡(jiǎn)單整理了Android系統(tǒng)的啟動(dòng)流程,對(duì)具體細(xì)節(jié)感興趣的朋友可以自行深入研究。
Android系統(tǒng)啟動(dòng)流程
Android系統(tǒng)的啟動(dòng)流程,從按power按鍵啟動(dòng)電源開(kāi)始,到Launcher應(yīng)用程序啟動(dòng)完成結(jié)束,這里大致可以分為如下7個(gè)步驟。
1、開(kāi)啟電源執(zhí)行BootLoader引導(dǎo)程序
當(dāng)按下電源后,會(huì)引導(dǎo)芯片代碼從預(yù)定義的地方開(kāi)始執(zhí)行(該預(yù)定義的地方固化在ROM中),將引導(dǎo)程序BootLoader加載到RAM中執(zhí)行。ROM和RAM是內(nèi)存的中的兩個(gè)部分,前者是Read-Only-Memmory的縮寫(xiě),顧名思義,就是只讀的內(nèi)存,這其中會(huì)預(yù)先存儲(chǔ)一些信息,比如這里系統(tǒng)啟動(dòng)時(shí)需要的信息。后者是Read-Acess-Memmory的縮寫(xiě),寫(xiě)入的內(nèi)存,在程序運(yùn)行過(guò)程中可以動(dòng)態(tài)寫(xiě)入數(shù)據(jù),系統(tǒng)關(guān)閉后,數(shù)據(jù)會(huì)被清除。
2、BootLoader拉起并執(zhí)行操作系統(tǒng)
BootLoader執(zhí)行時(shí),會(huì)拉起并運(yùn)行操作系統(tǒng)。BootLoader是一個(gè)引導(dǎo)程序,是在Android操作系統(tǒng)開(kāi)始運(yùn)行前的一個(gè)小程序,它的作用就是拉起并運(yùn)行操作系統(tǒng)。
3、操作系統(tǒng)啟動(dòng)init進(jìn)程
Android操作系統(tǒng)基于linux內(nèi)核實(shí)現(xiàn),所以此時(shí)Linux內(nèi)核開(kāi)始啟動(dòng),進(jìn)行系統(tǒng)設(shè)置。當(dāng)完成系統(tǒng)設(shè)置后,會(huì)首先在系統(tǒng)文件中尋找init.rc腳本文件,并啟動(dòng)init進(jìn)程。
4、init進(jìn)程啟動(dòng)
init,通過(guò)名稱(chēng)可以判斷它的作用是做一些初始化的工作。init進(jìn)程是Android系統(tǒng)中用戶(hù)空間的第一個(gè)進(jìn)程,進(jìn)程號(hào)為1,是Android系統(tǒng)啟動(dòng)中的一個(gè)關(guān)鍵進(jìn)程,作為第一個(gè)進(jìn)程,它被賦予了很多重要的職責(zé),簡(jiǎn)單概括為:
(1)創(chuàng)建和掛載啟動(dòng)系統(tǒng)所需要的文件目錄。
(2)初始化和啟動(dòng)屬性服務(wù)。這里的屬性服務(wù),類(lèi)似于windows操作系統(tǒng)中的注冊(cè)表管理器,用來(lái)記錄用戶(hù)、軟件等的一些信息。
(3)解析init.rc配置文件,并啟動(dòng)Zygote進(jìn)程。
5、Zygote進(jìn)程啟動(dòng)
Zygote的中文翻譯為“受精卵”,是生命的開(kāi)始,從字面意思,我們大致可以領(lǐng)會(huì)到它在Android系統(tǒng)中的地位。Dalvik/ART,應(yīng)用程序進(jìn)程以及運(yùn)行系統(tǒng)的關(guān)鍵服務(wù)SystemServer都是由Zygote進(jìn)程創(chuàng)建的,所以一般也稱(chēng)它為孵化器。Zygote需要做很多工作,歸納起來(lái)大致有如下幾條:
(1)創(chuàng)建Dalvik/ART
(2)從Native層進(jìn)入到JAVA框架層。也就是說(shuō)Zygote開(kāi)創(chuàng)了Java框架層,這一步是通過(guò)Native層通過(guò)JNI方式調(diào)用ZygoteInit類(lèi)的main方法來(lái)實(shí)現(xiàn)。Zygote的路徑為:frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
(3)ZygoteInit的main方法中會(huì)創(chuàng)建一個(gè)Service端的Socket,用于等待AMS請(qǐng)求Zygote創(chuàng)建新的應(yīng)用程序進(jìn)程。
(4)ZygoteInit的main方法中還會(huì)通過(guò)fork方式創(chuàng)建并啟動(dòng)SystemServer進(jìn)程。
6、SytemServer進(jìn)程啟動(dòng)
SytemServer是運(yùn)行系統(tǒng)的關(guān)鍵服務(wù),主要用于創(chuàng)建系統(tǒng)服務(wù),比如AMS,WMS,PMS等。它的主要職責(zé)為:
(1)啟動(dòng)Binder線(xiàn)程池。該過(guò)程主要通過(guò)ZygoteInit.nativeZygoteInit()來(lái)調(diào)用Native層的方法來(lái)實(shí)現(xiàn)啟動(dòng)Binder線(xiàn)程池的,這樣SystemServer就可以使用Binder與其他進(jìn)程進(jìn)行通信。
(2)創(chuàng)建SystemServerManager(SSM),并啟動(dòng)各種服務(wù)。這個(gè)過(guò)程是在SystemServer的main方法中調(diào)用實(shí)現(xiàn)的,可以參考如下的源碼。SystemServerManager用于對(duì)系統(tǒng)的服務(wù)進(jìn)行創(chuàng)建、啟動(dòng)和生命周期管理。這里啟動(dòng)的各種服務(wù)包括引導(dǎo)服務(wù)、核心服務(wù)、其他服務(wù)三類(lèi):引導(dǎo)服務(wù)包括AMS、PowerMS、PackageMS等;核心服務(wù)包括BatteryService等;其他服務(wù)包括WMS等,SystemUI也是在這里啟動(dòng)的。
1 //=========SystemServer.java========= 2 public static void main(String[] args) { 3 new SystemServer().run(); 4 } 5 private void run() { 6 ...... 7 //創(chuàng)建消息Looper 8 Looper.prepareMainLooper(); 9 // 加載動(dòng)態(tài)庫(kù)libandroid_servers.so,初始化native服務(wù) 10 System.loadLibrary("android_servers"); 11 ...... 12 //初始化系統(tǒng)context 13 createSystemContext(); 14 //創(chuàng)建SystemServiceManager 15 mSystemServiceManager = new SystemServiceManager(mSystemContext); 16 ...... 17 //啟動(dòng)引導(dǎo)服務(wù),如AMS等 18 startBootstrapServices(); 19 //啟動(dòng)核心服務(wù) 20 startCoreServices(); 21 //啟動(dòng)其它服務(wù),如WMS,SystemUI等 22 startOtherServices(); 23 .... 24 }
每一種服務(wù)類(lèi)型包含哪些具體的服務(wù),可以通過(guò)上述源碼中第18、20、22行進(jìn)入到對(duì)應(yīng)的方法中查看。
7、啟動(dòng)Launcher
系統(tǒng)啟動(dòng)的最后一步是啟動(dòng)一個(gè)應(yīng)用程序來(lái)顯示系統(tǒng)中已經(jīng)安裝的應(yīng)用程序,這個(gè)應(yīng)用程序就是Launcher。這一步由SystemServer創(chuàng)建的AMS來(lái)啟動(dòng),前面第5點(diǎn)“Zygote進(jìn)程啟動(dòng)”中講過(guò),創(chuàng)建一個(gè)Socket,來(lái)等待AMS請(qǐng)求Zygote創(chuàng)建新的應(yīng)用程序。Launcher在啟動(dòng)過(guò)程中會(huì)請(qǐng)求PowerManagerService返回系統(tǒng)中已經(jīng)安裝的應(yīng)用程序的信息,并將這些信息封裝成一個(gè)快捷圖標(biāo)列表顯示在系統(tǒng)屏幕上,這樣用戶(hù)可以通過(guò)點(diǎn)擊這些圖標(biāo)來(lái)啟動(dòng)對(duì)應(yīng)的應(yīng)用程序。總結(jié)來(lái)說(shuō),就是兩點(diǎn):
(1)作為Android系統(tǒng)的啟動(dòng)器,用于啟動(dòng)應(yīng)用程序。
(2)作為Android系統(tǒng)的桌面,用于顯示和管理應(yīng)用程序的快捷圖標(biāo)或者其它桌面組件。
Android系統(tǒng)啟動(dòng)流程圖
根據(jù)上述流程,可以得到如下流程圖:

結(jié)束
漫漫開(kāi)發(fā)之路,我們只是其中的一小部分……只有不斷的學(xué)習(xí)、進(jìn)階,才是我們的出路!才跟得上時(shí)代的進(jìn)步!
今年年初我花一個(gè)月的時(shí)間收錄整理了一套知識(shí)體系,如果有想法深入的系統(tǒng)化的去學(xué)習(xí)的,可以私信我【安卓】,我會(huì)把我收錄整理的資料都送給大家,幫助大家更快的進(jìn)階。
重要的事說(shuō)三遍,轉(zhuǎn)發(fā)+轉(zhuǎn)發(fā)+轉(zhuǎn)發(fā),讓更多需要的朋友們都可以看到并且領(lǐng)到!
