使用的源碼:
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來處理
總結: