navegador islandia cache art amnho android dalvik

android - islandia - dalvik vs art



Comprender Android: Zygote y DalvikVM (5)

Estoy tratando de entender cómo Android lanza aplicaciones. La pregunta es ¿cómo (y por qué) Zygote bifurca una nueva máquina virtual Dalvik? No entiendo por qué no es posible ejecutar múltiples aplicaciones en la misma máquina virtual de Dalvik.


No. Dalvik no abarca los procesos.

Sin embargo, el mecanismo Binder IPC puede hacer un trabajo muy convincente para hacer que los objetos parezcan migrar a un proceso diferente y a su instancia Dalvik. Además, la administración de la memoria es muy buena para compartir páginas de solo lectura en todos los procesos que las necesitan. El proceso de Dalvik que aloja una aplicación típica se bifurcó de zygote con todas las bibliotecas de Android comunes ya mapeadas, por lo que no es necesario abrir nuevas copias únicas.

Fuente: ¿Las aplicaciones que usan procesos múltiples comparten una instancia de Dalvik?

También verifique estos enlaces:

http://davidehringer.com/software/android/The_Dalvik_Virtual_Machine.pdf

http://commonsware.com/blog/Articles/what-is-dalvik.html


Q. ¿cómo zygote exactamente fork Dalvik VM?

Respuesta corta: El proceso de Zygote básicamente inicia en frío una VM en el arranque del sistema. Una vez hecho esto, escucha un socket para los comandos entrantes. Otros procesos (por ejemplo, ActivityManagerService) escriben comandos en este socket, siempre que necesite un nuevo proceso para una aplicación. Este comando lo lee el proceso Zygote y llama a fork (), de modo que el proceso secundario ahora obtiene una máquina virtual precalentada en la que ejecutar. Así es como el zigoto bifurca la máquina virtual de Dalvik.

Respuesta larga: (esto podría ser realmente largo) Después de cargar kernel, init.rc se analiza y se inician los servicios nativos. Con esto, se /system/bin/app_process (Código fuente: frameworks/base/cmds/app_process/app_main.cpp ). Esto finalmente llama a la función AndroidRuntime.start() (Código fuente: frameworks/base/core/jni/AndroidRuntime.cpp ), pasando los parámetros com.android.internal.os.ZygoteInit y start-system-server .

AndroidRuntime.start() inicia la máquina virtual Java y luego llama a ZygoteInit.main() (Código fuente: frameworks/base/core/java/com/android/internal/os/ZygoteInit.java ), pasándole el parámetro start-system-server .

ZygoteInit.main() primero registra el zygote socket (el proceso ZygoteInit.main() escucha un socket para los comandos entrantes, y al recibir un nuevo comando, genera un nuevo proceso según lo solicitado). Lo siguiente que sucede es que precarga muchas clases (que se enumeran en frameworks/base/preloaded-classes , la última vez que revisé, 2307 líneas, en Android 4.0.4) y todos los recursos de todo el sistema como drawables, xmls, etc. Luego llama a startSystemServer() que startSystemServer() un nuevo proceso para com.android.server.SystemServer (Código fuente: frameworks/base/services/java/com/android/server/SystemServer.java ). La bifurcación del servidor del sistema es un caso especial, porque en todos los demás casos, el proceso zygote escucha un socket y se bifurca para nuevos comandos, como veremos pronto.

Después de que se bifurca runSelectLoopMode() se llama a una función runSelectLoopMode() . Este es un ciclo while(true) que básicamente establece ZygoteConnection con el ZygoteConnection socket y espera los comandos en él. Cuando se recibe un comando, se llama a ZygoteConnection.runOnce() (Código fuente: frameworks/base/core/java/com/android/internal/os/ZygoteConnection.java )

ZygoteConnection.runOnce() llama a Zygote.forkAndSpecialize() (Código fuente: libcore/dalvik/src/main/java/dalvik/system/Zygote.java ) que simplemente llama a una función natvie para hacer la bifurcación. Por lo tanto, al igual que en el caso de SystemServer, se crea un proceso secundario que tiene un Dalvik precalentado para sí mismo.

P. ¿por qué no es posible ejecutar múltiples aplicaciones en la misma máquina virtual de Dalvik?

Esta es una decisión de diseño hasta donde yo sé. Los chicos de Android simplemente decidieron usar una nueva máquina virtual por proceso, para seguridad a través de sandboxing.


Solo para agregar un punto más a las respuestas anteriores cuando zygote hace un fork al recibir un comando, usa la técnica de copiar sobre escritura . La memoria se copia solo cuando el nuevo proceso intenta modificarla.

Además, las bibliotecas centrales que carga el zygote en el inicio son de solo lectura y no se pueden modificar. Por lo tanto, no se copian sino que se comparten con nuevos procesos bifurcados.

Todo esto condujo a un inicio rápido y una menor huella de memoria .


Zygote no está realmente ligado con Dalvik, es solo un proceso inicial. Zygote es el método que usa Android para iniciar aplicaciones. En lugar de tener que comenzar cada nuevo proceso desde cero, cargando todo el sistema y el marco de Android cada vez que desea iniciar una aplicación, lo hace una vez, y luego se detiene en ese punto, antes de que Zygote haya hecho algo específico de la aplicación . Luego, cuando desea iniciar una aplicación, el proceso de Zygote se bifurca y el proceso secundario continúa donde lo dejó, y carga la aplicación en la máquina virtual.


Zygote también se usa para compartir los sistemas arrastrables con todas las aplicaciones. Esto permite que el sistema cargue mapas de bits para botones solo una vez, por ejemplo.