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