Comprendre Androïde: Zygote et DalvikVM
j'essaie de comprendre comment Android lance des applications. La question Est de savoir comment (et pourquoi) la fourche Zygote est une nouvelle VM Dalvik? Je ne comprends pas pourquoi il n'est pas possible d'exécuter plusieurs applications en même Dalvik VM.
5 réponses
Pas de. Dalvik ne couvre pas les processus.
cependant, le mécanisme de la CIB de reliure peut faire un travail très convaincant de faire des objets semblent migrer à un processus différent et son instance Dalvik. En outre, la gestion de la mémoire est très bonne sur le partage des pages en lecture seule à travers tous les processus qui en ont besoin. Le processus Dalvik hébergeant une application typique est bifurqué de zygote avec toutes les bibliothèques android communes déjà cartographié, de sorte que les nouvelles copies uniques ne - être ouvert.
Source: Faire des applications en utilisant plusieurs processus partagent un Dalvik exemple?
vérifiez aussi ces liens:
http://davidehringer.com/software/android/The_Dalvik_Virtual_Machine.pdf
Q. Comment zygote bifurque-t-il exactement Dalvik VM?
Brève Réponse: Processus Zygote essentiellement bottes à froid une VM sur le démarrage du système. Une fois fait, il écoute une socket pour les commandes entrantes. D'autres processus (par exemple ActivityManagerService) écrivent des commandes à cette socket, chaque fois qu'elle a besoin d'un nouveau processus pour une application. Cette commande est lue par le processus Zygote et appelle fork () - donc le processus enfant maintenant obtient une VM préchauffée dans laquelle courir. Voici comment zygote bifurque la VM Dalvik.
longue réponse: (cela pourrait être vraiment long)
Après le chargement du noyau, init.rc
est analysé et les services natifs sont lancés. Avec cela, le /system/bin/app_process
(code Source: cadres/base/cmd/app_process/app_main.rpc ) est exécuté. Ceci appelle éventuellement la fonction AndroidRuntime.start()
(code Source: frameworks/base/core/jni / AndroidRuntime.cpp ), lui passant les paramètres com.android.internal.os.ZygoteInit
et start-system-server
.
le AndroidRuntime.start()
démarre la VM Java, puis appelle ZygoteInit.main()
(code Source: frameworks/base/core/java/com/android/internal/os/ZygoteInit.java ), lui passant le paramètre start-system-server
.
ZygoteInit.main()
enregistre d'abord la socket zygote (le processus zygote écoute une socket pour les commandes, et à la réception de la nouvelle commande, produit un nouveau processus comme demandé). La prochaine chose qui se produit est, il précharge un grand nombre de classes (qui est énuméré dans frameworks/base/précharged-classes , dernier j'ai vérifié, 2307 lignes, dans android 4.0.4) et toutes les ressources à l'échelle du système comme drawables, xmls, etc. Puis il appelle startSystemServer()
qui bifurque un nouveau processus pour com.android.server.SystemServer
(code Source: frameworks/base/services/java/com/android/server/SystemServer.Java ). La bifurcation du serveur système est un cas particulier, car dans tous les autres cas, le processus zygote écoute une socket et des bifurcations pour les nouvelles commandes, comme nous le verrons bientôt.
après que SystemServer est bifurqué, une fonction runSelectLoopMode()
est appelée. Il s'agit d'une boucle while(true)
qui établit essentiellement une boucle ZygoteConnection
avec la socket zygote et attend les commandes dessus. Lorsqu'une commande est reçue, ZygoteConnection.runOnce()
est appelé (code Source: cadres/base/core/java/com/android/interne/os/ZygoteConnection.java )
ZygoteConnection.runOnce()
appels Zygote.forkAndSpecialize()
(code Source: libcore/dalvik/src/main/java/dalvik/système/Zygote.java ) qui appelle simplement une fonction natvie pour faire la fourchette. Ainsi, comme dans le cas de SystemServer, un processus enfant est créé qui a un Dalvik préchauffé pour lui-même.
Q. pourquoi il n'est pas possible d'exécuter applications multiples dans le même Dalvik VM?
pour autant que je sache, il s'agit d'une décision de conception. Android guys vient de décider de bifurquer une nouvelle VM par processus, pour la sécurité via sandboxing.
Zygote est également utilisé pour partager les drawables système avec toutes les applications. Cela permet au système de charger les images pour les boutons qu'une seule fois pour instance.
juste pour ajouter un point de plus aux réponses ci-dessus quand zygote fait une bifurcation à la réception d'une commande il utilise technique de copie-sur-écriture . La mémoire n'est copiée que lorsque le nouveau processus essaie de la modifier.
aussi les bibliothèques que zygote charge au démarrage sont lire seulement et ne peut pas être modifié. Ils sont donc non copiés mais partagés avec de nouveaux processus fourchés.
tout cela conduit à démarrage rapide et moins d'empreinte mémoire .
Zygote n'est pas vraiment lié à Dalvik, c'est juste un processus init. Zygote est la méthode utilisée par Android pour démarrer des applications. Plutôt que d'avoir à commencer chaque nouveau processus à partir de zéro, en chargeant le système entier et le cadre Android à nouveau chaque fois que vous voulez lancer une application, il fait ce processus une fois, puis s'arrête à ce point, avant que Zygote a fait quelque chose de spécifique app. Puis, quand vous voulez lancer une application, le processus Zygote fourche, et le processus enfant continue où il a laissé off, chargement de l'application elle-même dans la VM.