第一個系統(tǒng)進(jìn)程(init)
作為“Android框架層”這個大系列中的第一個系列皆警,我們首先要了解的是Android系統(tǒng)啟動流程,在這個流程中會涉及到很多重要的知識點截粗,這個系列我們就來一一講解它們信姓,這一篇我們就來學(xué)習(xí)init進(jìn)程。
1.init簡介
init進(jìn)程是Android系統(tǒng)中用戶空間的第一個進(jìn)程绸罗,作為第一個進(jìn)程意推,它被賦予了很多極其重要的工作職責(zé),比如創(chuàng)建zygote(孵化器)和屬性服務(wù)等从诲。init進(jìn)程是由多個源文件共同組成的左痢,這些文件位于源碼目錄system/core/init。本文將基于Android7.0源碼來分析Init進(jìn)程。
2.引入init進(jìn)程
說到init進(jìn)程俊性,首先要提到Android系統(tǒng)啟動流程的前幾步:
1.啟動電源以及系統(tǒng)啟動
當(dāng)電源按下時引導(dǎo)芯片代碼開始從預(yù)定義的地方(固化在ROM)開始執(zhí)行略步。加載引導(dǎo)程序Bootloader到RAM,然后執(zhí)行定页。
2.引導(dǎo)程序Bootloader
引導(dǎo)程序是在Android操作系統(tǒng)開始運行前的一個小程序趟薄,它的主要作用是把系統(tǒng)OS拉起來并運行。
3.linux內(nèi)核啟動
內(nèi)核啟動時典徊,設(shè)置緩存杭煎、被保護(hù)存儲器、計劃列表卒落,加載驅(qū)動羡铲。當(dāng)內(nèi)核完成系統(tǒng)設(shè)置,它首先在系統(tǒng)文件中尋找”init”文件儡毕,然后啟動root進(jìn)程或者系統(tǒng)的第一個進(jìn)程也切。
總結(jié)起來init進(jìn)程主要做了三件事:
1.創(chuàng)建一些文件夾并掛載設(shè)備
2.初始化和啟動屬性服務(wù)
3.解析init.rc配置文件并啟動zygote進(jìn)程
解析Zygote進(jìn)程啟動過程
1.Zygote簡介
在Android系統(tǒng)中,DVM(Dalvik虛擬機(jī))腰湾、應(yīng)用程序進(jìn)程以及運行系統(tǒng)的關(guān)鍵服務(wù)的SystemServer進(jìn)程都是由Zygote進(jìn)程來創(chuàng)建的雷恃,我們也將它稱為孵化器。它通過fock(復(fù)制進(jìn)程)的形式來創(chuàng)建應(yīng)用程序進(jìn)程和SystemServer進(jìn)程费坊,由于Zygote進(jìn)程在啟動時會創(chuàng)建DVM倒槐,因此通過fock而創(chuàng)建的應(yīng)用程序進(jìn)程和SystemServer進(jìn)程可以在內(nèi)部獲取一個DVM的實例拷貝。
關(guān)于init啟動zygote我們在上一篇文章已經(jīng)提到了附井,這里就不贅述了讨越,這篇文章主要分析Android7.0 Zygote的啟動流程。
2.AppRuntime分析
我們從上篇文章得知init啟動zygote時主要是調(diào)用app_main.cpp的main函數(shù)中的AppRuntime的start來啟動zygote進(jìn)程的羡忘,我們就從app_main.cpp的main函數(shù)開始分析谎痢,如下所示。
frameworks/base/cmds/app_process/app_main.cpp
Zygote啟動流程就講到這卷雕,Zygote進(jìn)程共做了如下幾件事:
1.創(chuàng)建AppRuntime并調(diào)用其start方法节猿,啟動Zygote進(jìn)程。
2.創(chuàng)建DVM并為DVM注冊JNI.
3.通過JNI調(diào)用ZygoteInit的main函數(shù)進(jìn)入Zygote的Java框架層漫雕。
4.通過registerZygoteSocket函數(shù)創(chuàng)建服務(wù)端Socket滨嘱,并通過runSelectLoop函數(shù)等待ActivityManagerService的請求來創(chuàng)建新的應(yīng)用程序進(jìn)程。
5.啟動SystemServer進(jìn)程浸间。
解析SyetemServer進(jìn)程啟動過程
1.Zygote啟動SyetemServer進(jìn)程
在上一篇文章中我們講到在ZygoteInit.java的startSystemServer函數(shù)中啟動了SyetemServer進(jìn)程太雨,如下所示。
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
2.SyetemServer進(jìn)程啟動過程
SyetemServer進(jìn)程是復(fù)制了Zygote進(jìn)程的地址空間魁蒜,因此也會得到Zygote進(jìn)程創(chuàng)建的Socket囊扳,這個Socket對于SyetemServer進(jìn)程沒有用處吩翻,因此,需要注釋1處的代碼來關(guān)閉該Socket锥咸。
啟動Binder線程池
接著我們來查看nativeZygoteInit函數(shù)對用的JNI文件狭瞎,如下所示。
frameworks/base/core/jni/AndroidRuntime.cpp
總結(jié)SyetemServer進(jìn)程
SyetemServer在啟動時做了如下工作:
1.啟動Binder線程池搏予,這樣就可以與其他進(jìn)程進(jìn)行通信熊锭。
2.創(chuàng)建SystemServiceManager用于對系統(tǒng)的服務(wù)進(jìn)行創(chuàng)建、啟動和生命周期管理雪侥。
3.啟動各種系統(tǒng)服務(wù)碗殷。
Launcher啟動過程與系統(tǒng)啟動流
上面我們學(xué)習(xí)了init進(jìn)程、Zygote進(jìn)程和SyetemServer進(jìn)程的啟動過程速缨,接下來我們就來學(xué)習(xí)Android系統(tǒng)啟動流程的最后一步:Launcher的啟動流程
1.Launcher概述
Android系統(tǒng)啟動的最后一步是啟動一個Home應(yīng)用程序锌妻,這個應(yīng)用程序用來顯示系統(tǒng)中已經(jīng)安裝的應(yīng)用程序,這個Home應(yīng)用程序就叫做Launcher旬牲。應(yīng)用程序Launcher在啟動過程中會請求PackageManagerService返回系統(tǒng)中已經(jīng)安裝的應(yīng)用程序的信息从祝,并將這些信息封裝成一個快捷圖標(biāo)列表顯示在系統(tǒng)屏幕上,這樣用戶可以通過點擊這些快捷圖標(biāo)來啟動相應(yīng)的應(yīng)用程序引谜。
2.Launcher啟動流程
SyetemServer進(jìn)程在啟動的過程中會啟動PackageManagerService,PackageManagerService啟動后會將系統(tǒng)中的應(yīng)用程序安裝完成擎浴。在此前已經(jīng)啟動的ActivityManagerService會將Launcher啟動起來员咽。
啟動Launcher的入口為ActivityManagerService的systemReady函數(shù),如下所示贮预。
frameworks/base/services/java/com/android/server/SystemServer.java
Android系統(tǒng)啟動流程
那么結(jié)合本篇以及本系列的前三篇文章贝室,我們就可以得出Android系統(tǒng)啟動流程,如下所示仿吞。
1.啟動電源以及系統(tǒng)啟動
當(dāng)電源按下時引導(dǎo)芯片代碼開始從預(yù)定義的地方(固化在ROM)開始執(zhí)行滑频。加載引導(dǎo)程序Bootloader到RAM,然后執(zhí)行唤冈。
2.引導(dǎo)程序BootLoader
引導(dǎo)程序BootLoader是在Android操作系統(tǒng)開始運行前的一個小程序峡迷,它的主要作用是把系統(tǒng)OS拉起來并運行。
3.Linux內(nèi)核啟動
內(nèi)核啟動時你虹,設(shè)置緩存绘搞、被保護(hù)存儲器、計劃列表傅物、加載驅(qū)動夯辖。當(dāng)內(nèi)核完成系統(tǒng)設(shè)置,它首先在系統(tǒng)文件中尋找init.rc文件董饰,并啟動init進(jìn)程蒿褂。
4.init進(jìn)程啟動
初始化和啟動屬性服務(wù)圆米,并且啟動Zygote進(jìn)程。
5.Zygote進(jìn)程啟動
創(chuàng)建JavaVM并為JavaVM注冊JNI啄栓,創(chuàng)建服務(wù)端Socket娄帖,啟動SystemServer進(jìn)程。
6.SystemServer進(jìn)程啟動
啟動Binder線程池和SystemServiceManager谴供,并且啟動各種系統(tǒng)服務(wù)块茁。
7.Launcher啟動
被SystemServer進(jìn)程啟動的ActivityManagerService會啟動Launcher,Launcher啟動后會將已安裝應(yīng)用的快捷圖標(biāo)顯示到界面上桂肌。