58 votes

Comprendre Android: Zygote et DalvikVM

J'essaie de comprendre comment les applications Android lancent. La question est de savoir comment zygote bifurque exactement Dalvik VM. Je ne comprends pas vraiment pourquoi il n'est pas possible d'exécuter plusieurs applications dans la même machine virtuelle Dalvik.

162voto

Aswin Kumar Points 2423

Q. comment zygote exactement fourche Dalvik VM?

Réponse Courte: Zygote processus fondamentalement froid bottes une VM sur le démarrage du système. Une fois fait, il est à l'écoute pour une prise pour les commandes entrantes. D'autres processus (par exemple, ActivityManagerService) enregistre des commandes à cette prise, chaque fois qu'il a besoin d'un nouveau processus pour une application. Cette commande est lu par le Zygote processus et les appels fork() - si le processus de l'enfant devient un pré-chauffé jusqu'VM pour son exécution. C'est de cette façon zygote fourches le Dalvik VM.

Réponse longue: (cela pourrait être vraiment long) Après le noyau est chargé, init.rc est analysé et natif de services sont démarrés. Avec cela, l' /system/bin/app_process (code Source: frameworks/base/cmds/app_process/app_main.cpp) est exécuté. Ce qui a finalement appels AndroidRuntime.start() de la fonction (code Source: frameworks/base/core/jni/AndroidRuntime.cpp), en lui passant les paramètres com.android.internal.os.ZygoteInit et start-system-server.

L' AndroidRuntime.start() démarre la machine virtuelle Java, puis appelle ZygoteInit.main() (code Source: frameworks/base/core/java/com/android/internal/os/ZygoteInit.java), en lui passant le paramètre start-system-server.

ZygoteInit.main() inscrit tout d'abord le zygote socket (le zygote écoute pour une prise pour les commandes entrantes, et sur la réception de la commande nouveau, donne naissance à un nouveau processus de demande). La prochaine chose qui se passe est, il met beaucoup de classes (qui est répertorié dans les cadres/base/préchargé-classes, la dernière que j'ai vérifié, 2307 lignes, en android 4.0.4) et tous l'ensemble des ressources du système comme un drawable, xmls, etc. Ensuite, il appelle startSystemServer() qui fourches d'un nouveau processus pour l' com.android.server.SystemServer (code Source: frameworks/base/services/java/com/android/server/SystemServer.java). Bifurcation de serveur de système est un cas spécial, parce que dans tous les autres cas, le zygote processus d'écoute à une prise secteur et fourches pour de nouvelles commandes, comme nous le verrons bientôt.

Après SystemServer est fourchue, une fonction runSelectLoopMode() est appelé. C'est un while(true) boucle qui, fondamentalement, établit un ZygoteConnection avec le zygote prise et attend les commandes sur elle. Quand une commande est reçue, ZygoteConnection.runOnce() est appelé (code Source: frameworks/base/core/java/com/android/internal/os/ZygoteConnection.java)

ZygoteConnection.runOnce() des appels Zygote.forkAndSpecialize() (code Source: libcore/dalvik/src/main/java/dalvik/system/Zygote.java) qui appelle tout simplement un natvie fonction de faire de la fourche. Ainsi, comme dans le cas de SystemServer, un processus enfant est créé qui a un pré-chauffé jusqu'Dalvik pour lui-même.

Q. pourquoi il n'est pas possible d'exécuter plusieurs applications en même Dalvik VM?

C'est une décision de conception autant que je sache. Android les gars juste décidé de fourche d'une nouvelle VM par processus, pour la sécurité via le bac à sable.

34voto

Paul Points 2500

Pas de. Dalvik n'a pas de durée de processus.

Cependant, le Liant mécanisme IPC peut faire un très convaincante travail de faire apparaître les objets de migrer vers un autre processus et de ses Dalvik instance. Aussi, la gestion de la mémoire est très bonne sur le partage en lecture seule des pages à travers tous les processus qui en ont besoin. Le Dalvik processus de l'hébergement d'une application classique est fourchue hors du zygote avec toutes les communes android bibliothèques déjà mappé, de sorte que de nouvelles copies uniques n'ont pas à être ouvert.

Source: Faire des applications en utilisant plusieurs processus partagent un Dalvik exemple?

Également consulter ces liens:

http://davidehringer.com/software/android/The_Dalvik_Virtual_Machine.pdf

http://commonsware.com/blog/Articles/what-is-dalvik.html

6voto

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X