Zygote-Prozesse

Die Zygote ist ein Prozess im Android-Betriebssystem, der als Root aller System- und App-Prozesse mit derselben Application Binary Interface (ABI) fungiert.

Auf modernen Geräten wie dem Pixel 7 und neueren Geräten 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 spezifisch sind, die WebViews ausführen.

Die Zygote führt folgende Aufgaben aus:

  1. Der Init-Daemon startet den Zygote-Prozess, wenn das Android-Betriebssystem initialisiert wird. Auf einigen Systemen mit Dualarchitektur werden zwei Zygote-Prozesse gestartet (ein 64-Bit- und ein 32-Bit-Prozess). Auf dieser Seite werden nur Systeme mit Einzelarchitektur behandelt.

  2. Die Zygote kann sofort Prozesse starten, die als unspezifische App-Prozesse (Unspecialized App Processes, USAP) bezeichnet werden, oder warten, bis Prozesse nach Bedarf von Anwendungen gestartet werden. Die erste Option muss über eine Systemeigenschaft oder einen Android Debug Bridge-Befehl aktiviert werden. Weitere Informationen zum Konfigurieren der Zygote, um Prozesse sofort zu starten, finden Sie unter Pool für unspezifische App-Prozesse aktivieren .

    • Wenn der USAP-Pool auf Ihrem Gerät aktiviert ist:

      1. Der Systemserver verwendet einen Unix-Domain-Socket, um eine Verbindung zu einem verfügbaren USAP aus einem Pool herzustellen. Der Systemserver fordert an, dass der USAP für die Anwendungsnutzung vorkonfiguriert wird, indem die Prozess-ID (PID), die Cgroup und andere Informationen geändert werden.
      2. Wenn die Vorkonfiguration des USAP abgeschlossen ist, antwortet er dem Systemserver mit der PID.
      3. Wenn eine Anwendung einen dieser USAPs belegt, ist der USAP nicht mehr Teil des Pools. Wenn der Pool einen oder weniger USAPs enthält, füllt die Zygote den Pool mit neuen USAPs auf.
    • Wenn Ihre Zygote Prozesse mithilfe der verzögerten Auswertung startet:

      1. Der Systemserver erhält einen Befehl, dass eine App einen Prozess benötigt.
      2. Der Systemserver verwendet einen Unix-Domain-Socket, um einen Befehl an die entsprechende Zygote zu senden.
      3. Die Zygote verzweigt den Prozess und ändert die PID, die Cgroup und andere Informationen.
      4. Wenn der Prozess abgeschlossen ist, sendet er die PID zurück an die Zygote, die 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:

  • Setzen Sie die Systemeigenschaft dalvik.vm.usap_pool_enabled in /build/make/target/product/runtime_libart.mk auf true.

  • Führen Sie dazu diesen 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 jede Zygote einen Pool verzweigter Prozesse, die die anwendungsunabhängigen Teile des Anwendungsstartprozesses ausführen.

Probleme mit der Zygote beheben

In diesem Abschnitt finden Sie Lösungen für Probleme im Zusammenhang mit der Zygote.

Die Zygote stürzt ab

Wenn Ihr Gerät nicht ordnungsgemäß neu gestartet wird und in Ihren Logs oder Absturzberichten Probleme mit der Zygote auftreten, 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 sein.

SELinux-Verweigerungen oder E/A-Fehler

Die Zygote ist besonders streng in Bezug auf die Hygiene von Dateideskriptoren über Prozessgrenzen hinweg. Wenn Dateideskriptoren zur Verzweigungszeit vorhanden sind, aber nicht in einer Zulassungsliste enthalten sind, verwenden wir einen dup-Systemaufruf an /dev/null, um zu verhindern, dass zwischengespeicherte Dateideskriptoren unbeabsichtigt verwendet werden, um auf neu geöffnete Dateien zuzugreifen.

Wenn Sie Framework-Änderungen vornehmen, bei denen Sie versuchen, Ressourcen in die Zygote zu laden, und Sie SELinux-Verweigerungen oder E/A-Fehler erhalten, gehen Sie so vor:

  • Fügen Sie bei unbenannten Dateideskriptoren die Dateideskriptoren in den Vektor fds_to_ignore ein, wenn Restat aufgerufen wird.

  • Bei benannten Dateideskriptoren:

    1. Bearbeiten Sie WORKING_DIRECTORY/frameworks/base/core/jni/fd_utils.cpp.
    2. Fügen Sie den Pfad zur Zulassungsliste für geöffnete Dateien hinzu.