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:
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.
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:
- 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.
- Po zakończeniu wstępnej konfiguracji USAP wysyła do serwera systemowego odpowiedź z identyfikatorem PID.
- 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:
- Serwer systemowy otrzymuje polecenie, że aplikacja potrzebuje procesu.
- Serwer systemowy używa gniazda domeny Unix, aby wysłać polecenie do odpowiedniego procesu Zygote.
- Zygote tworzy proces i zmienia PID, cgroup oraz inne informacje.
- 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
natrue
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 funkcjiRestat
.W przypadku nazwanych deskryptorów plików:
- Edytuj
WORKING_DIRECTORY/frameworks/base/core/jni/fd_utils.cpp
. - Dodaj ścieżkę do listy dozwolonych otwartych plików.
- Edytuj