De quoi a-t-on besoin pour exécuter les binaires ELF compilés à partir des APK Android ?
Un simple application hello world qui ne fait rien d'autre que d'imprimer Bonjour le monde ! (pas d'animations, pas de sons, pas de menus), fonctionnant sur un appareil Android 9 :
- Ouvertures
30+
les inodes anonymes et les sockets UNIX.
- Actions
500+
les fichiers à mémoire de forme de /data
, /system
, /vendor
y /dev
.
- Communique, au moins, avec Surface Flinger (par l'intermédiaire du gestionnaire de fenêtres dans
system_server
) pour afficher quelque chose à l'écran. Il peut éventuellement y avoir d'autres IPC (Binders ou autres).
- A besoin du gestionnaire d'activités, du gestionnaire de paquets et éventuellement d'autres services fonctionnant dans l'application
system_server
qui gère les classes de l'application liées à la création d'activités et aux autorisations.
- Besoins
zygote
qui s'exécute pour créer des machines virtuelles pour system_server
et l'application elle-même.
Toutes ces conditions doivent donc être remplies pour exécuter le binaire ELF (objet partagé) : /data/app/com.ravipatel.helloworld.test-*/oat/arm64/base.odex
) compilé à partir de l'APK.
À titre de comparaison, un programme Java "hello world" compilé avec GCJ est lié dynamiquement à moins de 5 bibliothèques. Alors qu'un programme C similaire (lié statiquement) n'a aucune dépendance d'exécution, à l'exception de l'architecture requise.
Je suppose qu'il a créé un processus Dalkiv dans le noyau "Linux" qui était simplement une VM qui exécutait le processus Dalkiv. dex
bytecode.
Dalvik n'était pas une machine virtuelle basée sur le noyau ( KVM (si c'est ce que vous voulez dire). Dalvik et ART sont tous deux Traiter les machines virtuelles qui s'exécutent dans l'espace utilisateur.
Pour ART, le bytecode dex est compilé en instructions dans l'architecture du processeur (ce qui se produit pendant le processus d'installation).
Elle est guidée par le profil et se produit rarement au cours du processus d'installation.
Qu'est-ce que /runtime
? S'agit-il d'un programme, d'une bibliothèque ?
Le Runtime est un environnement dans lequel s'exécutent les programmes écrits dans un langage spécifique. ART est un runtime pour Java. Il se compose principalement de binaires exécutables natifs / de bibliothèques partagées (y compris une VM / un interpréteur / un compilateur JIT et un compilateur OAT) et de bibliothèques de classes Java standard (principalement sous la forme de .jar
) sauvegardés dans /system
.
Un autre exemple bien connu est celui de Java Runtime Environment ( JRE ) d'Oracle/Sun, que l'on trouve sur la plupart des PC.
Le moteur d'exécution d'Android est-il lié au binaire ELF généré à partir de l'application dex
bytecode ?
Correct.
Ce binaire ELF est-il simplement lancé en tant que processus Linux ?
Non. Le binaire ELF compilé à partir de .dex
dans l'APK n'est pas un exécutable mais un objet partagé. Il doit donc être chargé en mémoire avec d'autres dépendances par un autre processus, qui est ART (VM).
Supposons que je veuille exécuter ce binaire ELF sous Linux. En outre ashmem
y binder
les modules du noyau, de quoi aurais-je besoin de plus ? Quelles sont les bibliothèques dont ce binaire ELF a besoin ?
Tout d'abord, vous ne pouvez pas exécuter le binaire ELF sur un système Linux autre qu'Android, car le binaire n'est pas un exécutable à liaison statique. Mais même si c'est le cas, il y a des contraintes encore plus importantes, en particulier l'abstraction matérielle d'Android. binders
y ashmem
sont des mécanismes IPC. Ils n'ont de sens que si les processus vers lesquels l'application veut communiquer existent également, ce qui n'est pas le cas. Avec les SDK Java basés sur Linux, c'est relativement facile à réaliser.
RELATED :