關於 Zygote 程序

Zygote 是 Android 作業系統中的一項程序,可透過相同的應用程式二進位檔介面 (ABI),扮演所有系統和應用程式程序的根層級。

在 Pixel 7 以上機型等新型裝置上,有 64 位元 Zygote 程序。此外,主要 ABI 還有 WebView Zygote,這是專屬的 Zygote,其中包含執行 WebView 的程序專屬的程式庫和資源。

以下是 Zygote 執行的工作:

  1. 在 Android 作業系統初始化時,init 守護程序會產生 Zygote 程序。在某些雙架構系統上,系統會產生兩個 Zygote 程序 (64 位元和 32 位元)。本頁僅涵蓋單一架構系統。

  2. Zygote 可以立即產生稱為「非專屬應用程式程序 (USAP)」的程序,或等待產生應用程式所需的程序。您必須透過系統屬性或 Android 偵錯橋接指令啟用前者。如要進一步瞭解如何設定 Zygote 立即產生程序,請參閱「啟用非專屬應用程式程序集區」。

    • 如果裝置已啟用 USAP 集區:

      1. 系統伺服器會使用 Unix 網域通訊端,從集區連線至可用的 USAP。系統伺服器會要求預先設定 USAP,以便應用程式使用,方法是變更程序 ID (PID)、cgroup 和其他資訊。
      2. USAP 預先設定完成後,系統會使用 PID 回應系統伺服器。
      3. 當應用程式佔用其中一個 USAP 時,該 USAP 就會從資源池中移除。如果泳池中的 USAP 數量達到 1 或更少,Zygote 就會以新的 USAP 補充泳池。
    • 如果 Zygote 使用延遲評估功能產生程序:

      1. 系統伺服器收到應用程式需要程序的指令。
      2. 系統伺服器會使用 Unix 網域通訊端,將指令傳送至適當的 Zygote。
      3. Zygote 會分支程序,並變更 PID、cgroup 和其他資訊。
      4. 程序完成後,它會將 PID 傳回至 Zygote,Zygote 再將 PID 傳回至系統伺服器。

啟用 USAP 集區

如要啟用 USAP 集區,請採取下列其中一種做法:

  • /build/make/target/product/runtime_libart.mk 中將 dalvik.vm.usap_pool_enabled 系統屬性設為 true

  • 執行下列指令:

    adb shell am broadcast -a \"com.google.android.gms.phenotype.FLAG_OVERRIDE\" --es package \"com.google.android.platform.runtime_native\" --es user \"\*\" --esa flags \"usap_pool_enabled\" --esa values \"true\" --esa types \"string\" com.google.android.gms
    

啟用這項功能後,每個 Zygote 都會維護一個分支程序集區,執行應用程式啟動程序中與應用程式無關的部分。

排解 Zygote 問題

本節提供 Zygote 相關問題的解決方法。

Zygote 異常終止。

如果裝置無法正常重新啟動,且記錄或當機報告顯示 Zygote 發生問題,可能是因為您最近做出的變更導致 initd 或系統伺服器當機。修正程式碼應該可以解決問題。

SELinux 拒絕或 IO 失敗

Zygote 特別注重跨程序邊界中的檔案描述符衛生狀況。如果檔案描述元在分支時存在,但不在許可清單中,我們會使用 dup 系統呼叫 /dev/null,以免快取的檔案描述元遭到誤用,用於存取新開啟的檔案。

如果您正在進行架構變更,包括嘗試將資源載入 Zygote,但收到 SELinux 拒絕或 I/O 失敗的訊息,請按照下列步驟操作:

  • 針對未命名的檔案描述元,請在呼叫 Restat 時,將檔案描述元納入 fds_to_ignore 向量中。

  • 對於命名的檔案描述元:

    1. 編輯 WORKING_DIRECTORY/frameworks/base/core/jni/fd_utils.cpp
    2. 將路徑新增至開放檔案的許可清單。