À propos des processus Zygote

Zygote est un processus du système d'exploitation Android qui sert de racine à tous les processus système et d'application avec la même interface binaire d'application (ABI).

Sur les appareils modernes, tels que le Pixel 7 et les modèles ultérieurs, un processus Zygote 64 bits est disponible. En outre, il existe le WebView Zygote pour l'ABI principale, qui est un Zygote spécialisé qui contient des bibliothèques et des ressources spécifiques aux processus qui exécutent des WebViews.

Voici les tâches effectuées par le zygote:

  1. Le daemon init génère le processus Zygote lorsque l'OS Android est initialisé. Sur certains systèmes à architecture double, deux processus Zygote (64 bits et 32 bits) sont générés. Cette page ne concerne que les systèmes à architecture unique.

  2. Le Zygote peut immédiatement générer des processus appelés processus d'application non spécialisés (USAP) ou attendre de générer des processus selon les besoins des applications. La première option doit être activée via une propriété système ou une commande Android Debug Bridge. Pour en savoir plus sur la configuration de Zygote pour générer des processus immédiatement, consultez la section Activer le pool de processus d'application non spécialisés.

    • Si le pool USAP est activé sur votre appareil:

      1. Le serveur système utilise un socket de domaine Unix pour se connecter à un USAP disponible à partir d'un pool. Le serveur système demande que l'USAP soit préconfiguré pour l'utilisation de l'application en modifiant l'ID (PID) du processus, le cgroup et d'autres informations.
      2. Une fois la préconfiguration de l'USAP terminée, il répond au serveur système avec le PID.
      3. Lorsqu'une application occupe l'un de ces USAP, il ne fait plus partie du pool. Lorsque le pool ne contient qu'un seul USAP ou moins, le zygote le réapprovisionne avec de nouveaux USAP.
    • Si votre Zygote génère des processus à l'aide de l'évaluation paresseuse :

      1. Le serveur système reçoit une commande indiquant qu'une application a besoin d'un processus.
      2. Le serveur système utilise un socket de domaine Unix pour envoyer une commande au Zygote approprié.
      3. Zygote crée une fourchette du processus et modifie le PID, le cgroup et d'autres informations.
      4. Une fois le processus terminé, il renvoie le PID au Zygote, qui le transmet ensuite au serveur système.

Activer le pool USAP

Pour activer l'utilisation du pool USAP, procédez comme suit:

  • Définissez la propriété système dalvik.vm.usap_pool_enabled sur true dans /build/make/target/product/runtime_libart.mk.

  • Exécutez la commande suivante :

    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
    

Lorsque cette fonctionnalité est activée, chaque Zygote gère un pool de processus dérivés qui exécutent les parties indépendantes de l'application du processus de démarrage de l'application.

Résoudre les problèmes Zygote

Cette section contient des solutions aux problèmes liés à Zygote.

Le Zygote plante

Si votre appareil ne redémarre pas correctement et que vos journaux ou rapports d'erreur indiquent des problèmes avec Zygote, cela est probablement dû à une modification récente qui provoque le plantage de l'initd ou du serveur système. La correction de votre code devrait résoudre le problème.

Refus SELinux ou échecs d'E/S

Le Zygote est particulièrement attentif à l'hygiène des descripteurs de fichiers au-delà des limites de processus. Lorsque des descripteurs de fichier sont présents au moment de la duplication, mais pas dans une liste d'autorisation, nous utilisons un appel système dup vers /dev/null pour empêcher que les descripteurs de fichier mis en cache soient utilisés involontairement pour accéder aux fichiers nouvellement ouverts.

Si vous apportez des modifications au framework qui incluent l'essai de chargement de ressources dans Zygote et que vous recevez des refus SELinux ou des échecs d'E/S :

  • Pour les descripteurs de fichier sans nom, incluez-les dans le vecteur fds_to_ignore lorsque Restat est appelé.

  • Pour les descripteurs de fichiers nommés:

    1. Modifier WORKING_DIRECTORY/frameworks/base/core/jni/fd_utils.cpp.
    2. Ajoutez le chemin d'accès à la liste d'autorisation pour les fichiers ouverts.