天天看點

Android --- Zygote和System程序啟動過程簡要分析

Android --- Zygote和System程序啟動過程簡要分析

    在看過《Android情景源代碼》的Zygote啟動章節後,作如下簡要總結。Zygote程序在init程序啟動過程中被以service服務的形式啟動:           service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server      class main      socket zygote stream 660 root system           第一行表示zygote程序是以服務的形式啟動的,其對應的可執行程式是/system/bin/app_process,後面四個參數是它的啟動參數。第二名表示在Zygote啟動過程中,要在其内部建立一個名為zygote的socket,它在Linux下的權限是666,即所有使用者多可以對它進行讀寫。      因為Zygote是以service的形式啟動,是以在init啟動過程中,android-5.1.0_r3\android5.1\system\core\init\init.c的service_start()函數會被調用。           service_start函數的主要工作是:

  • 通過fork()方法建立一個新的子線程,即Zygote線程
  • 調用create_socket()函數建立啟動腳本中的zygote socket,并儲存該socket的int型的檔案描述符。建立時,還會為此socket建立一個類型為AF_UNIX的Socket位址,并調用bind()方法将socket與此位址進行綁定。該socket還有一個對應的裝置檔案,/dev/socket/zygote。
  • 建立完socket後,會調用publish_socket()函數将該socket釋出到系統中。采用環境變量的方式,ANDROID_SOCKET_zygote -- socket的檔案描述符。
  • 調用execve(svc->args[0]),執行app_process的主程式app_main.cpp。此時,代碼進入到native層。

       app_main.cpp的main函數的主要工作是:

  • 通過調用AppRuntime::start()函數,通過JNI的方式,進一步啟動Zygote:AppRuntime.start("com.android.internal.os.ZygoteInit", args);args是參數清單,其中較重要的是标記是否要啟動System程序、記錄socket名稱。

       ZygoteInit的main函數的主要工作是:

  • 調用registerZygoteSocket("zygote")函數擷取到zygote socket檔案描述,并根據此描述符建立一個本地服務Socket:LocalServerSocket。這個服務Socket是用來等待Activity管理服務ActivityManagerService請求Zygote程序建立新的應用程式程序的。
  • 調用startSystemServer()函數啟動System程序,以便它可以将系統的關鍵服務啟動起來。該方法中通過forkSystemServer()函數建立System程序,最後調用handleSystemServerProcess()進一步啟動System程序("com.android.server.SystemServer",通過反射技術),"--runtime-init"表示需要提供Binder服務。
  • 調用runSelectLoop()來等待Activity管理服務ActivityManagerService請求Zygote程序建立新的應用程式程序。

       SystemServer的main函數的主要工作是:

  • 啟動一個線程,啟動系統的關鍵服務。

轉載于:https://www.cnblogs.com/xzmblog/p/5124078.html