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 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:

  1. 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.

  2. 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:

      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 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 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:

      1. Il server di sistema riceve un comando che indica che un'app ha bisogno di un processo.
      2. Il server di sistema utilizza un socket di dominio Unix per inviare un comando allo Zygote appropriato.
      3. Zygote esegue il fork del processo e modifica PID, cgroup e altre informazioni.
      4. 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 su true 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 chiamato Restat.

  • Per i descrittori di file denominati:

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