Zygote 是 Android 作業系統中的程序,可做為所有系統和應用程式程序的根,並具有相同的應用程式二進位介面 (ABI)。
在 Pixel 7 和後續機型等新式裝置上,有 64 位元 Zygote 程序。此外,主要 ABI 還有 WebView Zygote,這是專屬的 Zygote,內含專為執行 WebView 的程序提供的程式庫和資源。
Zygote 會執行下列工作:
- Android OS 初始化時,init daemon 會產生 Zygote 程序。在某些雙架構系統中,系統會產生兩個 Zygote 程序 (64 位元和 32 位元)。本頁面僅涵蓋單一架構系統。 
- Zygote 可以立即產生稱為非專用應用程式程序 (USAP) 的程序,也可以等待應用程式需要時再產生程序。您必須透過系統屬性或 Android Debug Bridge 指令啟用前一個選項。如要進一步瞭解如何設定 Zygote 立即產生程序,請參閱「啟用未專業化的應用程式程序集區 」。 - 如果裝置已啟用 USAP 集區: - 系統伺服器會使用 Unix 網域通訊端,從集區連線至可用的 USAP。系統伺服器會變更程序 ID (PID)、cgroup 和其他資訊,要求預先設定 USAP 以供應用程式使用。
- USAP 完成預先設定後,會將 PID 回覆給系統伺服器。
- 如果應用程式佔用其中一個 USAP,該 USAP 就不再屬於集區。當集區中的 USAP 數量達到一個或更少時,Zygote 會以新的 USAP 補充集區。
 
- 如果 Zygote 使用延遲評估產生程序: - 系統伺服器收到指令,指出應用程式需要程序。
- 系統伺服器會使用 Unix 網域通訊端,將指令傳送至適當的 Zygote。
- Zygote 會分叉程序並變更 PID、cgroup 和其他資訊。
- 完成程序後,會將 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 拒絕或 IO 失敗訊息,請按照下列步驟操作:
- 如果是未命名的檔案描述元,請在呼叫 - Restat時,將檔案描述元納入- fds_to_ignore向量。
- 具名檔案描述元: - 編輯「WORKING_DIRECTORY/frameworks/base/core/jni/fd_utils.cpp」。
- 將路徑新增至開放檔案的許可清單。
 
- 編輯「