r15b - ¿Cómo se ejecuta el código nativo de Android escrito para ARM en x86?
ndk para android (4)
En Trend Micro Safe Mobile Workforce , tenemos un tiempo de ejecución ARM (no el houdini de Intel) para la biblioteca nativa en aplicaciones de Android. Para que podamos admitir la ejecución de APK con solo ARM lib en el potente servidor x86.
Motorola acaba de lanzar un teléfono Android basado en x86. Estoy un poco confundido en cuanto a cómo las aplicaciones / bibliotecas nativas escritas para ARM (por ejemplo, netflix) pueden ejecutarse en este teléfono.
Estaría agradecido si alguien pudiera explicar.
Sí, el código nativo ARM se ejecuta en Intel x86 usando una función de emulación llamada Houdini
Lo que hace esta biblioteca es leer las instrucciones ARM sobre la marcha y las convierte en instrucciones x86 equivalentes. Esta es la razón por la que muchas aplicaciones pueden funcionar como están en x86 sin tener que construir una biblioteca equivalente.
De hecho, puedes incluir diferentes códigos nativos para diferentes arquitecturas, no estás seguro de cómo se está ejecutando Netflix, pero si abres apk puedes ver /lib/armeabi-v7a/
, así que supongo que puede haber una carpeta similar a /lib/x86/
Edición: Acabo de verificar la aplicación de compras de Amazon que tiene un código nativo para arm y x86. Así que tal vez así es como lo hace netflix.
- Las CPU están "Turing complete" (hasta los límites de memoria)
- Las CPU tienen un comportamiento determinista simple que se puede simular con máquinas de Turing de memoria finita
Por lo tanto, está claro que cualquier CPU puede emular cualquier CPU con suficiente memoria.
La pregunta difícil es cómo hacerlo tan rápido .
Además de Houdini de Intel, le recomiendo encarecidamente que estudie cómo lo hace QEMU.
QEMU es la forma principal de ejecutar ARM en x86. Es el software GPL, y se utiliza como el núcleo del emulador de Android utilizado por los desarrolladores de Android.
x86 en ARM tiene menos soporte, pero los conceptos principales deberían ser similares a la inversa.
En particular, jugar con el modo de emulación de usuario. Con ese modo, puede ejecutar un ejecutable ARM enlazado estáticamente en el host x86 simplemente como:
qemu-arm-static ./executable
Algunas ideas:
- las instrucciones se traducen en instrucciones de host
- Las llamadas del sistema se reenvían al host