Informacje o procesach Zygote

Zygote to proces w systemie operacyjnym Androida, który pełni funkcję głównego procesu wszystkich procesów systemu i aplikacji z tym samym interfejsem binarnym aplikacji (ABI).

Na nowoczesnych urządzeniach, takich jak Pixel 7 i nowsze, jest 64-bitowy proces Zygote. Dodatkowo w przypadku głównego ABI jest WebView Zygote, czyli wyspecjalizowany proces Zygote, który zawiera biblioteki i zasoby przeznaczone do procesów uruchamiających WebView.

Zygote wykonuje między innymi te zadania:

  1. Demon init tworzy proces Zygote, gdy system operacyjny Android jest inicjowany. W niektórych systemach z podwójną architekturą uruchamiane są 2 procesy Zygote (64- i 32-bitowy). Ta strona dotyczy tylko systemów o pojedynczej architekturze.

  2. Zygote może natychmiast utworzyć procesy o nazwie niespecjalistyczne procesy aplikacji (USAP) lub zaczekać, aż procesy zostaną utworzone zgodnie z potrzebami aplikacji. Pierwsza opcja musi być włączona za pomocą właściwości systemowej lub polecenia Android Debug Bridge. Więcej informacji o konfigurowaniu procesu Zygote w celu natychmiastowego tworzenia procesów znajdziesz w artykule Włączanie puli procesów niespecjalistycznych aplikacji .

    • Jeśli na urządzeniu włączony jest wspólny rdzeń USAP:

      1. Serwer systemowy używa gniazda domeny Unix, aby połączyć się z dostępnym interfejsem użytkownika USAP z puli. Serwer systemowy prosi o to, aby USAP był wstępnie skonfigurowany do użycia w aplikacji przez zmianę identyfikatora procesu (PID), grupy procesów i innych informacji.
      2. Po zakończeniu wstępnej konfiguracji USAP wysyła do serwera systemowego odpowiedź z identyfikatorem PID.
      3. Gdy aplikacja zajmuje jedno z tych USAP, nie jest już częścią puli. Gdy w puli jest 1 lub mniej USAP, Zygote uzupełnia pulę o nowe USAP.
    • Jeśli Zygote pojawia się w przetwarzaniu przy użyciu leniwej oceny:

      1. Serwer systemowy otrzymuje polecenie, że aplikacja potrzebuje procesu.
      2. Serwer systemowy używa gniazda domeny Unix, aby wysłać polecenie do odpowiedniego procesu Zygote.
      3. Zygote tworzy proces i zmienia PID, cgroup oraz inne informacje.
      4. Po zakończeniu procesu PID jest wysyłany z powrotem do Zygote, które przekazuje go serwerowi systemowemu.

Włączanie puli USAP

Aby włączyć korzystanie z puli USAP, wykonaj jedną z tych czynności:

  • Ustaw właściwość systemową dalvik.vm.usap_pool_enabled na true w narzędziu /build/make/target/product/runtime_libart.mk.

  • Uruchom to polecenie:

    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
    

Gdy ta funkcja jest włączona, każdy proces Zygote zarządza pulą procesów, które wykonują niezależne od aplikacji części procesu uruchamiania aplikacji.

Rozwiązywanie problemów z Zygote

Ta sekcja zawiera rozwiązania problemów związanych z Zygote.

Zygote ulega awarii

Jeśli urządzenie nie uruchamia się prawidłowo, a dzienniki lub raporty o awariach zawierają problemy z Zygote, prawdopodobnie niedawno wprowadzona zmiana spowodowała zainicjowane działanie lub awarię serwera systemowego. Naprawienie kodu powinno rozwiązać problem.

Odmowy SELinux lub błędy we/wy

Zygote jest szczególnie rygorystyczne w zakresie higieny dotyczącej deskryptorów plików w ramach granic procesów. Gdy w momencie rozgałęzienia są obecne opisy plików, ale nie ma ich na liście dozwolonych, używamy wywołania systemu dup, aby /dev/null, uniemożliwić przypadkowe użycie opisów plików z bufora podręcznego do uzyskiwania dostępu do nowo otwartych plików.

Jeśli wprowadzasz zmiany w ramach, które obejmują próbę załadowania zasobów do Zygote, a w efekcie otrzymujesz odmowę SELinux lub błędy we/wy, wykonaj te czynności:

  • W przypadku bezimiennych deskryptorów plików uwzględnij je w wektorze fds_to_ignore podczas wywołania funkcji Restat.

  • W przypadku nazwanych deskryptorów plików:

    1. Edytuj WORKING_DIRECTORY/frameworks/base/core/jni/fd_utils.cpp.
    2. Dodaj ścieżkę do listy dozwolonych otwartych plików.