Informazioni sui processi Zygote

Zygote è un processo nel sistema operativo Android che funge da radice di tutti i processi di sistema e delle app con la stessa ABI (Application Binary Interface).

Sui dispositivi moderni, come Pixel 7 e modelli successivi, è presente un processo Zygote a 64 bit. Inoltre, c'è WebView Zygote per l'ABI principale, ovvero una Zygote specializzata che contiene librerie e risorse specifiche per i processi che eseguono WebView.

Di seguito sono riportate le attività eseguite da Zygote:

  1. Il daemon di inizializzazione genera il processo Zygote quando il sistema operativo Android viene inizializzato. In alcuni sistemi con architettura duale vengono generati due processi Zygote (uno a 64 e uno a 32 bit). Questa pagina riguarda solo sistemi con un'unica architettura.

  2. Lo Zygote può generare immediatamente processi chiamati processi delle app non specializzate (USAP) o attendere che vengano generati processi secondo le necessità delle applicazioni. La prima opzione deve essere attivata tramite una proprietà di sistema o un comando Android Debug Bridge. Per maggiori informazioni sulla configurazione di Zygote per generare immediatamente i processi, consulta Abilitare il pool di processi dell'app non specializzati .

    • Se il pool USAP è attivo sul tuo dispositivo:

      1. 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 l'USAP sia preconfigurato per l'utilizzo dell'applicazione modificando l'ID (PID), il cgroup e altre informazioni del processo.
      2. Al termine della preconfigurazione, l'USAP risponde al server di sistema con il PID.
      3. Quando un'applicazione occupa uno di questi USAP, quest'ultimo non fa più parte del pool. Quando il pool raggiunge uno o meno USAP, Zygote lo reintegra con nuovi USAP.
    • Se Zygote genera processi utilizzando la valutazione lazy:

      1. Il server di sistema riceve un comando che indica che un'app ha bisogno di un processo.
      2. Il server di sistema utilizza una socket di dominio Unix per inviare un comando a Zygote appropriato.
      3. Zygote esegue il fork del processo e modifica il PID, il cgroup e altre informazioni.
      4. Una volta completato, il PID viene inviato a Zygote, che quindi lo ritrasmette 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 su true in /build/make/target/product/runtime_libart.mk.

  • Esegui il seguente 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à è attivata, ogni Zygote gestisce 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.

Rifiuti SELinux o errori I/O

Zygote è molto esigente in termini di igiene dei descrittori file nei confini dei processi. Quando i descrittori dei file sono presenti al momento del fork, ma non in una lista consentita, utilizziamo una chiamata di sistema dup a /dev/null per impedire che i descrittori dei file memorizzati nella cache vengano utilizzati involontariamente per accedere ai file appena aperti.

Se apporti modifiche al framework che includono il tentativo di caricare risorse in Zygote e ricevi rifiuti SELinux o errori di I/O:

  • Per i descrittori di file senza nome, includili nel vettore fds_to_ignore quando viene chiamato Restat.

  • Per i descrittori file denominati:

    1. Modifica WORKING_DIRECTORY/frameworks/base/core/jni/fd_utils.cpp.
    2. Aggiungi il percorso alla lista consentita per i file aperti.