Acerca de los procesos de Zygote

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

En los dispositivos modernos, como el Pixel 7 y modelos posteriores, existe un proceso Zygote de 64 bits. Además, existe el WebView Zygote 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 doble, se crean dos procesos de Zygote (uno de 64 bits y uno de 32 bits). En esta página, solo se abordan los sistemas de arquitectura única.

  2. Zygote puede generar inmediatamente procesos llamados procesos de apps no especializados (USAP) o esperar a 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 Cómo habilitar 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 el USAP esté preconfigurado para el uso de la aplicación cambiando el ID (PID) del proceso, el cgroup y otra información.
      2. Cuando se completa la preconfiguración del USAP, responde al servidor del sistema con el PID.
      3. Cuando una aplicación ocupa una de estas USAP, la USAP deja de formar parte del grupo. Cuando el grupo alcanza uno o menos USAP, Zygote lo reabastece con nuevos USAP.
    • 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 adecuado.
      3. Zygote bifurca el proceso y cambia el PID, el cgroup y otra información.
      4. Cuando se completa el proceso, el PID se vuelve a enviar 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.

Solucionar problemas de Zygote

Esta sección contiene soluciones para problemas relacionados con Zygote.

El zygote falla.

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

Rechazos de SELinux o fallas de E/S

Zygote es particular en cuanto a la higiene del descriptor de archivos en los límites del proceso. 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 del sistema dup a /dev/null para evitar que los descriptores de archivos almacenados en caché se usen de manera accidental para acceder a los 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 archivo sin nombre, incluye los descriptores de archivo en el vector fds_to_ignore cuando se llama a Restat.

  • Para los descriptores de archivos nombrados, haz lo siguiente:

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