Acerca de los procesos de Zygote

Zygote es un proceso del sistema operativo Android que actúa como raíz de todos los procesos del sistema y de las apps con la misma interfaz binaria de aplicación (ABI).

En los dispositivos modernos, como el Pixel 7 y modelos posteriores, hay un proceso Zygote de 64 bits. Además, existe el Zygote de WebView para la ABI principal, que es un Zygote especializado que contiene bibliotecas y recursos específicos para los procesos que ejecutan WebViews.

Estas son las tareas que realiza Zygote:

  1. El daemon init genera el proceso Zygote cuando se inicializa el SO Android. En algunos sistemas de arquitectura dual, se generan dos procesos de Zygote (uno de 64 bits y otro de 32 bits). En esta página, solo se tratan los sistemas de arquitectura única.

  2. Zygote puede generar de inmediato procesos llamados procesos de app no especializados (USAP) o esperar para generar procesos según lo necesiten las aplicaciones. La primera opción se debe habilitar a través de una propiedad del sistema o un comando de Android Debug Bridge. Para obtener más información sobre cómo configurar Zygote para que genere procesos de inmediato, consulta Habilita el grupo de procesos de apps no especializados .

    • Si el grupo de USAP está habilitado en tu dispositivo, haz lo siguiente:

      1. El servidor del sistema usa un socket de dominio Unix para conectarse a un USAP disponible desde un grupo. El servidor del sistema solicita que se preconfigure el USAP para el uso de la aplicación cambiando el ID (PID), el cgroup y otra información del proceso.
      2. Cuando el USAP termina la configuración previa, responde al servidor del sistema con el PID.
      3. Cuando una aplicación ocupa una de estas USAP, la USAP ya no forma parte del grupo. Cuando el grupo alcanza uno o menos USAPs, Zygote lo reabastece con USAPs nuevos.
    • Si tu Zygote genera procesos con evaluación diferida, haz lo siguiente:

      1. El servidor del sistema recibe un comando que indica que una app necesita un proceso.
      2. El servidor del sistema usa un socket de dominio Unix para enviar un comando al Zygote apropiado.
      3. Zygote bifurca el proceso y cambia el PID, el cgroup y otra información.
      4. Cuando se completa el proceso, se envía el PID de vuelta a Zygote, que luego lo pasa al servidor del sistema.

Habilita el grupo de USAP

Para habilitar el uso del grupo de USAP, haz una de las siguientes acciones:

  • Establece la propiedad del sistema dalvik.vm.usap_pool_enabled en true en /build/make/target/product/runtime_libart.mk.

  • Ejecuta el siguiente comando:

    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
    

Cuando esta función está habilitada, cada Zygote mantiene un grupo de procesos bifurcados que realizan las partes independientes de la aplicación del proceso de inicio de la aplicación.

Soluciona problemas de Zygote

En esta sección, se incluyen soluciones para problemas relacionados con Zygote.

Zygote falla

Si el dispositivo no se reinicia correctamente y los registros o los informes de fallas muestran problemas con Zygote, es probable que se deba a un cambio reciente que provoca que initd o el servidor del sistema fallen. Corregir tu código debería solucionar el problema.

Denegaciones de SELinux o fallas de E/S

Zygote es muy exigente con la higiene de los descriptores de archivos en los límites de los procesos. Cuando los descriptores de archivos están presentes en el momento de la bifurcación, pero no en una lista de entidades permitidas, usamos una llamada al sistema dup para /dev/null y, así, evitar que los descriptores de archivos almacenados en caché se usen de forma no intencional para acceder a archivos recién abiertos.

Si realizas cambios en el framework que incluyen intentar cargar recursos en Zygote y recibes rechazos de SELinux o fallas de E/S, haz lo siguiente:

  • Para los descriptores de archivos sin nombre, incluye los descriptores de archivos en el vector fds_to_ignore cuando se llame a Restat.

  • Para los descriptores de archivos con nombre, haz lo siguiente:

    1. Edita WORKING_DIRECTORY/frameworks/base/core/jni/fd_utils.cpp.
    2. Agrega la ruta de acceso a la lista de permitidos para los archivos abiertos.