Zygote — это процесс в операционной системе Android, который выступает в качестве корня всех системных и прикладных процессов с тем же двоичным интерфейсом приложения (ABI).
На современных устройствах, таких как Pixel 7 и более поздние модели, существует 64-битный процесс Zygote. Кроме того, существует WebView Zygote для основного ABI, представляющий собой специализированный процесс Zygote, содержащий библиотеки и ресурсы, специфичные для процессов, запускающих WebView.
Вот задачи, которые выполняет Зигота:
Демон init запускает процесс Zygote при инициализации ОС Android. В некоторых системах с двойной архитектурой запускаются два процесса Zygote (64- и 32-разрядный). Эта страница посвящена только системам с одной архитектурой.
Zygote может немедленно запускать процессы, называемые неспециализированными процессами приложений (USAP) , или откладывать запуск процессов по мере необходимости. Первый вариант необходимо включить через системное свойство или команду отладочного моста Android. Подробнее о настройке Zygote для немедленного запуска процессов см. в разделе Включение пула неспециализированных процессов приложений .
Если на вашем устройстве включен пул USAP:
- Системный сервер использует сокет домена Unix для подключения к доступной точке доступа USAP из пула. Системный сервер запрашивает предварительную настройку USAP для использования приложением, изменяя идентификатор процесса (PID), контрольную группу и другую информацию.
- После завершения предварительной настройки USAP отправляет ответ системному серверу с идентификатором PID.
- Когда приложение занимает одну из этих точек доступа (USAP), эта точка доступа (USAP) перестаёт быть частью пула. Когда количество точек доступа (USAP) в пуле достигает одного или меньшего числа, Зигота пополняет пул новыми точками доступа (USAP).
Если ваша Zygote порождает процессы, использующие ленивые вычисления :
- Системный сервер получает команду о том, что приложению нужен процесс.
- Системный сервер использует сокет домена Unix для отправки команды соответствующей Зиготе.
- 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, вероятно, вы недавно внесли изменения, которые привели к сбою initd или системного сервера. Исправление кода должно решить проблему.
Отклонения SELinux или сбои ввода-вывода
Zygote уделяет особое внимание гигиене файловых дескрипторов между процессами. Если файловые дескрипторы присутствуют во время форка, но не находятся в списке разрешенных, мы используем системный вызов dup
к /dev/null
, чтобы предотвратить непреднамеренное использование кэшированных файловых дескрипторов для доступа к вновь открытым файлам.
Если вы вносите изменения в фреймворк, включая попытку загрузки ресурсов в Zygote, и получаете отказы SELinux или сбои ввода-вывода:
Для неименованных файловых дескрипторов включите файловые дескрипторы в вектор
fds_to_ignore
при вызовеRestat
.Для именованных файловых дескрипторов:
- Редактируйте
WORKING_DIRECTORY /frameworks/base/core/jni/fd_utils.cpp
. - Добавьте путь в список разрешенных для открытых файлов.
- Редактируйте