5 votes

De quoi a-t-on besoin pour exécuter les binaires ELF compilés à partir des APK Android ? (comprendre le fonctionnement interne d'Android)

J'essaie de comprendre le fonctionnement interne d'Android. Avant ART, il utilisait Dalvik pour exécuter le code java. Je suppose qu'il créait un processus Dalkiv dans le noyau 'Linux' qui était simplement une VM qui exécutait le bytecode dex.

Pour ART, le bytecode dex est compilé en instructions dans l'architecture du processeur (ce qui se produit pendant le processus d'installation). Ce bytecode dex compilé est stocké dans un binaire ELF. C'est donc quelque chose que le noyau 'Linux' peut comprendre.

Supposons que je veuille exécuter ce binaire ELF sous Linux. En outre ashmem y binder Modules du noyau, que me faut-il de plus ? De quelles bibliothèques ce binaire ELF a-t-il besoin ? Ce binaire ELF peut-il être simplement lancé comme un processus linux ?

J'ai essayé de lire le code source de anbox.io, mais je n'ai pas compris comment il lançait un binaire ELF à partir d'un APK. Peut-être que le fait de comprendre ce qui est nécessaire pour l'exécuter me permettra de mieux comprendre le code source de anbox.io.

J'ai également trouvé https://Android.googlesource.com/platform/art/+/refs/heads/master/runtime/ mais je ne sais pas par où commencer. Qu'est-ce que /runtime ? Est-ce un programme, une bibliothèque ? Est-ce que Android Runtime est quelque chose qui est lié avec le binaire ELF généré à partir du bytecode dex ?

6voto

Irfan Latif Points 16863

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 :

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X