1. Zygote是什么?
Zygote是Android系統中的進程,由用戶空間的第一個進程Init進程啟動的,是Android系統運行的第一個AndroidRuntime進程,同時也是打通Native和Java的橋梁。
2. Zygote的作用?
Zygote進程的作用主要有兩個:
- 創建SystemServer進程;
- 孵化其他應用程序進程;
3. Zygote的啟動流程?
Zygote進程是由Init進程解析init.zygote.rc文件啟動的,zygote所對應的可執行程序app_process,所對應的源文件是App_main.cpp,進程名為zygote。
首先執行App_main.cpp的main()函數,在這里會執行以下步驟:
1.解析命令參數,主要是--zygote 和--start-system-server。
2.調用AppRuntime.start("com.android.internal.os.ZygoteInit",...),啟動虛擬機,注冊JNI函數;
3.通過JNI調用ZygoteInit.java的main()方法,從這里開始進入Java的世界;
運行Zygote的main方法,主要執行以下步驟:
- 預加載 preloadClasses()、preloadResources()、preloadSharedLibraries()
- forkSystemServer,最終會調用SystemServer.java的main()方法;
- 創建ZygoteService,進入runSelectLoop;
4. Zygote需要注意的事項
1.Zygote進行fork的時候要是單線程,為了避免造成死鎖或者狀態不一致等問題;
2.Zygote的跨進程通信沒有采用Binder機制,而是采用本地socket。
5. 孵化應用進程這種事為什么不交給SystemServer來做,而專門設計一個Zygote?
我們知道,應用在啟動的時候需要做很多准備工作,包括啟動虛擬機,加載各類系統資源等等,這些都是非常耗時的,如果能在zygote里就給這些必要的初始化工作做好,子進程在fork的時候就能直接共享,那么這樣的話效率就會非常高。這個就是zygote存在的價值,這一點呢SystemServer是替代不了的,主要是因為SystemServer里跑了一堆系統服務,這些是不能繼承到應用進程的。所以給SystemServer和應用進程里都要用到的資源抽出來單獨放在一個進程里,也就是這的zygote進程,然后zygote進程再分別孵化出SystemServer進程和應用進程。
6. Zygote的IPC通信機制為什么使用socket而不采用binder?
主要原因是因為Zygote進行fork的時候要是單線程,父進程binder線程有鎖,然后子進程的主線程一直在等其子線程(從父進程拷貝過來的子進程)的資源,但是其實父進程的子進程並沒有被拷貝過來,造成死鎖,所以fork不允許存在多線程。而非常巧的是Binder通訊偏偏就是多線程,所以干脆父進程(Zygote)這個時候就不使用binder線程。