J'essaie de comprendre comment Android lance les applications. La question est de savoir comment (et pourquoi) le Zygote crée-t-il une nouvelle machine virtuelle Dalvik? Je ne comprends pas pourquoi il n'est pas possible d'exécuter plusieurs applications dans la même machine virtuelle Dalvik.
Non. Dalvik ne couvre pas les processus.
Cependant, le mécanisme Binder IPC peut faire un travail très convaincant pour que les objets semblent migrer vers un autre processus et son instance Dalvik. De plus, la gestion de la mémoire est très bonne pour partager des pages en lecture seule sur tous les processus qui en ont besoin. Le processus Dalvik hébergeant une application typique est dérivé de zygote avec toutes les bibliothèques Android Android déjà mappées, de sorte qu'il n'est pas nécessaire d'ouvrir de nouvelles copies uniques.
Source: Les applications utilisant plusieurs processus partagent-elles une instance Dalvik?
Vérifiez également ces liens:
http://davidehringer.com/software/Android/The_Dalvik_Virtual_Machine.pdf
Comment zygote fourche-t-il exactement Dalvik VM?
Réponse courte: Le processus Zygote démarre à froid a Java VM au démarrage du système) Il écoute ensuite un socket pour les commandes entrantes. D'autres processus (par exemple ActivityManagerService) écrivent des commandes dans ce socket chaque fois qu'un nouveau processus est nécessaire pour une application. Ces commandes sont lues par le processus Zygote qui appelle fork () si nécessaire. les processus obtiennent un VM préchauffé dans lequel s'exécuter. C'est ainsi que Zygote bifurque la VM Dalvik.
Réponse longue: Une fois le noyau chargé, init.rc
Est analysé et les services natifs sont démarrés. Ensuite /system/bin/app_process
) est exécuté. Cela appelle finalement AndroidRuntime.start()
, en lui passant les paramètres com.Android.internal.os.ZygoteInit
Et start-system-server
.
La AndroidRuntime.start()
démarre un Java VM puis appelle ZygoteInit.main()
, en lui passant le paramètre start-system-server
.
ZygoteInit.main()
enregistre le socket Zygote (que le processus Zygote écoute pour les commandes entrantes, et lors de la réception d'une nouvelle commande, engendre un nouveau processus comme demandé). Il précharge ensuite un grand nombre de classes (comme indiqué dans frameworks/base/preloaded-classes , plus de 4500 dans Android 8.0) et toutes les ressources à l'échelle du système comme les drawables , xmls, etc. Ensuite, il appelle startSystemServer()
qui bifurque un nouveau processus pour com.Android.server.SystemServer
. Cette fourchette est spéciale et ne se fait pas de la même manière que d'habitude fourches que le Zygote exécute au nom des processus demandeurs.
Une fois SystemServer bifurqué, la fonction runSelectLoopMode()
est appelée. Il s'agit d'une boucle while(true)
qui établit un ZygoteConnection
avec le socket Zygote et attend les commandes dessus. Lorsqu'une commande est reçue, ZygoteConnection.runOnce()
est appelée.
ZygoteConnection.runOnce()
appelle ensuite Zygote.forkAndSpecialize()
qui appelle ensuite une fonction native pour faire le fork réel. Ainsi, comme dans le cas de SystemServer, un processus enfant est créé qui hérite d'un Dalvik préchauffé VM pour lui-même.
Pourquoi il n'est pas possible d'exécuter plusieurs applications dans la même machine virtuelle Dalvik?
Pour autant que je sache, il s'agit d'une décision de conception. Les gars de Android ont juste décidé de créer un nouveau VM par processus pour la sécurité via le sandboxing).
Zygote est également utilisé pour partager les drawables du système avec toutes les applications. Cela permet au système de charger les bitmaps des boutons une seule fois par exemple.
Juste pour ajouter un point de plus aux réponses ci-dessus lorsque zygote fait un fork lors de la réception d'une commande qu'il utilise technique de copie sur écriture. La mémoire n'est copiée que lorsque le nouveau processus tente de la modifier.
Les bibliothèques principales que zygote charge au démarrage sont également lecture seule et ne peuvent pas être modifiées. Ils sont donc pas copiés mais partagés avec de nouveaux processus fourchus.
Tout cela a conduit à démarrage rapide et moins d'empreinte mémoire.
Zygote n'est pas vraiment lié à Dalvik, c'est juste un processus d'initialisation. Zygote est la méthode Android utilise pour démarrer les applications. Plutôt que d'avoir à démarrer chaque nouveau processus à partir de zéro, charger tout le système et le cadre Android Android à chaque fois vous voulez démarrer une application, elle exécute ce processus une fois, puis s'arrête à ce moment-là, avant que Zygote n'ait fait quoi que ce soit spécifique à l'application. Ensuite, lorsque vous souhaitez démarrer une application, le processus Zygote se déroule et le processus enfant continue il s'est arrêté, chargeant l'application elle-même dans la machine virtuelle.