Zygote – это процесс в ОС Android, который выступает в качестве корня всех системных процессов и процессов приложений с одинаковым двоичным интерфейсом приложения (ABI).
На современных устройствах, например Pixel 7 и более новых моделях, используется 64-разрядный процесс Zygote. Кроме того, для основного ABI существует WebView Zygote – специализированный процесс Zygote, содержащий библиотеки и ресурсы, необходимые для процессов, в которых выполняются WebView.
Zygote выполняет следующие задачи:
Демон init порождает процесс Zygote при инициализации ОС Android. В некоторых системах с двойной архитектурой запускаются два процесса Zygote (64-разрядный и 32-разрядный). В этой статье рассматриваются только системы с одной архитектурой.
Zygote может сразу порождать процессы, называемые неспециализированными процессами приложений (USAP), или ждать, пока приложениям не понадобятся процессы. Первый вариант можно включить с помощью системного свойства или команды Android Debug Bridge. Подробнее о том, как настроить Zygote для немедленного порождения процессов …
Если на вашем устройстве включен пул USAP:
- Системный сервер использует сокет домена Unix для подключения к доступному USAP из пула. Системный сервер запрашивает, чтобы USAP был предварительно настроен для использования приложением, изменив идентификатор процесса (PID), cgroup и другую информацию.
- После завершения предварительной настройки USAP отправляет системному серверу ответ с PID.
- Когда приложение занимает один из этих USAP, он больше не входит в пул. Когда в пуле остается один USAP или не остается ни одного, Zygote пополняет пул новыми USAP.
Если Zygote создает процессы с помощью отложенного вычисления:
- Системный сервер получает команду о том, что приложению требуется процесс.
- Системный сервер использует сокет домена Unix, чтобы отправить команду соответствующему процессу Zygote.
- Zygote создает копию процесса и меняет PID, cgroup и другую информацию.
- После завершения процесса он отправляет PID обратно в Zygote, который затем передает его системному серверу.
Как включить пул USAP
Чтобы включить использование пула USAP, выполните одно из следующих действий:
Задайте для системного свойства
dalvik.vm.usap_pool_enabledзначениеtrueв/build/make/target/product/runtime_libart.mk.Выполните следующую команду:
adb shell am broadcast -a \"com.google.android.gms.phenotype.FLAG_OVERRIDE\" --es package \"com.google.android.platform.runtime_native\" --es user \"\*\" --esa flags \"usap_pool_enabled\" --esa values \"true\" --esa types \"string\" com.google.android.gms
Если эта функция включена, каждый процесс Zygote поддерживает пул дочерних процессов, которые выполняют независимые от приложения части процесса запуска приложения.
Как устранять неполадки с процессом Zygote
В этом разделе описаны решения проблем, связанных с процессом Zygote.
Процесс Zygote завершается со сбоем
Если устройство не перезагружается должным образом, а в журналах или отчетах о сбоях указаны проблемы с процессом Zygote, скорее всего, это связано с недавними изменениями, которые привели к сбою initd или системного сервера. Исправление кода должно решить проблему.
Запреты SELinux или ошибки ввода-вывода
Процесс Zygote очень требователен к дескрипторам файлов, передаваемым между процессами. Если дескрипторы файлов присутствуют во время создания процесса, но не указаны в белом списке, мы используем системный вызов dup, чтобы /dev/null и предотвратить непреднамеренное использование кешированных дескрипторов файлов для доступа к недавно открытым файлам.
Если вы вносите изменения в фреймворк, в том числе пытаетесь загрузить ресурсы в Zygote, и получаете отказы SELinux или ошибки ввода-вывода:
Для безымянных дескрипторов файлов включите дескрипторы файлов в вектор
fds_to_ignoreпри вызовеRestat.Для дескрипторов именованных файлов:
- Изменить набор "
WORKING_DIRECTORY/frameworks/base/core/jni/fd_utils.cpp". - Добавьте путь в белый список для открытых файлов.
- Изменить набор "