Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

Источник: Имеют ли приложения, использующие несколько процессов, экземпляр Dalvik?

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

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

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

Ответ 2

В. Как зигота в точности разворачивается на Dalvik VM?

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

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

AndroidRuntime.start() запускает виртуальную ZygoteInit.main() 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 выполняет от имени запрашивающих процессов.

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

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

В. Почему нельзя запустить несколько приложений в одной и той же виртуальной машине Dalvik?

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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