Comment android native code écrit pour BRAS exécuter sur x86?
Motorola vient de sortir un x86 téléphone basé sur Android. Je suis un peu confus quant à la façon dont les applications natives/bibliothèques écrites pour les BRAS(netflix par exemple) peuvent s'exécuter sur ce téléphone.
Je lui en serais reconnaissant si quelqu'un pouvait expliquer.
- Probablement BRAS de code natif ne peut pas s'exécuter sur des systèmes x86, ou au moins besoin d'un émulateur.
Vous devez vous connecter pour publier un commentaire.
Oui, natif ARM code s'exécute sur le processeur Intel x86 à l'aide d'une fonction d'émulation nommé Houdini
Ce que cette bibliothèque n'est lit les BRAS instructions à la volée et les convertit en équivalent x86 instructions. C'est la raison pour laquelle de nombreuses applications peuvent fonctionner que sur x86 sans avoir à construire un équivalent de la bibliothèque.
Vous pouvez réellement inclure les différents types de code natif pour une architecture différente, vous ne savez pas comment Netflix est en cours d'exécution, mais si vous ouvrez l'apk vous pouvez voir
/lib/armeabi-v7a/
, je suppose qu'il peut y avoir un dossier quelque chose comme/lib/x86/
Edit: je viens de vérifier le Amazon app achats, il a du code natif pour arm et x86. Alors peut-être que c'est comment netflix est-il trop.
libs
paslib
, encore une belle réponseAndroid Studio 3 émulateur utilise QEMU comme un backend
https://en.wikipedia.org/wiki/QEMU
QEMU est sans doute l'open source leader de la croix de l'arche de l'émulateur. C'est un logiciel sous licence GPL, et prend en charge de nombreuses architectures en plus de x86 et ARM.
Android puis ajoute juste un peu de l'INTERFACE utilisateur de la magie sur le dessus de QEMU et, éventuellement, certains correctifs, mais le cœur est définitivement dans QEMU en amont.
QEMU utilise une technique appelée binaire traduction de réaliser raisonnablement rapide de l'émulation: https://en.wikipedia.org/wiki/Binary_translation
Binaire traduction fondamentalement traduit BRAS instructions en équivalent x86 instructions.
Par conséquent, pour comprendre les détails, le meilleur moyen est de:
Théorie
Par conséquent, il est clair que tout le CPU peut imiter n'importe quel CPU donné assez de mémoire.
La question difficile est de savoir comment le faire rapide.
Pratique: QEMU utilisateur en mode simulation
QEMU a un userland mode qui le rend très facile à jouer avec userland BRAS de code sur votre machine x86 pour voir ce qui se passe, aussi longtemps que votre invité et l'hôte sont le même OS.
Dans ce mode, ce qui se passe est que le binaire de traduction prend soin de les instructions de base, et les appels système sont simplement transmis à l'hôte, les appels système.
E. g., pour Linux sur Linux avec Linux autonome (pas de glibc) bonjour tout le monde:
principal.S
GitHub en amont.
Ensuite les assembler et de les exécuter en tant qu':
et les extrants attendus:
Vous pouvez même exécuter le BRAS programmes compilés à l'encontre de la bibliothèque C standard, et GDB étape déboguer le programme! Voir cet exemple concret: Comment seule étape de montage de BRAS dans GDB sur QEMU?
Puisque nous parlons des binaires de traduction, nous pouvons également permettre à certains de journalisation pour voir la traduction exacte que QEMU est en train de faire:
Ici:
in_asm
désigne le BRAS invité d'entrée de l'assembléeout_asm
désigne X86 hôte assembly généré qui est exécutéLa sortie contient:
donc dans le
IN
section, nous voyons nos écrits à la main montage de BRAS de code, et dans leOUT
section, nous voyons le générés x86 assemblée.Testé sous Ubuntu 16.04 amd64, QEMU 2.5.0, binutils 2.26.1.
QEMU complète du système d'émulation
Lors du démarrage d'Android dans QEMU cependant, il n'est pas en cours d'exécution un userland binaire de cours, mais plutôt de faire le plein système de la simulation, où il dirige le véritable noyau Linux et tous les appareils de la simulation.
Complète du système de simulation est plus précis, mais un peu plus lent, et vous avez besoin de donner un noyau et de l'image du disque de QEMU.
À essayer ça, avoir un regard sur les configurations suivantes:
KVM
Si vous exécutez Android X86 sur QEMU, vous constaterez qu'il est beaucoup plus rapide.
La raison en est que QEMU utilise KVM, qui est une fonctionnalité du noyau Linux que peut exécuter l'invité des instructions directement sur l'ordinateur hôte!
Si vous arrive d'avoir un BRAS puissant de la machine (encore rares à compter de 2019), vous pouvez également exécuter des BRAS sur les BRAS avec KVM beaucoup plus rapide.
Pour cette raison, je recommande que vous vous en tenez à X86 simulation de PSBA si vous êtes sur un système X86 d'hôte comme indiqué au: Comment faire pour compiler le Android PSBA noyau et le tester avec l'Émulateur Android?, à moins que vous vraiment besoin de toucher à quelque chose de faible niveau.
Dans Trend Micro Coffre-Fort Personnel Mobile, nous avons un BRAS d'exécution (pas Intel houdini) pour la bibliothèque native dans les applications Android. De sorte que nous pouvons prendre en charge l'exécution de l'APK avec un seul BRAS lib sur de puissants serveurs x86.