Zygote è un processo nel sistema operativo Android che funge da radice di tutti i processi di sistema e delle app con la stessa interfaccia binaria dell'applicazione (ABI).
Sui dispositivi moderni, come Pixel 7 e modelli successivi, è presente un processo Zygote a 64 bit. Inoltre, esiste WebView Zygote per l'ABI principale, che è un Zygote specializzato che contiene librerie e risorse specifiche per i processi che eseguono WebView.
Ecco le attività eseguite da Zygote:
Il daemon init genera il processo Zygote quando viene inizializzato il sistema operativo Android. In alcuni sistemi a doppia architettura vengono generati due processi Zygote (a 64 bit e 32 bit). Questa pagina riguarda solo i sistemi con una singola architettura.
Zygote può generare immediatamente processi chiamati processi di app non specializzati (USAP) o attendere di generare processi in base alle esigenze delle applicazioni. La prima opzione deve essere attivata tramite una proprietà di sistema o un comando Android Debug Bridge. Per saperne di più sulla configurazione di Zygote per generare processi immediatamente, vedi Attivare il pool di processi delle app non specializzati .
Se il pool USAP è attivato sul tuo dispositivo:
- Il server di sistema utilizza un socket di dominio Unix per connettersi a un USAP disponibile da un pool. Il server di sistema richiede che USAP sia preconfigurato per l'utilizzo dell'applicazione modificando l'ID (PID), il cgroup e altre informazioni del processo.
- Al termine della preconfigurazione, l'USAP risponde al server di sistema con il PID.
- Quando un'applicazione occupa una di queste USAP, la USAP non fa più parte del pool. Quando il pool raggiunge uno o meno USAP, Zygote lo riempie con nuovi USAP.
Se Zygote genera processi utilizzando la valutazione pigra:
- Il server di sistema riceve un comando che indica che un'app ha bisogno di un processo.
- Il server di sistema utilizza un socket di dominio Unix per inviare un comando allo Zygote appropriato.
- Zygote esegue il fork del processo e modifica PID, cgroup e altre informazioni.
- Al termine della procedura, invia il PID a Zygote, che a sua volta lo passa al server di sistema.
Attiva il pool USAP
Per attivare l'utilizzo del pool USAP, esegui una delle seguenti operazioni:
Imposta la proprietà di sistema
dalvik.vm.usap_pool_enabled
sutrue
in/build/make/target/product/runtime_libart.mk
.Esegui questo comando:
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
Quando questa funzionalità è abilitata, ogni Zygote mantiene un pool di processi forkati che eseguono le parti indipendenti dall'applicazione del processo di avvio dell'applicazione.
Risolvere i problemi di Zygote
Questa sezione contiene soluzioni ai problemi relativi a Zygote.
Zygote si arresta in modo anomalo
Se il dispositivo non si riavvia correttamente e i log o i report sugli arresti anomali mostrano problemi con Zygote, è probabile che tu abbia apportato una modifica recente che causa l'arresto anomalo di initd o del server di sistema. La correzione del codice dovrebbe risolvere il problema.
SELinux denials o errori di I/O
Zygote è molto attento all'igiene dei descrittori di file tra i limiti dei processi. Quando i descrittori di file sono presenti al momento del fork, ma non in una
consente, utilizziamo una chiamata di sistema dup
a /dev/null
per impedire che i descrittori di file memorizzati nella cache vengano utilizzati involontariamente per accedere a file appena aperti.
Se stai apportando modifiche al framework che includono il tentativo di caricare risorse in Zygote e ricevi errori SELinux o errori I/O:
Per i descrittori di file senza nome, includili nel vettore
fds_to_ignore
quando viene chiamatoRestat
.Per i descrittori di file denominati:
- Modifica
WORKING_DIRECTORY/frameworks/base/core/jni/fd_utils.cpp
. - Aggiungi il percorso alla lista consentita per i file aperti.
- Modifica