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

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

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

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

  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 больше не является частью пула. Когда пул достигает одного или меньшего количества USAP в пуле, Zygote пополняет пул новыми USAP.
    • Если ваша Зигота порождает процессы, использующие ленивые вычисления :

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

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

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

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

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

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

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