Android系統(tǒng)進(jìn)程:Zygote
在Android系統(tǒng)中,所有的應(yīng)用程序進(jìn)程以及系統(tǒng)服務(wù)進(jìn)程SystemServer都是由Zygote進(jìn)程孕育(fork)出來的,這也許就是為什么要把它稱為Zygote(受精卵)的原因。
總所周知,Android系統(tǒng)是基于Linux內(nèi)核的,而在Linux系統(tǒng)中,所有的進(jìn)程都是init進(jìn)程的子孫進(jìn)程,也就是說,所有的進(jìn)程都是直接或者間接地由init進(jìn)程fork出來的。Zygote進(jìn)程也不例外,它是在系統(tǒng)啟動的過程,由init進(jìn)程創(chuàng)建的。
1. 系統(tǒng)啟動時init進(jìn)程會創(chuàng)建Zygote進(jìn)程,Zygote進(jìn)程負(fù)責(zé)后續(xù)Android應(yīng)用程序框架層的其它進(jìn)程的創(chuàng)建和啟動工作。
2. Zygote進(jìn)程會首先創(chuàng)建一個SystemServer進(jìn)程,SystemServer進(jìn)程負(fù)責(zé)啟動系統(tǒng)的關(guān)鍵服務(wù),如包管理服務(wù)PackageManagerService和應(yīng)用程序組件管理服務(wù)ActivityManagerService。
3. 當(dāng)我們需要啟動一個Android應(yīng)用程序時,ActivityManagerService會通過Socket進(jìn)程間通信機(jī)制,請求Zygote進(jìn)程為這個應(yīng)用程序創(chuàng)建一個新的進(jìn)程。
總結(jié):
Zygote進(jìn)程負(fù)責(zé)創(chuàng)建啟動其他進(jìn)程:SystemServer進(jìn)程和應(yīng)用程序等進(jìn)程
1、系統(tǒng)啟動時:init進(jìn)程 -》Zygote進(jìn)程 -》創(chuàng)建SystemServer進(jìn)程, SystemServer進(jìn)程-》啟動系統(tǒng)的關(guān)鍵服務(wù)(AMS,PMS)
2、當(dāng)需要一個啟動一個程序時,AMS會通過Socket進(jìn)程間通信機(jī)制,通知Zygote進(jìn)程為這個應(yīng)用程序創(chuàng)建一個新的進(jìn)程
每創(chuàng)建一個進(jìn)程,都會指定該進(jìn)程啟動時對應(yīng)的java層的入口;
比如,App進(jìn)程最終是由Zygote進(jìn)程fork出來的,并且它在Java層的入口函數(shù)為ActivityThread類的靜態(tài)成員函數(shù)main。
Android系統(tǒng)中的socket機(jī)制和binder機(jī)制一樣,都是可以用來進(jìn)行進(jìn)程間通信。
參考:
https://blog.csdn.net/luoshengyang/article/details/6768304
Android應(yīng)用程序進(jìn)程啟動過程的源代碼分析
Android應(yīng)用程序安裝過程源代碼分析
Android系統(tǒng)默認(rèn)Home應(yīng)用程序(Launcher)的啟動過程源代碼分析
Android進(jìn)程間通信(IPC)機(jī)制Binder簡要介紹和學(xué)習(xí)計劃