2025 年 3 月 27 日より、AOSP のビルドとコントリビューションには aosp-main
ではなく android-latest-release
を使用することをおすすめします。詳細については、AOSP の変更をご覧ください。
Zygote プロセスについて
コレクションでコンテンツを整理
必要に応じて、コンテンツの保存と分類を行います。
Zygote は Android オペレーティング システムのプロセスで、同じアプリケーション バイナリ インターフェース(ABI)のすべてのシステムとアプリのプロセスの起点として機能します。
Google Pixel 7 以降などの最新のデバイスでは、64 ビット Zygote プロセスとなっています。さらに、プライマリ ABI 向けの WebView Zygote もあり、これは WebView を実行するプロセスに固有のライブラリとリソースが含まれる、専用の Zygote です。
Zygote は次のタスクを実行します。
Android OS が初期化されると、init デーモンが Zygote プロセスを生成します。一部のデュアル アーキテクチャ システムでは、2 つの Zygote プロセス(64 ビットと 32 ビット)が生成されます。このページでは単一のアーキテクチャ システムのみについて説明します。
Zygote は即座に未特化アプリプロセス(USAP)を生成することも、アプリがプロセスを必要とするまで待機してからプロセスを生成することもできます。最初のオプションはシステム プロパティまたは Android Debug Bridge コマンドから有効にする必要があります。プロセスを即座に生成するよう Zygote を設定する方法について詳細は、未特化アプリプロセス プールを有効にするをご覧ください。
USAP プールを有効にする
USAP プールの使用を有効化するには、次のいずれかを実行します。
この機能が有効な場合、それぞれの Zygote はフォークされたプロセスのプールを保持します。このプロセスはアプリ起動プロセスの中でアプリに依存しない部分を実行します。
Zygote に関する問題のトラブルシューティング
このセクションでは Zygote に関連する問題のソリューションを説明します。
Zygote がクラッシュする
デバイスが適切に再起動せず、ログまたはクラッシュ レポートで Zygote の問題の発生が示されている場合、通常 initd またはシステム サーバーのクラッシュを引き起こす変更を最近行ったことが原因です。コードを修正すると問題も解決されます。
SELinux 拒否または IO 障害
Zygote はプロセスの境界全体でのファイル記述子の健全性に厳格です。ファイル記述子がフォークの際に存在していても、許可リストに含まれない場合は、/dev/null
への dup
システムコールを使用して、キャッシュに保存されたファイル記述子が新しく開かれたファイルへのアクセスに意図せず使用されないようにします。
リソースを Zygote に読み込,む変更をフレームワークに加えていて、SELinux 拒否または IO 障害が発生している場合は、次をお試しください。
このページのコンテンツやコードサンプルは、コンテンツ ライセンスに記載のライセンスに従います。Java および OpenJDK は Oracle および関連会社の商標または登録商標です。
最終更新日 2025-03-26 UTC。
[[["わかりやすい","easyToUnderstand","thumb-up"],["問題の解決に役立った","solvedMyProblem","thumb-up"],["その他","otherUp","thumb-up"]],[["必要な情報がない","missingTheInformationINeed","thumb-down"],["複雑すぎる / 手順が多すぎる","tooComplicatedTooManySteps","thumb-down"],["最新ではない","outOfDate","thumb-down"],["翻訳に関する問題","translationIssue","thumb-down"],["サンプル / コードに問題がある","samplesCodeIssue","thumb-down"],["その他","otherDown","thumb-down"]],["最終更新日 2025-03-26 UTC。"],[],[],null,["# About the Zygote processes\n\nThe *Zygote* is a process in the Android operating system that acts as the root\nof all system and app processes with the same application binary\ninterface (ABI).\n\nOn modern devices, such as Pixel 7 and later, there is a 64-bit Zygote process.\nIn addition, there is the *WebView Zygote* for the primary ABI, which is a\nspecialized Zygote\nthat contains libraries and resources specific to processes that run WebViews.\n\nHere are the tasks the Zygote performs:\n\n1. The init daemon spawns the Zygote process when the Android OS is\n initialized. On some dual architecture systems, two Zygote processes (a 64-bit\n and 32-bit) are spawned. This page covers only single architecture systems.\n\n2. The Zygote can immediately spawn processes called *unspecialized app\n processes (USAP)* or wait to spawn processes as needed by applications.\n The former option must be enabled through a system property or Android\n debug bridge command. For more information on configuring the Zygote to spawn\n processes immediately, see\n [Enable unspecialized app processes pool](#enable).\n\n - If the USAP pool is enabled on your device:\n\n 1. The system server uses a Unix domain socket to connect to an available USAP from a pool. The system server requests that the USAP is preconfigured for application use by changing the process's ID (PID), cgroup, and other information.\n 2. When the USAP is done preconfiguring, it replies to the system server with the PID.\n 3. When an application occupies one of these USAPs, the USAP is no longer part of the pool. When the pool reaches one or fewer USAPs in the pool, the Zygote replenishes the pool with new USAPs.\n - If your Zygote spawns processes using\n [lazy evaluation](https://en.wikipedia.org/wiki/Lazy_evaluation):\n\n 1. The system server receives a command that an app needs a process.\n 2. The system server uses a Unix domain socket to send a command to the appropriate Zygote.\n 3. The Zygote forks the process and changes the PID, cgroup, and other information.\n 4. When the process is complete, it sends the PID back to the Zygote which then passes it back to the system server.\n\nEnable USAP pool\n----------------\n\nTo enable the use of USAP pool, do one of the following:\n\n- Set the `dalvik.vm.usap_pool_enabled` system property to `true` in `/build/make/target/product/runtime_libart.mk`.\n\n- Run the following command:\n\n 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\n\nWhen this feature is enabled, each Zygote maintains a pool of forked processes\nthat perform the application-independent portions of the application startup\nprocess.\n\nTroubleshoot Zygote issues\n--------------------------\n\nThis section contains solutions to Zygote-related issues.\n\n### The Zygote is crashing\n\nIf your device doesn't reboot properly and your logs or crash reports show\nissues with the Zygote, it's likely because you made a recent change that\ncauses initd or the system server to crash. Fixing your code should fix\nthe problem.\n\n### SELinux denials or IO Failures\n\nThe Zygote is particular about file descriptor hygiene across process\nboundaries. When file descriptors are present at fork time but not in an\nallowlist, we use a `dup` system call to `/dev/null` to prevent cached file\ndescriptors from being used unintentionally to access newly opened files.\n\nIf you're making framework changes that include trying to load\nresources into the Zygote, and you're receiving SELinux denials or IO failures:\n\n- For unnamed file descriptors, include the file descriptors in the `fds_to_ignore` vector when `Restat` is called.\n\n- For named file descriptors:\n\n 1. Edit \u003cvar translate=\"no\"\u003eWORKING_DIRECTORY\u003c/var\u003e`/frameworks/base/core/jni/fd_utils.cpp`.\n 2. Add the path to the allowlist for open files."]]