Die Zygote ist ein Prozess im Android-Betriebssystem, der als Stamm aller System- und App-Prozesse mit demselben Application Binary Interface (ABI) fungiert.
Auf modernen Geräten wie dem Pixel 7 und höher gibt es einen 64‑Bit-Zygote-Prozess. Außerdem gibt es die WebView-Zygote für die primäre ABI. Das ist eine spezielle Zygote, die Bibliotheken und Ressourcen enthält, die für Prozesse, in denen WebViews ausgeführt werden, spezifisch sind.
Das sind die Aufgaben, die Zygote ausführt:
Der Init-Daemon startet den Zygote-Prozess, wenn das Android-Betriebssystem initialisiert wird. Auf einigen Systemen mit dualer Architektur werden zwei Zygote-Prozesse (ein 64-Bit- und ein 32-Bit-Prozess) gestartet. Auf dieser Seite werden nur Systeme mit einer einzelnen Architektur behandelt.
Der Zygote-Prozess kann sofort Prozesse namens unspezialisierte App-Prozesse (USAP) starten oder warten, bis Prozesse von Anwendungen benötigt werden. Die erste Option muss über eine Systemeigenschaft oder einen Android Debug Bridge-Befehl aktiviert werden. Weitere Informationen zum Konfigurieren von 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 das USAP für die Anwendungsnutzung vorkonfiguriert wird, indem die Prozess-ID (PID), die Cgroup und andere Informationen geändert werden.
- Wenn die USAP die Vorkonfiguration 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 einen oder keinen USAP enthält, füllt die Zygote den Pool mit neuen USAPs auf.
Wenn Ihr Zygote Prozesse mit Lazy Evaluation startet:
- Der Systemserver empfängt einen 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-Prozess wird verzweigt und die PID, die Cgroup und andere Informationen werden geändert.
- Nach Abschluss des Vorgangs wird die PID an den Zygote-Prozess zurückgesendet, der sie dann an den Systemserver weiterleitet.
USAP-Pool aktivieren
Führen Sie einen der folgenden Schritte aus, um die Verwendung des USAP-Pools zu aktivieren:
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 dieses Feature aktiviert ist, verwaltet jede Zygote einen Pool mit verzweigten 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-Prozess stürzt ab
Wenn Ihr Gerät nicht richtig neu startet und Ihre Logs oder Absturzberichte Probleme mit dem Zygote-Prozess aufweisen, liegt das wahrscheinlich daran, dass Sie kürzlich eine Änderung vorgenommen haben, die zum Absturz von initd oder des Systemservers führt. Wenn Sie Ihren Code korrigieren, sollte das Problem behoben werden.
SELinux-Verweigerungen oder E/A-Fehler
Der Zygote-Prozess ist besonders auf die Hygiene von Dateideskriptoren über Prozessgrenzen hinweg bedacht. Wenn bei der Fork-Ausführung Dateideskriptoren vorhanden sind, die nicht auf einer Zulassungsliste stehen, verwenden wir einen dup
-Systemaufruf zum /dev/null
, um zu verhindern, dass zwischengespeicherte Dateideskriptoren unbeabsichtigt für den Zugriff auf neu geöffnete Dateien verwendet werden.
Wenn Sie Framework-Änderungen vornehmen, bei denen versucht wird, Ressourcen in die Zygote zu laden, und Sie SELinux-Verweigerungen oder E/A-Fehler erhalten:
Bei unbenannten Dateideskriptoren müssen Sie die Dateideskriptoren in den
fds_to_ignore
-Vektor aufnehmen, 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.