第一個(gè)系統(tǒng)進(jìn)程init
Android設(shè)備的啟動(dòng)需要經(jīng)過(guò)Boot Loader, Linux Kernel和Android系統(tǒng)服務(wù)三個(gè)核心階段. 默認(rèn)情況都有其對(duì)應(yīng)的啟動(dòng)動(dòng)畫(huà).
究其本質(zhì)的話(huà). Android系統(tǒng)并不算一個(gè)嚴(yán)格意義上的操作系統(tǒng). 因?yàn)槠鋵?shí)際上是運(yùn)行在Linux內(nèi)核之上的一系列的服務(wù)進(jìn)程. 而正是因?yàn)檫@些進(jìn)程才維持了設(shè)備的正常工作的關(guān)鍵. 而它們的祖先進(jìn)程就是init
作為第一個(gè)啟動(dòng)的進(jìn)程, 那么init的PID也就是0. 其通過(guò)對(duì)init.rc腳本來(lái)構(gòu)建系統(tǒng)的初始化形態(tài). 在這個(gè)腳本里面會(huì)陸續(xù)的啟動(dòng)Android的系統(tǒng)服務(wù).
系統(tǒng)關(guān)鍵服務(wù)的啟動(dòng)簡(jiǎn)析
作為系統(tǒng)的第一個(gè)進(jìn)程. 那么init就承擔(dān)著啟動(dòng)其他系統(tǒng)服務(wù)的職責(zé). 其中最主要的就是ServiceManager, Zygote, SystemServer
ServiceManager
ServiceManager是Binder機(jī)制中的管理者. 保存著整個(gè)系統(tǒng)的所有Binder服務(wù)端(例如ActivityManagerService,WindowManagerService等), 并且管理著B(niǎo)inder服務(wù)端的名字和句柄.
SM是在Init.rc里描述并由init進(jìn)程啟動(dòng)的, 并且SM是一個(gè)Linux的程序.
SM所屬的class是core, 其他同類(lèi)的系統(tǒng)進(jìn)程包括ueventd,console,adbd等. 根據(jù)core的特性, 這些進(jìn)程會(huì)同時(shí)被啟動(dòng)或停止. 另外由于被critical選項(xiàng)被標(biāo)注, 說(shuō)明其是系統(tǒng)的關(guān)鍵進(jìn)程也就是說(shuō)如果進(jìn)程不幸地在4分鐘內(nèi)異常退出超過(guò)4次, 則設(shè)備將重啟并進(jìn)入還原模式. 當(dāng)ServiceManager每次重啟時(shí), 其他關(guān)鍵進(jìn)程如zygote, media, SurfaceFlinger等也會(huì)被重啟.
Zygote
zygote根據(jù)其字面意思受精卵可以大概猜出這是會(huì)衍生出新的生命的功能模塊. 而Android中大多數(shù)應(yīng)用程序和系統(tǒng)進(jìn)程都是通過(guò)zygote來(lái)生成的.
zygote不僅預(yù)裝載各種系統(tǒng)類(lèi), 還有一個(gè)工作就是啟動(dòng)SystemServer, 這是大部分Android系統(tǒng)服務(wù)的所在地.
SystemServer
SystemServer是Android進(jìn)入Launcher前的最后準(zhǔn)備. 它提供了眾多由java語(yǔ)言編寫(xiě)的系統(tǒng)服務(wù).
ZygoteInit通過(guò)Zygote.forkSystemServer來(lái)生成一個(gè)新進(jìn)程, 用于承載各系統(tǒng)服務(wù). Zygote內(nèi)部有Native層函數(shù)來(lái)進(jìn)一步響應(yīng), 最終調(diào)用底層系統(tǒng)的fork接口來(lái)實(shí)際產(chǎn)生一個(gè)進(jìn)程.
之后SystemServer中的三個(gè)重要的static函數(shù)會(huì)被執(zhí)行. 分別是:
- main: 主函數(shù)
- init1: 這個(gè)native函數(shù)主要完成本地層Service的啟動(dòng)(SurfaceFlinger, AudioFlinger等). 完成會(huì)回調(diào)init2
- init2: 這是Java層各Service被啟動(dòng)的地方(例如AMS,WMS等).