當前位置:名人名言大全網 - 心情說說 - 大廠Android開發高頻訪談:說說妳對Zygote的理解。

大廠Android開發高頻訪談:說說妳對Zygote的理解。

Zygote可以說是Android開發面試中非常常見的問題,但是總有小夥伴在回答這個問題的時候不能滿足面試。在這裏,妳要搞清楚他問妳關於合子的問題時,最想聽到什麽,實際上想問什麽。我們通過以下幾點來分析壹下這個問題吧!

合子有兩個功能:

關於這個問題回答這兩點是可以的。第二點可能大部分朋友都能回答,第壹點不是很清楚。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(…)調用。

合子啟動過程中有兩個主要問題需要解決。

最後