Zygote

一、App啟動(dòng)流程

App啟動(dòng)

二、zygote的作用

a. 啟動(dòng)systemServer (常用類、JNI函數(shù)、主題資源、共享庫(kù))

b. 孵化應(yīng)用進(jìn)程

三、zygote的啟動(dòng)流程

1. init進(jìn)程是系統(tǒng)啟動(dòng)后用戶空間第一個(gè)進(jìn)程,它通過讀取init.rc讀取那些系統(tǒng)服務(wù)需要啟動(dòng),如zygote, service manager,liunx啟動(dòng)之后,首先加載啟動(dòng)配置文件

2. fork+execve啟動(dòng)進(jìn)程,主要為分native和java兩方面

由native進(jìn)行準(zhǔn)備工作(啟動(dòng)Android虛擬機(jī) --> 注冊(cè)Android的JNI函數(shù) --> 進(jìn)入java世界)

由于zygote進(jìn)程已經(jīng)創(chuàng)建好了java虛擬機(jī),新進(jìn)程繼承自zygote,所以不用創(chuàng)建了,只需要重置一下虛擬機(jī)的狀態(tài)和守護(hù)線程。

然后切換到j(luò)ava去執(zhí)行

1)首先預(yù)加載資源,preload resources

2)fork -> systemServer, SystemServer在單獨(dú)的線程

3)然后進(jìn)行l(wèi)oop循環(huán),等待Socket

zygote進(jìn)程loop循環(huán)接收socket消息,接收到消息后會(huì)執(zhí)行runOnce方法,fork新進(jìn)程,并在新進(jìn)程中調(diào)用ActivityThread.main()方法

注意:

a. Zygote fork要單線程

b. Zygote的IPC沒有采用binder,用的是socket

問題:

?1.孵化應(yīng)用程序?yàn)樯恫唤唤osystemServer,而是專門設(shè)計(jì)一個(gè)zygote?

因?yàn)閟ystemServer中運(yùn)行了很多系統(tǒng)服務(wù),不能被繼承。應(yīng)用程序啟動(dòng)時(shí),除了必要的資源外,最好是干凈的,所以需要單獨(dú)用一個(gè)zygote來fork,zygote會(huì)把init工作做好,再共享給子進(jìn)程,效率高

2.?zyogte的IPC為什么不用binder?用binder會(huì)有問題嗎?

因?yàn)锽inder通信是需要多線程的,代理對(duì)象對(duì)binder的調(diào)用是在binder線程,需要再通過Hander調(diào)用主線程來操作。

總結(jié)起來就是怕父進(jìn)程binder線程有鎖,然后子進(jìn)程的主線程一直在等其子線程(從父進(jìn)程拷貝過來的子進(jìn)程)的資源,但是其實(shí)父進(jìn)程的子進(jìn)程并沒有被拷貝過來,造成死鎖,所以fork不允許存在多線程。而非常巧的是Binder通訊偏偏就是多線程,所以干脆父進(jìn)程(Zgote)這個(gè)時(shí)候就不使用binder線程。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容