О процессах Zygote

Zygote – это процесс в ОС Android, который выступает в качестве корня всех системных процессов и процессов приложений с одинаковым двоичным интерфейсом приложения (ABI).

На современных устройствах, например Pixel 7 и более новых моделях, используется 64-разрядный процесс Zygote. Кроме того, для основного ABI существует WebView Zygote – специализированный процесс Zygote, содержащий библиотеки и ресурсы, необходимые для процессов, в которых выполняются WebView.

Zygote выполняет следующие задачи:

  1. Демон init порождает процесс Zygote при инициализации ОС Android. В некоторых системах с двойной архитектурой запускаются два процесса Zygote (64-разрядный и 32-разрядный). В этой статье рассматриваются только системы с одной архитектурой.

  2. Zygote может сразу порождать процессы, называемые неспециализированными процессами приложений (USAP), или ждать, пока приложениям не понадобятся процессы. Первый вариант можно включить с помощью системного свойства или команды Android Debug Bridge. Подробнее о том, как настроить Zygote для немедленного порождения процессов …

    • Если на вашем устройстве включен пул USAP:

      1. Системный сервер использует сокет домена Unix для подключения к доступному USAP из пула. Системный сервер запрашивает, чтобы USAP был предварительно настроен для использования приложением, изменив идентификатор процесса (PID), cgroup и другую информацию.
      2. После завершения предварительной настройки USAP отправляет системному серверу ответ с PID.
      3. Когда приложение занимает один из этих USAP, он больше не входит в пул. Когда в пуле остается один USAP или не остается ни одного, Zygote пополняет пул новыми USAP.
    • Если Zygote создает процессы с помощью отложенного вычисления:

      1. Системный сервер получает команду о том, что приложению требуется процесс.
      2. Системный сервер использует сокет домена Unix, чтобы отправить команду соответствующему процессу Zygote.
      3. Zygote создает копию процесса и меняет PID, cgroup и другую информацию.
      4. После завершения процесса он отправляет 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.

  • Для дескрипторов именованных файлов:

    1. Изменить набор "WORKING_DIRECTORY/frameworks/base/core/jni/fd_utils.cpp".
    2. Добавьте путь в белый список для открытых файлов.