Procesy Zygote

Zygota to proces w systemie operacyjnym Android, który jest korzeniem wszystkich procesów systemowych i procesów aplikacji z tym samym interfejsem binarnym aplikacji (ABI).

Na nowoczesnych urządzeniach, takich jak Pixel 7 i nowsze, działa 64-bitowy proces Zygote. Oprócz tego istnieje WebView Zygote dla głównego interfejsu ABI, który jest wyspecjalizowanym procesem Zygote zawierającym biblioteki i zasoby specyficzne dla procesów uruchamiających komponenty WebView.

Zygota wykonuje te zadania:

  1. Demon init uruchamia proces Zygote po zainicjowaniu systemu operacyjnego Android. W niektórych systemach o podwójnej architekturze uruchamiane są 2 procesy Zygote (64-bitowy i 32-bitowy). Ta strona dotyczy tylko systemów o jednej architekturze.

  2. Proces Zygote może od razu tworzyć procesy zwane niespecjalistycznymi procesami aplikacji (USAP) lub czekać na utworzenie procesów w miarę potrzeb aplikacji. Pierwszą opcję należy włączyć za pomocą właściwości systemu lub polecenia Android Debug Bridge. Więcej informacji o konfigurowaniu procesu Zygote do natychmiastowego tworzenia procesów znajdziesz w artykule Włączanie puli niespecjalizowanych procesów aplikacji .

    • Jeśli pula USAP jest włączona na urządzeniu:

      1. Serwer systemowy używa gniazda domeny Unix, aby połączyć się z dostępnym USAP z puli. Serwer systemowy żąda, aby USAP był wstępnie skonfigurowany do użycia przez aplikację, poprzez zmianę identyfikatora procesu (PID), grupy kontrolnej i innych informacji.
      2. Gdy USAP zakończy wstępną konfigurację, odpowiada serwerowi systemowemu za pomocą identyfikatora PID.
      3. Gdy aplikacja zajmuje jeden z tych USAP-ów, nie jest on już częścią puli. Gdy w puli zostanie co najmniej 1 USAP, proces Zygote uzupełni pulę nowymi USAP-ami.
    • Jeśli proces Zygote tworzy procesy za pomocą leniwej ewaluacji:

      1. Serwer systemowy otrzymuje polecenie, że aplikacja potrzebuje procesu.
      2. Serwer systemowy używa gniazda domeny Unix do wysyłania polecenia do odpowiedniego procesu Zygote.
      3. Proces Zygote rozwidla proces i zmienia PID, cgroup i inne informacje.
      4. Po zakończeniu procesu wysyła identyfikator PID z powrotem do procesu Zygote, który przekazuje go z powrotem do serwera systemowego.

Włącz pulę 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/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 utrzymuje pulę rozwidlonych procesów, które wykonują niezależne od aplikacji części procesu uruchamiania aplikacji.

Rozwiązywanie problemów z procesem Zygote

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

Proces Zygote ulega awarii

Jeśli urządzenie nie uruchamia się ponownie prawidłowo, a w dziennikach lub raportach o awariach widać problemy z procesem Zygote, prawdopodobnie wynika to z ostatniej zmiany, która powoduje awarię procesu initd lub serwera systemowego. Naprawienie kodu powinno rozwiązać problem.

Odmowy SELinux lub błędy wejścia/wyjścia

Proces Zygote jest bardzo wyczulony na kwestie związane z deskryptorami plików w różnych procesach. Jeśli deskryptory plików są obecne w momencie rozwidlenia, ale nie znajdują się na liście dozwolonych, używamy wywołania systemowego dup, aby zapobiec niezamierzonemu użyciu buforowanych deskryptorów plików do uzyskania dostępu do nowo otwartych plików./dev/null

Jeśli wprowadzasz zmiany w platformie, które obejmują próbę załadowania zasobów do procesu Zygote, i otrzymujesz odmowy SELinux lub błędy wejścia/wyjścia:

  • W przypadku nienazwanych deskryptorów plików uwzględnij je w wektorze fds_to_ignore, gdy wywoływana jest funkcja Restat.

  • W przypadku nazwanych deskryptorów plików:

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