¿Qué se necesita para ejecutar archivos binarios ELF compilados a partir de APK de Android? (entendiendo las partes internas de Android)

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 ashmemde los bindermó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?

Los binarios ELF suelen ser completamente independientes de Dalvic, ART, .... Simplemente funcionan de la misma manera que funcionan en todos los sistemas Linux. Pueden requerir algunas bibliotecas enlazadas dinámicamente. Dependiendo de la biblioteca, ya están presentes de forma predeterminada en el dispositivo o debe colocarlo a lo largo del binario ELF. Las aplicaciones pueden simplemente ejecutar dicho binario. Puede comprobarlo de forma interactiva utilizando una aplicación de terminal como Termux.

Respuestas (1)

¿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:

  • Abre 30+archivos, inodos anónimos y sockets UNIX de forma explícita.
  • Comparte 500+archivos asignados en memoria de /data, y ./system/vendor/dev
  • Se comunica, al menos, con Surface Flinger (a través de Window Manager en system_server) para mostrar algo en pantalla. Posiblemente puede haber más IPC (Binders u otros).
  • Necesita el Administrador de actividades, el Administrador de paquetes y posiblemente otros servicios en ejecución en system_serverlos que se administren las clases de la aplicación relacionadas con la creación de actividades y los permisos.
  • Necesita que zygoteel proceso se ejecute para bifurcar las máquinas virtuales system_servery 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.odexcompilado 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 dexcó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 dexcódigo de bytes?

Correcto.

¿Este binario ELF simplemente se lanza como un proceso de Linux?

No. El binario ELF compilado desde .dexun 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 ashmemde los bindermó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. bindersy ashmemson 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: