Der Zygote ist ein Prozess im Android-Betriebssystem, der als Stamm aller System- und App-Prozesse mit derselben Anwendungs-Binärschnittstelle (Application Binary Interface, ABI) dient.
Auf modernen Geräten wie Google Pixel 7 und höher wird ein 64‑Bit-Zygote-Prozess verwendet. Außerdem gibt es den WebView-Zygote für das primäre ABI. Das ist ein spezieller Zygote, der Bibliotheken und Ressourcen für Prozesse enthält, in denen WebViews ausgeführt werden.
Das Zygote führt folgende Aufgaben aus:
Der Init-Daemon startet den Zygote-Prozess, wenn das Android-Betriebssystem initialisiert wird. Bei einigen Systemen mit zwei Architekturen werden zwei Zygote-Prozesse (ein 64‑Bit- und ein 32‑Bit-Prozess) erzeugt. Auf dieser Seite werden nur Systeme mit einer einzelnen Architektur behandelt.
Der Zygote kann sofort Prozesse erzeugen, die als unspezialisierte App-Prozesse (USAP) bezeichnet werden, oder warten, bis Prozesse nach Bedarf von Anwendungen erzeugt werden. Die erste Option muss über eine Systemeigenschaft oder einen Android Debug Bridge-Befehl aktiviert werden. Weitere Informationen zum Konfigurieren des Zygote, damit Prozesse sofort gestartet werden, finden Sie unter Pool für nicht spezialisierte App-Prozesse aktivieren .
Wenn der USAP-Pool auf Ihrem Gerät aktiviert ist:
- Der Systemserver verwendet einen Unix-Domain-Socket, um eine Verbindung zu einem verfügbaren USAP aus einem Pool herzustellen. Der Systemserver fordert an, dass die USAP für die Anwendungsnutzung vorkonfiguriert wird, indem die ID (PID), die Cgroup und andere Informationen des Prozesses geändert werden.
- Wenn die USAP die Vorkonfigurierung abgeschlossen hat, antwortet sie dem Systemserver mit der PID.
- Wenn eine Anwendung einen dieser USAPs belegt, ist der USAP nicht mehr Teil des Pools. Wenn der Pool nur noch eine oder gar keine USAPs enthält, füllt der Zygote den Pool mit neuen USAPs auf.
Wenn Ihr Zygote Prozesse mit Lazy Evaluation startet:
- Der Systemserver erhält den Befehl, dass eine App einen Prozess benötigt.
- Der Systemserver verwendet einen Unix-Domain-Socket, um einen Befehl an die entsprechende Zygote zu senden.
- Der Zygote teilt den Prozess und ändert die PID, die Cgroup und andere Informationen.
- Nach Abschluss des Vorgangs sendet der Prozess die PID an den Zygote zurück, der sie dann an den Systemserver weitergibt.
USAP-Pool aktivieren
So aktivieren Sie die Verwendung des USAP-Pools:
Legen Sie die Systemeigenschaft
dalvik.vm.usap_pool_enabled
in/build/make/target/product/runtime_libart.mk
auftrue
fest.Führen Sie den folgenden Befehl aus:
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
Wenn diese Funktion aktiviert ist, verwaltet jedes Zygote einen Pool von gegabelten Prozessen, die die anwendungsunabhängigen Teile des Anwendungsstartprozesses ausführen.
Zygote-Probleme beheben
Dieser Abschnitt enthält Lösungen für Probleme im Zusammenhang mit Zygote.
Der Zygote stürzt ab
Wenn Ihr Gerät nicht richtig neu gestartet wird und Ihre Protokolle oder Absturzberichte Probleme mit dem Zygote zeigen, liegt das wahrscheinlich daran, dass Sie vor Kurzem eine Änderung vorgenommen haben, die dazu führt, dass initd oder der Systemserver abstürzt. Wenn Sie den Code korrigieren, sollte das Problem behoben werden.
SELinux-Denials oder I/O-Fehler
Der Zygote achtet besonders auf die Dateideskriptorhygiene über Prozessgrenzen hinweg. Wenn Dateideskriptoren zum Zeitpunkt des Forks vorhanden sind, aber nicht in einer Zulassungsliste, verwenden wir einen dup
-Systemaufruf an /dev/null
, um zu verhindern, dass im Cache gespeicherte Dateideskriptoren versehentlich zum Zugriff auf neu geöffnete Dateien verwendet werden.
Wenn Sie Änderungen am Framework vornehmen, die das Laden von Ressourcen in den Zygote umfassen, und SELinux-Abweisungen oder IO-Fehler erhalten, gehen Sie so vor:
Geben Sie bei unbenannten Dateideskriptoren die Dateideskriptoren in den
fds_to_ignore
-Vektor ein, wennRestat
aufgerufen wird.Für benannte Dateideskriptoren:
WORKING_DIRECTORY/frameworks/base/core/jni/fd_utils.cpp
bearbeiten- Fügen Sie den Pfad zur Zulassungsliste für geöffnete Dateien hinzu.