Acerca de los procesos de Zygote

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

En dispositivos modernos, como 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 WebView.

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 Zygote (uno de 64 bits y otro de 32 bits). En esta página, solo se abordan los sistemas de arquitectura única.

  2. Zygote puede generar de inmediato procesos llamados procesos de app no especializados (USAP) o esperar para generarlos 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 generar procesos de inmediato, consulta Habilita el grupo de procesos de app 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 del proceso (PID), el cgroup y otra información.
      2. Cuando el USAP termina de preconfigurarse, responde al servidor del sistema con el PID.
      3. Cuando una aplicación ocupa uno de estos USAP, el USAP ya no forma parte del grupo. Cuando el grupo alcanza uno o menos USAP, Zygote lo repone con USAP nuevos.
    • Si tu Zygote genera procesos mediante la evaluación diferida:

      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, 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

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

Zygote falla

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

Denegaciones de SELinux o fallas de E/S

Zygote es particular sobre 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 permitidos, usamos una llamada al sistema dup a /dev/null para evitar que los descriptores de archivos almacenados en caché se usen de forma involuntaria para acceder a archivos recién abiertos.

Si realizas cambios en el framework que incluyen intentar cargar recursos en Zygote y recibes denegaciones 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 llama 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.