Понимание Android: Zygote и DalvikVM - PullRequest
       10

Понимание Android: Zygote и DalvikVM

43 голосов
/ 06 февраля 2012

Я пытаюсь понять, как Android запускает приложения. Вопрос в том, как (и почему) Zygote развивает новую виртуальную машину Dalvik? Я не понимаю, почему невозможно запустить несколько приложений в одной и той же виртуальной машине Dalvik.

Ответы [ 5 ]

131 голосов
/ 03 октября 2012

Q. как работает зигота именно на вилке Далвика В.М.?

Краткий ответ: Процесс Zygote загружает виртуальную машину Java при запуске системы. Затем он слушает сокет для входящих команд. Другие процессы (например, ActivityManagerService) записывают команды в этот сокет всякий раз, когда для приложения требуется новый процесс. Эти команды читаются процессом Zygote, который при необходимости вызывает fork (). Дочерние процессы получают предварительно прогретую виртуальную машину для запуска. Вот как Zygote разветвляется на Dalvik VM.

Длинный ответ: После загрузки ядра, init.rc анализируется и запускаются собственные службы. Затем запускается /system/bin/app_process). В конечном итоге это вызывает AndroidRuntime.start(), передавая ему параметры com.android.internal.os.ZygoteInit и start-system-server.

AndroidRuntime.start() запускает виртуальную машину Java, затем вызывает ZygoteInit.main(), передавая ей параметр start-system-server.

ZygoteInit.main() регистрирует сокет Zygote (который процесс Zygote прослушивает для входящих команд, а при получении новой команды запускает новый процесс в соответствии с запросом). Затем он предварительно загружает множество классов (как указано в frameworks / base / preloaded-classes , более 4500 в Android 8.0) и все общесистемные ресурсы, такие как drawables, xmls и т. Д. Затем он вызывает startSystemServer() который разветвляет новый процесс на com.android.server.SystemServer. Этот форк является специальным и не выполняется так же, как обычные форки, которые Zygote выполняет от имени запрашивающих процессов.

После разветвления SystemServer вызывается функция runSelectLoopMode(). Это цикл while(true), который устанавливает ZygoteConnection с сокетом Zygote и ожидает команды на нем. При получении команды вызывается ZygoteConnection.runOnce().

ZygoteConnection.runOnce() затем вызывает Zygote.forkAndSpecialize(), который затем вызывает собственную функцию для выполнения фактического форка. Таким образом, как и в случае с SystemServer, создается дочерний процесс, который наследует предварительно нагретую виртуальную машину Dalvik для себя.

Q. почему невозможно запустить несколько приложений в одном Далвик В.М.?

Насколько я знаю, это дизайнерское решение. Парни из Android решили использовать новую виртуальную машину для каждого процесса в целях безопасности с помощью песочницы.

31 голосов
/ 06 февраля 2012

Нет.Dalvik не охватывает процессы.

Тем не менее, механизм Binder IPC может очень убедительно заставить объекты, по-видимому, мигрировать в другой процесс и его экземпляр Dalvik.Кроме того, управление памятью очень хорошо для совместного использования страниц только для чтения между всеми процессами, которые в них нуждаются.Процесс Dalvik, в котором размещается типичное приложение, отделен от zygote со всеми общими библиотеками Android, которые уже сопоставлены, поэтому новые уникальные копии открывать не нужно.несколько процессов совместно используют экземпляр Dalvik?

Также проверьте эти ссылки:

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

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

6 голосов
/ 04 апреля 2012

Zygote также используется для обмена системными чертежами со всеми приложениями. Это позволяет системе загружать растровые изображения для кнопок только один раз для экземпляр.

4 голосов
/ 11 января 2016

Просто добавьте еще один пункт к ответам выше, когда zygote делает форк при получении команды, которая использует метод копирования при записи .Память копируется только тогда, когда новый процесс пытается ее изменить.

Кроме того, базовые библиотеки , которые загружаются zygote при запуске, только для чтения и не могут быть изменены.Таким образом, они не копируются, а совместно используются с новыми разветвленными процессами.

Все это привело к быстрому запуску и уменьшению объема памяти .

1 голос
/ 12 июня 2015

Zygote на самом деле не связан с Dalvik, это просто процесс инициализации. Zygote - это метод, используемый Android для запуска приложений. Вместо того, чтобы запускать каждый новый процесс с нуля, загружая всю систему и платформу Android заново каждый раз, когда вы хотите запустить приложение, он выполняет этот процесс один раз, а затем останавливается в этой точке, прежде чем Zygote сделает что-нибудь специфичное для приложения. , Затем, когда вы хотите запустить приложение, процесс Zygote разветвляется, и дочерний процесс продолжает работу с того места, на котором он остановился, и загружает само приложение в виртуальную машину.

...