一、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線程。