О процессах зиготы

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

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

Вот задачи, которые выполняет зигота:

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

  2. Zygote может немедленно запускать процессы, называемые неспециализированными процессами приложений (USAP) , или ожидать запуска процессов по мере необходимости для приложений. Первый вариант необходимо включить через системное свойство или команду отладки Android. Дополнительную информацию о настройке Zygote для немедленного запуска процессов см. в разделе «Включение пула неспециализированных процессов приложений» .

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

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

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

Отказы SELinux или сбои ввода-вывода

Zygote уделяет особое внимание гигиене файловых дескрипторов на границах процессов. Если файловые дескрипторы присутствуют во время создания дочернего процесса, но отсутствуют в списке разрешенных, мы используем dup системный вызов к /dev/null , чтобы предотвратить непреднамеренное использование кэшированных файловых дескрипторов для доступа к недавно открытым файлам.

Если вы вносите изменения в фреймворк, которые включают попытку загрузки ресурсов в Zygote, и получаете отказы SELinux или ошибки ввода-вывода:

  • Для файловых дескрипторов без имени, включите их в вектор fds_to_ignore при вызове функции Restat .

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

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