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 решили использовать новую виртуальную машину для каждого процесса в целях безопасности с помощью песочницы.