Я пытаюсь понять, как Android запускает приложения. Вопрос в том, как (и почему) Zygote создает новую виртуальную машину Dalvik? Я не понимаю, почему невозможно запустить несколько приложений на одной виртуальной машине Dalvik.
Понимание Android: Zygote и DalvikVM
Ответы (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
В. Как именно 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 только что решили разветвить новую виртуальную машину для каждого процесса в целях безопасности через песочницу.
Dalvik VM
?
- person PcAF; 05.03.2017
Zygote также используется для совместного использования системных рисунков со всеми приложениями. Это позволяет системе загружать растровые изображения для кнопок, например, только один раз.
Просто чтобы добавить еще один пункт к ответам выше, когда zygote делает ответвление при получении команды, он использует технику копирования при записи. Память копируется только тогда, когда новый процесс пытается ее изменить.
Кроме того, основные библиотеки, которые zygote загружает при запуске, только для чтения и не могут быть изменены. Таким образом, они не копируются, а передаются новым разветвленным процессам.
Все это привело к быстрому запуску и меньшему объему памяти.
Zygote на самом деле не связан с Dalvik, это просто процесс инициализации. Zygote — это метод, который Android использует для запуска приложений. Вместо того, чтобы запускать каждый новый процесс с нуля, заново загружая всю систему и инфраструктуру Android каждый раз, когда вы хотите запустить приложение, он выполняет этот процесс один раз, а затем останавливается на этом этапе, прежде чем Zygote сделает что-либо конкретное для приложения. . Затем, когда вы хотите запустить приложение, процесс Zygote разветвляется, и дочерний процесс продолжает работу с того места, где остановился, загружая само приложение в виртуальную машину.