zygote和system server啓動過程解析

Zygote的啓動過程解析。android

Zygote其實是一個用戶態應用程序,由啓動腳本負責啓動。在啓動腳本中Zygote叫作app_process。下面分析app_main.cpp中的啓動Zygote的過程。服務器

mainapp

    |__設置runtimemParentDir/usr/binmArgCzygote參數個數,mArgVzygote參數(-Xzygote /system/bin --zygote --start-system-serversocket

    |__runtime.startAndroidRuntime::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()建立子進程且設置子進程相關uidgid等屬性)

                                |__對於建立子進程失敗則直接將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()執行init1JNI函數)

                |__執行system_init()

                        |__設置參數準備將system_server加入binder

                        |__調用執行Java代碼的init2函數

                                |__建立一個線程執行android.server.ServerThread

                                        |__啓動各類服務,如:電源管理、電池管理、藍牙等

                                        |__等待新的服務請求。

                        |__最終將system_server添加到binder

當有新的服務請求到後,system_server會調用服務請求的處理函數作以下事情:

1)與Zygote本地服務端Socket創建鏈接;

2)將待執行的類名組成指定的格式發送給Zygote

3Zygote接收到客戶端的請求後,調用ZygoteConnection.runOnce()執行該服務請求,即:建立一個子進程來運行指定類對象的main函數。

相關文章
相關標籤/搜索