Tengo un problema con el término de código de bits incrustado.
¿Qué es el código de bits incrustado?
¿Cuándo habilitar, ENABLE_BITCODE
en el nuevo Xcode?
¿Qué le sucede al binario cuando está habilitado, ENABLE_BITCODE
en Xcode 7?
Bitcode se refiere al tipo de código: "LLVM Bitcode" que se envía a iTunes Connect. Esto le permite a Apple usar ciertos cálculos para volver a optimizar las aplicaciones (por ejemplo: posiblemente reducir el tamaño de los archivos ejecutables). Si Apple necesita alterar su ejecutable, puede hacerlo sin que se cargue una nueva compilación.
Esto difiere de: Slicing, que es el proceso de Apple para optimizar su aplicación para el dispositivo de un usuario en función de la resolución y la arquitectura del dispositivo. Rebanar no requiere Bitcode. (Ej: solo incluye imágenes @ 2x en un 5s)
App Thinning es la combinación de corte, código de bits y recursos a pedido
Bitcode es una representación intermedia de un programa compilado. Las aplicaciones que cargue en iTunes Connect que contengan código de bits se compilarán y vincularán en la App Store. La inclusión de código de bits permitirá a Apple volver a optimizar el binario de su aplicación en el futuro sin la necesidad de enviar una nueva versión de su aplicación a la tienda.
¿Qué es el código de bits incrustado?
Según los documentos :
Actualización: esta frase en "Nuevas características en Xcode 7" me hizo pensar durante mucho tiempo que Bitcode es necesario para cortar para reducir el tamaño de la aplicación:
Sin embargo eso no es verdad, código binario y rebanar trabajo de forma independiente: rebanar se trata de reducir el tamaño de aplicación y la generación de paquete de aplicación variantes, y código binario es acerca de ciertas optimizaciones binarios. He verificado esto comprobando las arquitecturas incluidas en los ejecutables de aplicaciones que no son de código de bits y descubriendo que solo incluyen las necesarias.
Bitcode permite que otro componente de reducción de aplicaciones llamado Slicing genere variantes de paquetes de aplicaciones con ejecutables particulares para arquitecturas particulares, por ejemplo, la variante de iPhone 5S incluirá solo el ejecutable arm64, iPad Mini armv7, etc.¿Cuándo habilitar ENABLE_BITCODE en el nuevo Xcode?
¿Qué le sucede al binario cuando ENABLE_BITCODE está habilitado en el nuevo Xcode?
De la referencia Xcode 7:
Aquí hay un par de enlaces que ayudarán a una comprensión más profunda de Bitcode :
fuente
Dado que la pregunta exacta es "¿qué hace el código de bits habilitado", me gustaría dar algunos detalles técnicos que he descubierto hasta ahora. La mayor parte de esto es prácticamente imposible de entender con 100% de certeza hasta que Apple publique el código fuente de este compilador
Primero, el código de bits de Apple no parece ser lo mismo que el código de bytes LLVM. Al menos, no he podido encontrar ningún parecido entre ellos. Parece tener un encabezado propietario (siempre comienza con "xar!") Y probablemente algo de magia de referencia de tiempo de enlace que evita las duplicaciones de datos. Si escribe una cadena codificada, esta cadena solo se colocará en los datos una vez, en lugar de dos veces como se esperaría si fuera un código de bytes LLVM normal.
En segundo lugar, el código de bits no se envía realmente en el archivo binario como una arquitectura separada como podría esperarse. No se envía de la misma manera que digamos x86 y ARM se colocan en un binario (archivo FAT). En su lugar, usan una sección especial en el binario MachO específico de la arquitectura llamada "__LLVM" que se envía con cada arquitectura compatible (es decir, duplicada). Supongo que esto es un inconveniente con su sistema de compilación y puede corregirse en el futuro para evitar la duplicación.
Código C (compilado con
clang -fembed-bitcode hi.c -S -emit-llvm
):Salida IR LLVM:
La matriz de datos que está en el IR también cambia según la optimización y otras configuraciones de generación de código de clang. Es completamente desconocido para mí en qué formato o cualquier cosa está esto.
EDITAR:
Siguiendo la pista en Twitter, decidí volver a visitar esto y confirmarlo. Seguí esta publicación de blog y usé su herramienta de extracción de código de bits para sacar el archivo binario de Apple Archive del ejecutable de MachO. Y después de extraer Apple Archive con la utilidad xar, obtuve esto (convertido a texto con llvm-dis, por supuesto)
La única diferencia notable realmente entre el IR sin código de bits y el IR con código de bits es que los nombres de archivo se han eliminado a solo 1, 2, etc. para cada arquitectura.
También confirmó que el código de bits incrustado en un binario se genera después de las optimizaciones. Si compila con -O3 y extrae el código de bits, será diferente de si compila con -O0.
Y solo para obtener crédito adicional, también confirmó que Apple no envía código de bits a los dispositivos cuando descarga una aplicación iOS 9. Incluyen una serie de otras secciones extrañas que no reconocí como __LINKEDIT, pero no incluyen el paquete __LLVM .__ y, por lo tanto, no parecen incluir código de bits en el binario final que se ejecuta en un dispositivo. Por extraño que parezca, Apple todavía envía binarios gordos con código separado de 32/64 bits a dispositivos iOS 8.
fuente
xar!
es el formato de archivo de Apple.Básicamente, este concepto es algo similar a Java, donde el código de bytes se ejecuta en diferentes JVM y, en este caso, el código de bits se coloca en la tienda iTune y, en lugar de proporcionar el código intermedio a diferentes plataformas (dispositivos), proporciona el código compilado que no necesita cualquier máquina virtual para ejecutar.
Por lo tanto, necesitamos crear el código de bits una vez y estará disponible para dispositivos existentes o futuros. Es el dolor de cabeza de Apple compilar y hacer que sea compatible con cada plataforma que tengan.
Los desarrolladores no tienen que hacer cambios y enviar la aplicación nuevamente para admitir nuevas plataformas.
Tomemos el ejemplo del iPhone 5s cuando Apple introdujo el
x64
chip en él. Aunque lasx86
aplicaciones eran totalmente compatibles con lax64
arquitectura, pero para utilizar completamente lax64
plataforma, el desarrollador tiene que cambiar la arquitectura o algún código. Una vez que haya terminado, la aplicación se envía a la tienda de aplicaciones para su revisión.Si este concepto de código de bits se lanzó anteriormente, entonces los desarrolladores no tenemos que hacer ningún cambio para admitir la
x64
arquitectura de bits.fuente
Actualizar
Apple ha aclarado que el corte se produce independientemente de habilitar el código de bits. También he observado esto en la práctica, donde una aplicación sin código de bits solo se descargará como la arquitectura adecuada para el dispositivo de destino.
Original
Más específicamente :
La forma en que leí esto, si admite código de bits, los descargadores de su aplicación solo obtendrán la arquitectura compilada necesaria para su propio dispositivo.
fuente