Red de conocimiento informático - Material del sitio web - Preguntas de entrevistas de alta frecuencia para desarrolladores de Android de los principales fabricantes: cuéntenos su comprensión de Zygote

Preguntas de entrevistas de alta frecuencia para desarrolladores de Android de los principales fabricantes: cuéntenos su comprensión de Zygote

Se puede decir que Zygote es una pregunta muy frecuente en las entrevistas de desarrollo de Android, pero siempre hay amigos que responden a esta pregunta y nunca quedan satisfechos con la entrevista. Aquí debes entender lo que te pregunta la entrevista. Cigoto. Al comprender, ¿qué es lo que más debería querer escuchar y qué es lo que realmente quiere preguntar? ¡Analicemos este problema a través de los siguientes puntos!

La función de Zygote se divide en dos puntos:

Si respondes estos dos puntos sobre esta pregunta, entonces está bien. Quizás la mayoría de los amigos puedan responder el segundo punto, pero el primero no está muy claro. SystemServer también lo inicia Zygote, porque SystemServer necesita utilizar los recursos del sistema preparados por Zygote, que incluyen:

Si se hereda directamente de Zygote, no es necesario recargarlo, lo que mejorará en gran medida el rendimiento. .

Antes de hablar sobre el proceso de inicio de Zygote, primero aclaremos un concepto: inicio en tres etapas. Esto puede entenderse como una rutina común para el inicio de procesos en Android, que se divide en tres pasos:

p>

Estos son los pasos: Comprenda qué es un bucle LOOP. De hecho, la función de LOOP es recibir y procesar mensajes continuamente. La fuente del mensaje puede ser el mensaje enviado por Soket, MessageQueue o Binder. controlador, pero no importa de dónde venga el mensaje, todo su proceso es recibir el mensaje y procesar el mensaje. Este inicio de tres etapas no solo es válido para el proceso Zygote, sino también para cualquier proceso independiente, como un proceso de servicio del sistema o su propio proceso de aplicación.

El inicio del proceso Zygote depende del proceso de inicio. El proceso de inicio es el primer proceso en el espacio del usuario después de que se inicia Linux. 3. Archivo de configuración de inicio Los servicios del sistema definidos en, entre los cuales se define el servicio Zygote en la configuración

4. Además de Zygote, algunos otros servicios del sistema también se iniciarán al mismo tiempo, como el proceso ServiceManager, que se inicia a través de la llamada al sistema fork execve

En el archivo init.rc, /init.${ro.zygote}.rc, init.zygoteXX, XX se refiere a 32 o 64 , lo cual no nos importa. Podemos mirar directamente init.zygote32.rc. El archivo de configuración es relativamente largo, por lo que se interceptó aquí para conservar las partes relacionadas con Zygot.

Después de hablar de la configuración de inicio, hablemos del proceso de inicio. Hay dos formas de iniciar el proceso:

La primera: fork handle

. El segundo: fork execve

Los dos son similares Primero, se llama a la función fork para crear un proceso hijo. Esta función es peculiar y regresa dos veces, una para el proceso hijo y otra para el proceso padre. .

La diferencia es:

Se divide principalmente en dos partes: procesamiento de la capa nativa y procesamiento de la capa Java. Una vez iniciado el proceso Zygote, ejecuta la llamada al sistema execve, que ejecuta el programa ejecutable binario escrito en C. ¡La función principal sirve como punto de entrada y luego se ejecuta en la capa de Java!

Primero echemos un vistazo al flujo de procesamiento de la capa nativa.

En el archivo app_main.cpp, archivo AndroidRuntime.cpp. Podemos encontrar varios nombres de funciones principales.

Según el código anterior, encontrará que podemos llamar a JNI directamente en nuestra aplicación sin crear una máquina virtual. Debido a que el proceso de solicitud es creado por el proceso Zygote, hereda la máquina virtual propiedad del proceso principal y solo necesita restablecer los datos.

A continuación, echemos un vistazo al procesamiento de la capa Java. Para obtener más información, consulte el método principal del archivo ZygoteInit.

1. Precargue recursos, como los comunes. bibliotecas de clases, recursos temáticos y algunas bibliotecas compartidas Espere

2. Inicie el proceso SystemServer

3. Ingrese al bucle Loop del Socket y verá ZygoteServer.runSelectLoop(.. .) llamar

Requerido en el proceso de inicio de Zygote Principalmente las siguientes 2 preguntas

Finalmente