Estoy tratando de entender cómo funciona Android internamente. Antes de ART, usaba Dalvik para ejecutar código Java. Supongo que creó un proceso Dalkiv en el núcleo 'Linux' que era simplemente una VM que ejecutaba el bytecode dex.
Para ART, el bytecode dex se compila en instrucciones en la arquitectura del procesador (sucede durante el proceso de instalación). Este código de bytes dex compilado se almacena en un binario ELF. Así que es algo que el kernel de 'Linux' puede entender.
Supongamos que quisiera ejecutar este binario ELF en Linux. Además ashmem
de los binder
módulos del kernel, ¿qué más necesitaría? ¿Qué bibliotecas requiere este binario ELF? ¿Este binario ELF simplemente se lanzó como un proceso de Linux?
Intenté leer el código fuente de anbox.io, pero no pude entender cómo lanzaba un binario ELF desde un APK. Tal vez comprender lo que se requiere para ejecutarlo me hará comprender mejor el código fuente de anbox.io.
También encontré https://android.googlesource.com/platform/art/+/refs/heads/master/runtime/ pero no sé por dónde empezar. ¿Qué es / tiempo de ejecución? ¿Es un programa, una biblioteca? ¿Android Runtime es algo que está vinculado con el binario ELF generado a partir del código de bytes dex?
¿Qué se necesita para ejecutar archivos binarios ELF compilados a partir de APK de Android?
¡Una aplicación simple de hola mundo que no hace nada más que imprimir Hello World! (sin animaciones, sin sonidos, sin menús), ejecutándose en un dispositivo con Android 9:
30+
archivos, inodos anónimos y sockets UNIX de forma explícita.500+
archivos asignados en memoria de /data
, y ./system
/vendor
/dev
system_server
) para mostrar algo en pantalla. Posiblemente puede haber más IPC (Binders u otros).system_server
los que se administren las clases de la aplicación relacionadas con la creación de actividades y los permisos.zygote
el proceso se ejecute para bifurcar las máquinas virtuales system_server
y la aplicación en sí.Por lo tanto, todos estos requisitos deben cumplirse para ejecutar el binario ELF (objeto compartido:) /data/app/com.ravipatel.helloworld.test-*/oat/arm64/base.odex
compilado desde APK.
A modo de comparación, un programa Java hello world compilado con GCJ se vincula dinámicamente a menos de 5 bibliotecas. Mientras que un programa C similar (vinculado estáticamente) no tiene dependencias de tiempo de ejecución excepto la arquitectura requerida.
Supongo que creó un proceso Dalkiv en el núcleo 'Linux' que era simplemente una máquina virtual que ejecutaba el
dex
código de bytes.
No. Dalvik no era una máquina virtual basada en kernel ( KVM , si eso es lo que quiere decir). Tanto Dalvik como ART son máquinas virtuales de proceso que se ejecutan en el espacio de usuario.
Para ART, el bytecode dex se compila en instrucciones en la arquitectura del procesador (sucede durante el proceso de instalación).
Es guiado por perfil, rara vez ocurre durante el proceso de instalación.
¿Qué es
/runtime
? ¿Es un programa, una biblioteca?
Runtime es un entorno en el que se ejecutan programas escritos en un lenguaje específico. ART es un tiempo de ejecución para Java. Se compone principalmente de binarios ejecutables nativos/bibliotecas compartidas (que incluyen un compilador VM/intérprete/JIT y un compilador OAT) y bibliotecas de clases Java estándar (principalmente en forma de archivos .jar
) guardadas en formato /system
.
Otro ejemplo bien conocido es Java Runtime Environment ( JRE ) de Oracle/Sun, que se encuentra principalmente en las PC.
¿Android Runtime es algo que está vinculado con el binario ELF generado a partir del
dex
código de bytes?
Correcto.
¿Este binario ELF simplemente se lanza como un proceso de Linux?
No. El binario ELF compilado desde .dex
un archivo en APK no es un ejecutable sino un objeto compartido. Por lo tanto, debe cargarse en la memoria junto con otras dependencias mediante algún otro proceso, que es ART (VM).
Supongamos que quisiera ejecutar este binario ELF en Linux. Además
ashmem
de losbinder
módulos del kernel, ¿qué más necesitaría? ¿Qué bibliotecas requiere este binario ELF?
En primer lugar, no puede ejecutar el binario ELF en un sistema Linux que no sea Android porque el binario no es un ejecutable vinculado estáticamente. Pero incluso si lo es, existen restricciones aún mayores, particularmente la abstracción de hardware de Android. binders
y ashmem
son mecanismos de IPC. Solo tienen sentido si los procesos a los que la aplicación quiere comunicarse también existen, lo cual no es el caso. Con los SDK de Java basados en Linux, es relativamente fácil de lograr.
RELACIONADO:
morrison chang
Roberto