Zygote的啓動過程解析。android
Zygote其實是一個用戶態應用程序,由啓動腳本負責啓動。在啓動腳本中Zygote叫作app_process。下面分析app_main.cpp中的啓動Zygote的過程。服務器
mainapp
|__設置runtime的mParentDir爲/usr/bin,mArgC爲zygote參數個數,mArgV爲zygote參數(-Xzygote /system/bin --zygote --start-system-server)socket
|__runtime.start(AndroidRuntime::start)函數
|__設置環境變量ANDROID_ROOToop
|__startVm():啓動VMui
|__設置啓動虛擬機參數,如:checkjni,進程堆大小16MB等編碼
|__調用JNI_CreateJavaVM()啓動虛擬機,以後JavaVM和虛擬機主線程的JNIEnv變量有效spa
|__startReg():向虛擬機主線程註冊JNI線程
|__com.android.internal.os.ZygoteInit.main(從JNI調用,今後進入JAVA世界)
|__registerZygoteSocket():建立Zygote服務端本地socket,用於監聽客戶端的鏈接請求
|__preloadClasses():預先加載preloaded-classes文件中指定的類(此過程耗時較大,好處是加快後續應用程序的啓動)
|__preloadResources():預先加載資源
|__gc():手動執行一次垃圾回收
|__startSystemServer():啓動一個子進程來運行system_server
|__硬編碼啓動system_server時使用的參數
|__調用Zygote.forkSystemServer()建立子進程
|__調用forkAndSpecializeCommon()建立子進程(調用fork()建立子進程且設置子進程相關uid、gid等屬性)
|__對於建立子進程失敗則直接將Zygote進程殺死(Zygote進程與system_server進程生死與共)
|__返回子進程ID
|__在子進程中調用handleSystemServerProcess()運行system_server
|__關閉父進程Zygote打開的本地服務端socket
|__執行RuntimeInit.zygoteInit()運行system_server
|__調用AppRuntime::onZygoteInit()。其實是與binder創建聯繫
|__調用invokeStaticMain()執行systemserver類的main函數
|__調用Class.forName()根據類名反射出類對象
|__調用類的getMethod()方法獲取systemserver類的main方法
|__調用ZygoteInit.MethodAndArgsCaller()拋出一個異常且該異常中包含systemserver類的main方法
|__runSelectLoopMode():使用多路複用I/O機制監聽鏈接到Zygote本地服務器的socket且執行響應處理
|__進入死循環監聽Zygote本地服務端socket,當有客戶端鏈接Zygote本地服務端socket後,調用ZygoteConnection.runOnce()執行該服務請求
|__ZygoteConnection.runOnce()
|__調用Zygote.forkAndSpecialize()函數建立一個子進程
|__在子進程中執行handleChildProc()處理客戶端請求
|__關閉父進程Zygote建立的服務端socket
|__執行RuntimeInit.zygoteInit()運行客戶端請求
|__調用AppRuntime::onZygoteInit()。其實是與binder創建聯繫
|__調用invokeStaticMain()執行客戶端請求類的main函數
|__調用Class.forName()根據類名反射出類對象
|__調用類的getMethod()方法獲取客戶端請求類的main方法
|__調用ZygoteInit.MethodAndArgsCaller()拋出一個異常且該異常中包含客戶端請求類的main方法
|__MethodAndArgsCaller.run():在異常處理函數處,用於啓動鏈接到Zygote服務器端socket的客戶端程序以及system_server主函數。(Zygote處理鏈接端數據時在最後使用拋異常的機制運行客戶端主函數)。
能夠得出一個結論:system_server的啓動過程和其餘應用進程的啓動過程是一致的,他們都是Zygote的子進程。
SystemServer啓動解析
main
|__System.loadLibrary(「android_servers」)加載JNI庫
|__init1()執行init1(JNI函數)
|__執行system_init()
|__設置參數準備將system_server加入binder
|__調用執行Java代碼的init2函數
|__建立一個線程執行android.server.ServerThread
|__啓動各類服務,如:電源管理、電池管理、藍牙等
|__等待新的服務請求。
|__最終將system_server添加到binder中
當有新的服務請求到後,system_server會調用服務請求的處理函數作以下事情:
1)與Zygote本地服務端Socket創建鏈接;
2)將待執行的類名組成指定的格式發送給Zygote;
3)Zygote接收到客戶端的請求後,調用ZygoteConnection.runOnce()執行該服務請求,即:建立一個子進程來運行指定類對象的main函數。