合子有兩個功能:
關於這個問題回答這兩點是可以的。第二點可能大部分朋友都能回答,第壹點不是很清楚。SystemServer也是由Zygote啟動的,因為SystemServer需要Zygote準備的系統資源包括:
直接從Zygote繼承就不需要重裝了,所以性能會大大提高。
在說Zygote啟動流程之前,我們先明確壹個概念:啟動三步,可以理解為Android中進程啟動的常用套路,分為三步:
這裏,我們需要知道什麽是LOOP循環。其實loop的作用就是不斷接受消息,並進行處理。消息的來源可以是Soket、MessageQueue、Binder驅動發送的消息,但是不管消息來自哪裏,整個過程都是接受消息並進行處理。這個啟動三步走,不僅僅是合子進程,只要有獨立的進程,比如系統服務進程,都是自己的應用進程。
Zygote進程的啟動依賴於init進程,init進程是linux啟動後用戶空間的第壹個進程。讓我們來看看啟動過程:
3.啟動配置文件中定義的系統服務,其中Zygote服務是在配置中定義的。
4.除了Zygote,還有其他系統服務也會同時啟動,比如ServiceManager進程,通過fork+execve系統調用啟動。
在init.rc文件中,我們將導入/init。${ro.zygote}。rc,init.zygoteXX,XX,意思是32或者64。這對我們來說無關緊要。我們可以直接看init.zygote32.rc。配置文件比較長,Zygot的相關部分在這裏被截取保留。
說完了啟動配置,我們來說說啟動過程。有兩種方法可以開始這個過程:
第壹種:叉子+把手
第二種:fork+execve
他們看起來很相似。首先,它們都調用fork函數來創建子進程。這個奇怪的函數將返回兩次,壹次針對子進程,壹次針對父進程。不同的是:
主要分為兩部分:原生層處理和Java層處理。Zygote進程啟動後執行可執行系統調用,以C++編寫的二進制可執行程序中的main函數為入口,然後在Java層運行!
我們先來看看原生層的處理流程。
在app_main.cpp文件中,AndroidRuntime.cpp文件。我們可以找到幾個主要的函數名。
根據上面的代碼,您可以在我們的應用程序中直接調用JNI,而無需創建虛擬機。因為應用進程是由合子進程孵化出來的,繼承了父進程擁有的虛擬機,只需要重置數據。
然後看壹下Java層的處理,具體參考ZygoteInit文件的main方法。
1.預加載資源,如常用類庫、學科資源和壹些* * *共享庫等。
2.啟動SystemServer進程。
3.當進入套接字的Loop loop循環時,會看到ZygoteServer.runSelectLoop(…)調用。
合子啟動過程中有兩個主要問題需要解決。
最後