zygote和system_server分析

使用的源碼:

 framework\base\cmds\app_process\App_main.cpp

  framework\base\include\android_runtime\AndroidRuntime.h

  framework\base\core\jni\android_debug_JNITest.cpp 

  framework\base\core\java\com\android\internal\os\ZygoteInit.java 

 framework\base\core\java\com\android\internal\os\RuntimeInit.java 

 framework\base\services\java\com\android\server\SystemServer.java 

 framework\base\services\jni\com_android_server_SystemServer.cpp

 framework\base\cmds\system_server\library\System_init.cpp 

framework\base\services\java\com\android\server\Watchdog.java 

framework\base\services\java\com\android\server\am\ActivityManagerService.java 

framework\base\core\java\android\os\Process.java

framework\base\core\java\com\android\internal\os\ZygoteConnection.java 


問題:

1. Java 世界是什麼時候創建的?

2. “進程”是怎麼創建和運行的?

3. 經常使用的系統service在哪裏?


以上問題都牽扯到zygote和system_server這兩個進程,這兩個進程分別是Java世界的半邊天,任何一個進程的死亡,都會導致Java世界崩潰


Zygote分析:

zygote是一個Native的應用程序,與驅動,內核等均無關係。

zygote最初的名字叫"app_process" ,這個名字是在Android.mk文件中指定的,但在運行過程中,app_process通過Linux下的pctrl系統調用將自己的名字換成"zygote"

它的原型app_process所對應的源文件是App_main.cpp



可以看到,重要功能是由AppRuntime的start來完成的。


AppRuntime分析:

AppRuntime類的聲明和實現均在App_main.cpp中,它是從AndroidRuntime類派生出來的。下面顯示了這兩個類的關係和一些重要函數:


AppRuntime重載了onStarted,onZygoteInit和onExit函數。

前面調用了AndroidRuntime的start函數,這個start函數使用的是基類的AndroidRuntime的start。現在看下:




上面標識的1,2,3共同組成了開創Android系統的Java世界的三部曲

1. StartVm 調用JNI的虛擬機創建函數,但是創建虛擬機時的一些參數卻是startVm中確定的。





註冊JNI函數:startReg:

給虛擬機註冊一些JNI函數,正式因爲後續Java世界用到的一些函數採用native方式實現,所以必須提前註冊這些函數:



上面的函數調用的是數組元素的mProc函數,我們再看看這個全局數組的gRegJNI變量:


REG_JNI是一個宏,宏裏面包括的就是那個mProc函數。下面分析一個例子:


現在虛擬機已經創建好,JNI函數也已經註冊,下一步要分析CallStaticVoidMethod了。通過這個函數,將進入Android精心打造的Java的世界。


Welcome to Java World:

這個Java世界的入口在哪裏?根據前面的分析可知:CallStaticVoidMethod最終調用com.android.internal.so.ZygoteInit的main函數。下面看看這個入口函數:




上面列舉除了5大關鍵點(1 - 5)下面一一分析

1.registerZygoteSocket 建立IPC 通信服務端

zygote及系統中其他程序的通信沒有使用Binder,而是採用了AF_UNIX類型的Socket,該函數的使用就是建立這個Socket



2. 預加載類和資源

preloadClasses 

proloadResources


preloadClasses會用coolfind工具程序在framwork中搜索名爲“preloaded-classes”的文件,最後會在framework/base目錄下找到。它是一個文本文件,內容如下:


preload_class文件由framework/base/tools/preload工具生成,它需要判斷每個類加載的時間是否大於1250ms,超過這個時間的類就會被寫道preload-classes文件中,最後由zygote預加載。

preloadResources和preloadClass類似。它主要加載framework-res.apk中的資源。

在UI編程中常使用的com.android.R.XXX資源是系統默認的資源,他們就是由zygote加載的。


3. 啓動system_server

這是要分析的第三個關鍵點:startSystemServer。這個函數會創建Java世界中系統Service所駐留的進程system_server.該進程是framework的核心。如果它死了,就會導致zygote自殺。

這個核心進程是如何啓動的?


這裏zygote進行了一次無性繁殖,分裂出了一個system_server進程


4. runSelectLoopMode 有求必應之等待請求:


這個函數作用:

1.處理客戶連接和客戶請求,其中客戶在zygote中用ZygoteConnection對象來表示

2. 客戶的請求由ZygoteConnection的runOnce來處理


總結:




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章