Zygote和System進程的啓動過程

init腳本的啓動

+------------+    +-------+   +-----------+
|Linux Kernel+--> |init.rc+-> |app_process|
+------------+    +-------+   +-----------+
               create and public          
                 server socket

linuz內核加載完成後,運行init.rc腳本:android

service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server socket zygote stream 666

這裏要注意兩點:app

  1. /system/bin/app_process
    Zygote服務啓動的進程名
  2. --start-system-server
    代表Zygote啓動完成以後,要啓動System進程。
  3. socket zygote stream 666
    在Zygote啓動時,建立一個權限爲666的socket。此socket用來請求Zygote建立新進程。socket的fd保存在名稱爲「ANDROID_SOCKET_zygote」的環境變量中。

Zygote進程的啓動過程

create rumtime                            
  +-----------+            +----------+                  
  |app_process+----------> |ZygoteInit|                  
  +-----------+            +-----+----+                  
                                 |                       
                                 |                       
                                 | registerZygoteSocket()
                                 |                       
   +------+  startSystemServer() |                       
   |System| <-------+            |                       
   +------+   fork               | runSelectLoopMode()   
                                 |                       
                                 v

app_process進程

/system/bin/app_process 啓動時建立了一個AppRuntime對象。經過AppRuntime對象的start方法,經過JNI調用建立了一個虛擬機實例,而後運行com.android.internal.os.ZygoteInit類的靜態main方法,傳遞true(boolean startSystemServer)參數。socket

ZygoteInit類

ZygoteInit類的main方法運行時,會經過registerZygoteSocket方法建立一個供ActivityManagerService使用的server socket。而後經過調用startSystemServer方法來啓動System進程。最後經過runSelectLoopMode來等待AMS的新建進程請求。函數

  1. 在registerZygoteSocket方法中,經過名爲ANDROID_SOCKET_zygote的環境獲取到zygote啓動時建立的socket的fd,而後以此來建立server socket。oop

  2. 在startSystemServer方法中,經過Zygote.forkSystemServer方法建立了一個子進程,並將其用戶和用戶組的ID設置爲1000。佈局

  3. 在runSelectLoopMode方法中,會將以前創建的server socket保存起來。而後進入一個無限循環,在其中經過selectReadable方法,監聽socket是否有數據可讀。有數據則說明接收到了一個請求。
    selectReadable方法會返回一個整數值index。若是index爲0,則說明這個是AMS發過來的鏈接請求。這時會與AMS創建一個新的socket鏈接,幷包裝成ZygoteConnection對象保存起來。若是index大於0,則說明這是AMS發過來的一個建立新進程的請求。此時會取出以前保存的ZygoteConnection對象,調用其中的runOnce方法建立新進程。調用完成後將connection刪除。
    這就是Zygote處理一次AMS請求的過程。線程

System進程的啓動

+                                                     
 |                                                     
 |                                                     
 v fork()                                              
 +--------------+                                      
 |System Process|                                      
 +------+-------+                                      
        |                                              
        | RuntimeInit.zygoteInit() commonInit, zygoteInitNative                                             
        | init1()  SurfaceFlinger, SensorServic...     
        |                                              
        |                                              
        | init2() +------------+                       
        +-------> |ServerThread|                       
        |         +----+-------+                       
        |              |                               
        |              | AMS, PMS, WMS...              
        |              |                               
        |              |                               
        |              |                               
        v              v

System進程是在ZygoteInit的handleSystemServerProcess中開始啓動的。code

  1. 首先,由於System進程是直接fork Zygote進程的,因此要先經過closeServerSocket方法關掉server socket。server

  2. 調用RuntimeInit.zygoteInit方法進一步啓動System進程。在zygoteInit中,經過commonInit方法設置時區和鍵盤佈局等通用信息,而後經過zygoteInitNative方法啓動了一個Binder線程池。最後經過invokeStaticMain方法調用SystemServer類的靜態Main方法。對象

  3. SystemServer類的main經過JNI調用cpp實現的init1方法。在init1方法中,會啓動各類以C++開發的系統服務(例如SurfaceFlinger和SensorService)。而後回調ServerServer類的init2方法來啓動以Java開發的系統服務。

  4. 在init2方法中,首先會新建名爲"android.server.ServerThread"的ServerThread線程,並調用其start方法。而後在該線程中啓動各類Service(例如AMS,PMS,WMS等)。啓動的方式是調用對應Service類的靜態main方法。

  5. 首先,AMS會被建立,但未註冊到ServerManager中。而後PMS被建立,AMS這時候才註冊到ServerManager中。而後到ContentService、WMS等。
    註冊到ServerManager中時會制定Service的名字,其後其餘進程能夠經過這個名字來獲取到Binder Proxy對象,以訪問Service提供的服務。

  6. 執行到這裏,System就將系統的關鍵服務啓動起來了,這時候其餘進程即可利用這些Service提供的基礎服務了。

  7. 最後會調用ActivityManagerService的systemReady方法,在該方法裏會啓動系統界面以及Home程序。

Android進程啓動

+----------------------+       +-------+      +----------+   +----------------+   +-----------+                         
   |ActivityManagerService|       |Process|      |ZygoteInit|   |ZygoteConnection|   |RuntimeInit|                         
   +--------------+-------+       +---+---+      +-----+----+   +-----------+----+   +------+----+                         
                  |                   |                |                    |               |                              
                  |                   |                |                    |               |                              
 startProcessLocked()                 |                |                    |               |                              
+---------------> |                   |                |                    |               |                              
                  |  start()          |                |                    |               |                              
                  |  "android.app.ActivityThread"      |                    |               |                              
                  +-----------------> |                |                    |               |                              
                  |                   |                |                    |               |                              
                  |                   |                |                    |               |                              
                  |                   |openZygoteSocketIfNeeded()           |               |                              
                  |                   +------+         |                    |               |                              
                  |                   |      |         |                    |               |                              
                  |                   | <----+         |                    |               |                              
                  |                   |                |                    |               |                              
                  |                   |sZygoteWriter.write(arg)             |               |                              
                  |                   +------+         |                    |               |                              
                  |                   |      |         |                    |               |                              
                  |                   |      |         |                    |               |                              
                  |                   | <----+         |                    |               |                              
                  |                   |                |                    |               |                              
                  |                   +--------------> |                    |               |                              
                  |                   |                |                    |               |                              
                  |                   |                |runSelectLoopMode() |               |                              
                  |                   |                +-----------------+  |               |                              
                  |                   |                |                 |  |               |                              
                  |                   |                | <---------------+  |               |                              
                  |                   |                |   acceptCommandPeer()              |                              
                  |                   |                |                    |               |                              
                  |                   |                |                    |               |                              
                  |                   |                |  runOnce()         |               |                              
                  |                   |                +------------------> |               |                              
                  |                   |                |                    |forkAndSpecialize()                           
                  |                   |                |                    +-------------+ |                              
                  |                   |                |                    |             | |                              
                  |                   |                |                    | <-----------+ |                              
                  |                   |                |                    |  handleChildProc()                           
                  |                   |                |                    |               |                              
                  |                   |                |                    |               |                              
                  |                   |                |                    |               |                              
                  |                   |                |                    | zygoteInit()  |                              
                  |                   |                |                    +-------------> |                              
                  |                   |                |                    |               |                              
                  |                   |                |                    |               |in^okeStaticMain()            
                  |                   |                |                    |               +---------------->             
                  |                   |                |                    |               |("android.app.ActivityThread")
                  |                   |                |                    |               |                              
                  |                   |                |                    |               |                              
                  +                   +                +                    +               +
  1. AMS向Sygote發起請求(經過以前保存的socket),攜帶各類參數,包括「android.app.ActivityThread」。
  2. Zygote進程fork本身,而後在新Zygote進程中調用RuntimeInit.zygoteInit方法進行一系列的初始化(commonInit、Binder線程池初始化等)。
  3. 新Zygote進程中調用ActivityThread的main函數,並啓動消息循環。
相關文章
相關標籤/搜索