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

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


person Aprel    schedule 05.02.2012    source источник


Ответы (5)


Нет. 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

person Paul    schedule 05.02.2012

В. Как именно zygote разветвляет Dalvik VM?

Краткий ответ. Процесс 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.

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

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

person Aswin Kumar    schedule 03.10.2012
comment
О вопросе. Почему невозможно запустить несколько приложений на одной виртуальной машине Dalvik? Разве это не происходит, когда вы запрашиваете запуск компонентов в одном процессе с android:process=‹shared› Также это можно сделать с помощью android:sharedUserId=‹id› - person Igor Čordaš; 16.06.2015
comment
AndroidRuntime.start() запускает виртуальную машину Java, разве вы не имели в виду Dalvik VM? - person PcAF; 05.03.2017

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

person Basimalla Sebastin    schedule 04.04.2012
comment
Это работает в обе стороны: Zygote загружает версию OpenSSL более низкого уровня. Приложение, которое ожидает загрузить свою версию OpenSSL, часто застревает на версии более низкого уровня, потому что Zygote уже загрузил ее до форка. Сюда входят версии OpenSSL с поддержкой FIPS, в которых приложение пытается использовать проверенную криптографию. - person jww; 27.05.2015

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

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

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

person Aniket Thakur    schedule 11.01.2016

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

person M_ Fa    schedule 12.06.2015