Bitcode es una representación intermedia de un programa en la etapa de compilación de una aplicación iOS. A diferencia del código máquina, Bitcode no está vinculado a una arquitectura de procesador específica. Según Apple Developer Documentation, la App Store puede recompilar Bitcode para la arquitectura de destino, mejorando el rendimiento y reduciendo el tamaño del archivo de instalación. El desarrollador envía Bitcode a la App Store, y la tienda misma genera un archivo binario optimizado para cada tipo de dispositivo.
Puntos Clave
Bitcode es una representación intermedia de un programa (Intermediate Representation, IR) generada por la infraestructura del compilador LLVM. Apple introdujo el soporte de Bitcode a partir de Xcode 7 e iOS 9 como un requisito obligatorio para aplicaciones watchOS y opcional para iOS y tvOS. A partir de Xcode 14, el requisito se eliminó para todas las plataformas excepto watchOS.
El concepto de representación intermedia de código existe desde la década de 2000 como parte del proyecto LLVM, fundado por Chris Lattner en la Universidad de Illinois. Apple adaptó LLVM para Xcode en 2011, y en 2015 presentó Bitcode como una forma de actualizar aplicaciones sin necesidad de volver a enviarlas a la App Store. La tecnología fue anunciada en la WWDC 2015 en la sesión «What's New in Xcode».
El código máquina consiste en instrucciones binarias para un procesador específico: arm64, armv7 o x86_64. Bitcode se almacena en un formato independiente del hardware, lo que permite a la App Store generar archivos binarios optimizados para diferentes arquitecturas a partir de una única representación fuente. Esta diferencia clave define todas las ventajas de la tecnología.
| Característica | Bitcode | Código Máquina |
|---|---|---|
| Dependencia de arquitectura | Independiente | Vinculado a la CPU |
| Tamaño del archivo binario | Compacto | Mayor |
| Capacidad de recompilación | Sí | No |
| Soporte de App Store | Se recompila | Se usa tal cual |
| Depuración | Limitada | Soporte completo |
Bitcode no es un archivo ejecutable. Es LLVM IR en formato binario que el desarrollador envía a la App Store junto con los metadatos del proyecto. La tienda de aplicaciones ejecuta el proceso de recompilación, adaptando el código para cada plataforma de destino y versión del sistema operativo.
El proceso de generación de Bitcode comienza con el frontend del compilador, que convierte el código fuente Swift u Objective-C en LLVM IR. En la etapa de enlace, Xcode empaqueta el IR en archivos de formato .bc (Bitcode), que luego se envían a la App Store junto con el archivo .xcarchive. La App Store, a su vez, ejecuta el proceso de recompilación en su lado.
La infraestructura de LLVM consta de tres partes: el frontend (Clang para C/ObjC, Swift Frontend para Swift), el optimizador Middle-End y el backend (generador de código máquina). Bitcode es el resultado de las dos primeras etapas sin pasar a la generación de instrucciones de ensamblador. Middle-End realiza optimizaciones independientes de la plataforma: eliminación de código muerto, inlining y plegado de constantes.
// Ejemplo de código fuente Swift
func calculateSum(a: Int, b: Int) -> Int {
return a + b
}
// LLVM IR después de la compilación (simplificado)
; define i32 @calculateSum(i32 %a, i32 %b)
; %result = add i32 %a, %b
; ret i32 %result
Después de la generación de IR, el compilador realiza una serie de optimizaciones a nivel de representación: eliminación de código muerto, inlining de funciones y plegado de constantes. Estas optimizaciones son independientes de la arquitectura y se conservan en Bitcode. Durante la recompilación en la App Store, se añaden optimizaciones dependientes de la arquitectura, como la reordenación de instrucciones para un procesador específico.
App Store Connect recibe el archivo con Bitcode y ejecuta su propia infraestructura de compilación. El sistema determina la arquitectura de destino del dispositivo del usuario y genera código máquina, optimizándolo adicionalmente para las características específicas del procesador. Para arm64e (procesadores A12+ y serie M), se aplican optimizaciones de seguridad adicionales.
Este proceso se llama App Thinning — una tecnología que entrega solo los recursos y el código necesarios para la arquitectura de un dispositivo a ese dispositivo. Un usuario con un iPhone con procesador A17 Pro recibe un archivo binario optimizado para arm64e, sin instrucciones innecesarias para arquitecturas antiguas. Esto reduce el tiempo de descarga y ahorra espacio en el dispositivo.
Bitcode proporciona varias ventajas clave para los desarrolladores de aplicaciones iOS. La principal es la optimización automática para nuevos procesadores de Apple sin necesidad de volver a enviar una actualización a la App Store. Esto es especialmente relevante al hacer la transición a nuevas arquitecturas, como el cambio de armv7 a arm64.
Cuando Apple lanza un procesador con una nueva arquitectura, las aplicaciones enviadas con Bitcode se recompilan automáticamente para él. El desarrollador no necesita reconstruir el proyecto ni publicar una actualización — la App Store lo hace en su lado cuando el usuario lo descarga por primera vez. Esto es particularmente importante para aplicaciones de larga duración que se mantienen durante años.
App Thinning combinado con Bitcode puede reducir el tamaño de la aplicación instalada entre un 15 y un 40%. La App Store genera solo las instrucciones de máquina necesarias para un dispositivo específico, eliminando el código para otras arquitecturas y variaciones para diferentes versiones de iOS. En la práctica, esto significa que un usuario con un nuevo iPhone obtiene un archivo binario compacto.
Según Apple WWDC 2015 Session 102, el uso de Bitcode y App Thinning puede reducir el tamaño de la aplicación descargada en un promedio del 25% en comparación con un archivo binario universal que contiene todas las arquitecturas. Para una aplicación de 100 MB, el ahorro puede ser de hasta 40 MB en el dispositivo del usuario.
La configuración de Bitcode se realiza en la configuración de compilación de Xcode. El parámetro Enable Bitcode se encuentra en la configuración de Build Settings y está activado por defecto para nuevos proyectos, pero los desarrolladores pueden desactivarlo para depuración o al usar bibliotecas de terceros sin soporte de Bitcode.
// Build Settings -> Apple Clang - Code Generation
// Enable Bitcode = YES
// O a través de Info.plist para objetivos individuales
@property (nonatomic, assign) BOOL enableBitcode;
- (void)configureBuildSettings {
// Verificación del estado de Bitcode en la configuración
if (self.enableBitcode) {
NSLog(@"Bitcode is enabled for this target");
} else {
NSLog(@"Bitcode is disabled");
}
}
Para verificar si el archivo contiene Bitcode, abra el archivo .xcarchive a través de Xcode Organizer o ejecute el comando otool -l en la Terminal. La presencia de una sección __LLVM en el archivo binario confirma que Bitcode está activado y empaquetado correctamente. Si la sección falta, Bitcode no se generó durante la compilación.
# Verificación de presencia de Bitcode en el archivo
otool -l YourApp.app/YourApp | grep __LLVM
# Salida: si hay una sección __LLVM — Bitcode está presente
# Si la salida está vacía — Bitcode no está activado o no se generó
# También puede verificar usando el comando size
size -m -l YourApp.app/YourApp | grep __LLVM
Al usar bibliotecas de terceros a través de CocoaPods o SPM, asegúrese de que todas las dependencias estén compiladas con Bitcode. Si al menos una biblioteca no admite Bitcode, Xcode generará un error de enlace durante el archivado. Para CocoaPods, verifique el indicador bitcode_enabled en las subespecificaciones o use use_frameworks! con enable_bitcode.
Bitcode no es una solución universal para todos los tipos de proyectos iOS. La tecnología tiene limitaciones que el desarrollador debe considerar antes de activar la opción en la configuración de compilación. Comprender estas limitaciones ayuda a evitar problemas durante el archivado y la publicación.
No todas las bibliotecas de terceros incluyen soporte para Bitcode. Si una biblioteca se distribuye solo como un archivo binario compilado sin Bitcode, un proyecto con la opción activada no se compilará. En este caso, el desarrollador tendrá que desactivar Bitcode o solicitar al proveedor una versión con Bitcode. Esto es especialmente relevante para bibliotecas antiguas que ya no se actualizan.
Los informes de fallos de aplicaciones compiladas con Bitcode requieren procesamiento adicional. Los símbolos (dSYM) para el código recompilado son generados por la App Store y están disponibles para descargar a través de Xcode Organizer. Sin cargar los archivos dSYM correspondientes, la pila de llamadas en los informes de fallos será ilegible, lo que dificulta el diagnóstico de problemas.
A partir de iOS 17 y Xcode 15, Apple no exige la activación obligatoria de Bitcode para publicar en la App Store. Sin embargo, para aplicaciones watchOS, Bitcode sigue siendo un requisito obligatorio establecido a nivel de política de App Store Connect. Se recomienda a los desarrolladores activar Bitcode para nuevos proyectos si todas las dependencias lo admiten.
Preguntas Frecuentes
Para aplicaciones iOS y tvOS, Bitcode no es obligatorio a partir de Xcode 14. Para watchOS, el soporte de Bitcode sigue siendo obligatorio. Apple recomienda activar Bitcode para nuevos proyectos, pero no bloquea la publicación sin él.
Bitcode permite a la App Store aplicar App Thinning — generar código máquina solo para la arquitectura del dispositivo del usuario. Esto reduce el tamaño del archivo binario descargado entre un 15 y un 40% dependiendo del número de arquitecturas compatibles en el proyecto.
Sí, los archivos dSYM son necesarios para simbolizar informes de fallos de archivos binarios recompilados. La App Store proporciona la posibilidad de descargar dSYM a través de Xcode Organizer después de procesar el archivo. Sin ellos, la pila de llamadas en Crashlytics y la consola contendrá solo direcciones de memoria.
SPM admite Bitcode si las dependencias se distribuyen en código fuente en lugar de como archivos binarios. Las dependencias binarias a través de SPM deben proporcionar una versión con Bitcode, de lo contrario un proyecto con la opción activada no se compilará.
Bitcode es una representación intermedia LLVM IR independiente del hardware que no puede ser ejecutada directamente por un procesador. El código máquina contiene instrucciones listas para una arquitectura específica (arm64, x86_64) y se ejecuta sin compilación adicional.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también