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, il existe un processus Zygote 64 bits. Il existe également le zygote WebView pour l'ABI principal, qui est un zygote spécialisé contenant des bibliothèques et des ressources spécifiques aux processus qui exécutent des WebViews.
Voici les tâches effectuées par Zygote :
Le démon init génère le processus Zygote lorsque l'OS Android est initialisé. Sur certains systèmes à double architecture, deux processus Zygote (un 64 bits et un 32 bits) sont générés. Cette page ne concerne que les systèmes à architecture unique.
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 à l'aide d'une propriété système ou d'une commande Android Debug Bridge. Pour en savoir plus sur la configuration de Zygote afin de générer des processus immédiatement, consultez Activer le pool de processus d'application non spécialisés .
Si le pool USAP est activé sur votre appareil :
- 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), le cgroup et d'autres informations du processus.
- Une fois la préconfiguration terminée, l'USAP répond au serveur système avec le PID.
- Lorsqu'une application occupe l'une de ces USAP, celle-ci ne fait plus partie du pool. Lorsque le pool atteint un ou moins d'USAP, Zygote le réapprovisionne avec de nouveaux USAP.
Si votre Zygote génère des processus à l'aide de l'évaluation différée :
- Le serveur système reçoit une commande indiquant qu'une application a besoin d'un processus.
- Le serveur système utilise un socket de domaine Unix pour envoyer une commande au zygote approprié.
- Zygote duplique le processus et modifie le PID, le cgroup et d'autres informations.
- Une fois le processus terminé, il renvoie le PID à 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_enabledsurtruedans/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 liés à Zygote
Cette section contient des solutions aux problèmes liés à Zygote.
Zygote plante
Si votre appareil ne redémarre pas correctement et que vos journaux ou rapports d'erreur indiquent des problèmes avec Zygote, c'est probablement parce que vous avez récemment apporté une modification qui provoque le plantage d'initd ou du serveur système. Corriger 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 des processus. Lorsque des descripteurs de fichier sont présents au moment du fork, mais pas dans une liste d'autorisation, nous utilisons un appel système dup pour /dev/null afin d'empêcher l'utilisation involontaire de descripteurs de fichier mis en cache pour accéder à des fichiers nouvellement ouverts.
Si vous apportez des modifications au framework qui incluent l'essai de chargement de ressources dans le zygote et que vous recevez des refus SELinux ou des échecs d'E/S :
Pour les descripteurs de fichiers sans nom, incluez-les dans le vecteur
fds_to_ignorelorsqueRestatest appelé.Pour les descripteurs de fichiers nommés :
- Modifiez
WORKING_DIRECTORY/frameworks/base/core/jni/fd_utils.cpp. - Ajoutez le chemin d'accès à la liste d'autorisation pour les fichiers ouverts.
- Modifiez