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

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

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

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

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

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

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

      1. Системный сервер использует сокет домена Unix для подключения к доступной точке доступа USAP из пула. Системный сервер запрашивает предварительную настройку USAP для использования приложением, изменяя идентификатор процесса (PID), контрольную группу и другую информацию.
      2. После завершения предварительной настройки USAP отправляет ответ системному серверу с идентификатором PID.
      3. Когда приложение занимает одну из этих точек доступа (USAP), эта точка доступа (USAP) перестаёт быть частью пула. Когда количество точек доступа (USAP) в пуле достигает одного или меньшего числа, Зигота пополняет пул новыми точками доступа (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. Добавьте путь в список разрешенных для открытых файлов.