Migre autom谩ticamente aplicaciones de iOS (ARM) a macOS (x86) usando Bitcode

Cuando Apple introdujo la tecnolog铆a Bitcode y la hizo obligatoria para watchOS y tvOS, la compa帽铆a pareci贸 ignorar las preguntas sobre por qu茅 era necesaria. Solo dijo vagamente que ayuda a personalizar los archivos binarios y utiliza las 煤ltimas mejoras del compilador.

Desde entonces, Bitcode ha jugado un papel importante en la transici贸n sin problemas de watchOS a 64 bits, donde los desarrolladores ni siquiera tuvieron que volver a compilar sus aplicaciones en el directorio. La propia Apple hizo esto autom谩ticamente: todas las aplicaciones comenzaron a funcionar en el Apple Watch Series 4. Probablemente ni siquiera se dio cuenta de que se hab铆a producido la migraci贸n.

驴Qu茅 es el c贸digo de bits? Bueno, el c贸digo de bits con b peque帽o es la representaci贸n intermedia espec铆fica de la arquitectura utilizada por LLVM, y el c贸digo de bits con B grande se refiere a un conjunto de funciones que le permiten incrustar esta vista en su binario Mach-O, y los mecanismos por los cuales puede renderizar este archivo en la tienda de aplicaciones.

Bitcode no es tan flexible como el c贸digo fuente, pero es mucho m谩s flexible que el binario incrustado, con metadatos y anotaciones para el compilador. En la pr谩ctica, usted (o Apple) puede tomar f谩cilmente los blobs de Bitcode de la aplicaci贸n y recompilarlos en una copia completamente funcional de su aplicaci贸n. Cambiar de armv7 a armv7s o de arm64 a arm64e es muy bueno y ahorra tiempo a los desarrolladores que tuvieron que volver a compilar el binario cada vez que Apple cambia los chips ARM. Apple ha utilizado durante mucho tiempo el c贸digo de bits en los controladores OpenGL, por lo que el controlador se puede optimizar sobre la marcha para diversas arquitecturas de GPU.

Hemos visto c贸mo Microsoft aprovecha efectivamente la recopilaci贸n est谩tica en Xbox One, proporcionando acceso a una biblioteca completa de juegos originalmente escritos para Xbox 360 (bajo PowerPC), sin la participaci贸n de desarrolladores o el acceso al c贸digo fuente. Y sin un intermediario como Bitcode, lo que simplifica el proceso.

Por supuesto, el fantasma de macOS en ARM ha estado rondando por muchos a帽os. Muchos se preguntaron si esto facilitar铆a la transferencia de aplicaciones mediante Bitcode. Como resultado, llegaron a un consenso de que Bitcode no es adecuado para transferir entre arquitecturas radicalmente diferentes como Intel y ARM.

Esto no me convenci贸, as铆 que decid铆 comprobarlo.

Para comenzar, necesitamos una aplicaci贸n de prueba simple en Objective-C con Bitcode; Por lo general, se incluye solo cuando se crea un archivo para App Store, por lo que debe forzarlo para que se incluya en el ensamblaje normal. Puede usar el -fembed-bitcode o la opci贸n de compilaci贸n personalizada:

 BITCODE_GENERATION_MODE = bitcode 

Cree un binario para el dispositivo iOS gen茅rico o dispositivo conectado, como de costumbre. Parece que Bitcode no est谩 integrado en ensamblajes arm64e (por ejemplo, si tiene un dispositivo A12), por lo que puede desactivar la configuraci贸n de Xcode "compilar solo para arquitecturas activas" y compilarla directamente para arm64.

Usando la herramienta ebcutil, todos los objetos de Bitcode se recuperan f谩cilmente de un binario compilado.

 ebcutil -a arm64 -e path/to/MyApp.app/MyApp 

Luego recompile cada objeto Bitcode para Intel.

 for f in *; do clang -arch x86_64 -c -Xclang -disable-llvm-passes -emit-llvm -x ir -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk $f -o $fo; done 

Ahora vincularemos los blobs compilados nuevamente al archivo binario.

 clang -arch x86_64 -mios-version-min=12.0 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk *.o -o path/to/MyApp.app/MyApp 

Si funciona, 隆ahora tenemos la versi贸n x86 de la aplicaci贸n arm64 original! En teor铆a, se puede colocar directamente en la ventana del simulador de iOS, instalarlo y ejecutarlo.

Este es un hecho muy importante: puede transferir est谩ticamente archivos binarios entre plataformas Intel y ARM si incluyen Bitcode . 隆Realmente funciona!


Errores para proyectos m谩s complejos


Parece que ARC usa el ensamblador incorporado, por lo que para la transferencia de arm64 a x86 en este momento debe deshabilitar ARC.

Algunos tipos de bloques, como los controladores de finalizaci贸n, inician el compilador con instrucciones inaceptables. Si obtiene un error X87, este es probablemente el problema.

驴Por qu茅 es Objective-C? Bueno, Swift est谩 dise帽ado con ARC en mente. No creo que haya una manera de evitar el ensamblador en l铆nea mencionado anteriormente, por lo que la recompilaci贸n ahora fallar谩.
Vamos a dar un paso m谩s: usaremos mazap谩n para convertir esta aplicaci贸n Intel iOS en un programa para Mac que funcione con mazap谩n.



Fue facil!

Te贸ricamente, esto significa que Apple tiene una manera de ejecutar cualquier aplicaci贸n de iOS desde la App Store en una Mac, sin requerir que los desarrolladores actualicen o recompilen sus aplicaciones.


驴Qu茅 pasa si la Mac cambia de Intel a chips ARM? Bueno, como puede ver, con Bitcode, puede transferir todas las aplicaciones habilitadas para Bitcode a la Mac App Store sin la ayuda de los desarrolladores, por lo que estar谩 listo para cambiar el procesador desde el primer d铆a. Esto le da a Apple m谩s libertad. Ahora no necesita anunciar con anticipaci贸n la transici贸n a nuevos procesadores con un a帽o de anticipaci贸n, y ya no se necesita tecnolog铆a como Rosetta.

Obviamente, no hemos llegado a este punto: hoy Apple no incluye Bitcode para aplicaciones en la Mac App Store, y hoy Bitcode puede no ser ideal para dicha transferencia arquitect贸nica. En lugar de Apple, me enfocar铆a en estos dos factores y, por supuesto, habilitar铆a Bitcode para todas las aplicaciones de Mazap谩n en macOS 10.15.

Source: https://habr.com/ru/post/452734/


All Articles