A partir del 27 de marzo de 2025, te recomendamos que uses android-latest-release
en lugar de aosp-main
para compilar y contribuir a AOSP. Para obtener más información, consulta Cambios en AOSP.
Acerca de los procesos de Zygote
Organiza tus páginas con colecciones
Guarda y categoriza el contenido según tus preferencias.
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 dispositivos modernos, como Pixel 7 y modelos posteriores, hay un proceso de 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:
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.
Zygote puede generar inmediatamente procesos llamados procesos de apps 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 Cómo habilitar el grupo de procesos de apps no especializados .
Si el grupo de USAP está habilitado en tu dispositivo, haz lo siguiente:
- 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.
- Cuando se completa la preconfiguración del USAP, responde al servidor del sistema con el PID.
- Cuando una aplicación ocupa uno de estos USAP, este ya no forma 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:
- El servidor del sistema recibe un comando que indica que una app necesita un proceso.
- El servidor del sistema usa un socket de dominio Unix para enviar un comando al Zygote apropiado.
- Zygote bifurca el proceso y cambia el PID, el cgroup y otra información.
- Cuando se completa el proceso, el PID se envía 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:
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.
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 al sistema dup
a /dev/null
para 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 nombrados, haz lo siguiente:
- Editar
WORKING_DIRECTORY/frameworks/base/core/jni/fd_utils.cpp
.
- Agrega la ruta de acceso a la lista de entidades permitidas para los archivos abiertos.
El contenido y las muestras de código que aparecen en esta página están sujetas a las licencias que se describen en la Licencia de Contenido. Java y OpenJDK son marcas registradas de Oracle o sus afiliados.
Última actualización: 2025-07-27 (UTC)
[[["Fácil de comprender","easyToUnderstand","thumb-up"],["Resolvió mi problema","solvedMyProblem","thumb-up"],["Otro","otherUp","thumb-up"]],[["Falta la información que necesito","missingTheInformationINeed","thumb-down"],["Muy complicado o demasiados pasos","tooComplicatedTooManySteps","thumb-down"],["Desactualizado","outOfDate","thumb-down"],["Problema de traducción","translationIssue","thumb-down"],["Problema con las muestras o los códigos","samplesCodeIssue","thumb-down"],["Otro","otherDown","thumb-down"]],["Última actualización: 2025-07-27 (UTC)"],[],[],null,["# About the Zygote processes\n\nThe *Zygote* is a process in the Android operating system that acts as the root\nof all system and app processes with the same application binary\ninterface (ABI).\n\nOn modern devices, such as Pixel 7 and later, there is a 64-bit Zygote process.\nIn addition, there is the *WebView Zygote* for the primary ABI, which is a\nspecialized Zygote\nthat contains libraries and resources specific to processes that run WebViews.\n\nHere are the tasks the Zygote performs:\n\n1. The init daemon spawns the Zygote process when the Android OS is\n initialized. On some dual architecture systems, two Zygote processes (a 64-bit\n and 32-bit) are spawned. This page covers only single architecture systems.\n\n2. The Zygote can immediately spawn processes called *unspecialized app\n processes (USAP)* or wait to spawn processes as needed by applications.\n The former option must be enabled through a system property or Android\n debug bridge command. For more information on configuring the Zygote to spawn\n processes immediately, see\n [Enable unspecialized app processes pool](#enable).\n\n - If the USAP pool is enabled on your device:\n\n 1. The system server uses a Unix domain socket to connect to an available USAP from a pool. The system server requests that the USAP is preconfigured for application use by changing the process's ID (PID), cgroup, and other information.\n 2. When the USAP is done preconfiguring, it replies to the system server with the PID.\n 3. When an application occupies one of these USAPs, the USAP is no longer part of the pool. When the pool reaches one or fewer USAPs in the pool, the Zygote replenishes the pool with new USAPs.\n - If your Zygote spawns processes using\n [lazy evaluation](https://en.wikipedia.org/wiki/Lazy_evaluation):\n\n 1. The system server receives a command that an app needs a process.\n 2. The system server uses a Unix domain socket to send a command to the appropriate Zygote.\n 3. The Zygote forks the process and changes the PID, cgroup, and other information.\n 4. When the process is complete, it sends the PID back to the Zygote which then passes it back to the system server.\n\nEnable USAP pool\n----------------\n\nTo enable the use of USAP pool, do one of the following:\n\n- Set the `dalvik.vm.usap_pool_enabled` system property to `true` in `/build/make/target/product/runtime_libart.mk`.\n\n- Run the following command:\n\n 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\n\nWhen this feature is enabled, each Zygote maintains a pool of forked processes\nthat perform the application-independent portions of the application startup\nprocess.\n\nTroubleshoot Zygote issues\n--------------------------\n\nThis section contains solutions to Zygote-related issues.\n\n### The Zygote is crashing\n\nIf your device doesn't reboot properly and your logs or crash reports show\nissues with the Zygote, it's likely because you made a recent change that\ncauses initd or the system server to crash. Fixing your code should fix\nthe problem.\n\n### SELinux denials or IO Failures\n\nThe Zygote is particular about file descriptor hygiene across process\nboundaries. When file descriptors are present at fork time but not in an\nallowlist, we use a `dup` system call to `/dev/null` to prevent cached file\ndescriptors from being used unintentionally to access newly opened files.\n\nIf you're making framework changes that include trying to load\nresources into the Zygote, and you're receiving SELinux denials or IO failures:\n\n- For unnamed file descriptors, include the file descriptors in the `fds_to_ignore` vector when `Restat` is called.\n\n- For named file descriptors:\n\n 1. Edit \u003cvar translate=\"no\"\u003eWORKING_DIRECTORY\u003c/var\u003e`/frameworks/base/core/jni/fd_utils.cpp`.\n 2. Add the path to the allowlist for open files."]]