Android系統(tǒng)啟動過程

第一個系統(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)顯示到界面上桂肌。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末数焊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子崎场,更是在濱河造成了極大的恐慌佩耳,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谭跨,死亡現(xiàn)場離奇詭異干厚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)螃宙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門蛮瞄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人谆扎,你說我怎么就攤上這事挂捅。” “怎么了堂湖?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵闲先,是天一觀的道長。 經(jīng)常有香客問我无蜂,道長伺糠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任斥季,我火速辦了婚禮训桶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘泻肯。我一直安慰自己渊迁,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布灶挟。 她就那樣靜靜地躺著琉朽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪稚铣。 梳的紋絲不亂的頭發(fā)上箱叁,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天墅垮,我揣著相機(jī)與錄音,去河邊找鬼耕漱。 笑死算色,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的螟够。 我是一名探鬼主播灾梦,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼紧憾,長吁一口氣:“原來是場噩夢啊……” “哼驳概!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起募强,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤寞宫,失蹤者是張志新(化名)和其女友劉穎萧福,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辈赋,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡鲫忍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了钥屈。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悟民。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖篷就,靈堂內(nèi)的尸體忽然破棺而出逾雄,到底是詐尸還是另有隱情,我是刑警寧澤腻脏,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站银锻,受9級特大地震影響永品,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜击纬,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一鼎姐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧更振,春花似錦炕桨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至实撒,卻和暖如春姊途,著一層夾襖步出監(jiān)牢的瞬間涉瘾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工捷兰, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留立叛,地道東北人。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓贡茅,卻偏偏與公主長得像秘蛇,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子顶考,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容