Impacto de las opciones de compilación de Xcode "Habilitar código de bits" Sí / No

239

Ayer reconocí un montón de advertencias con respecto a la biblioteca parse.com:

URGENTE: todo el código de bits se eliminará porque '[ruta] /Parse.framework/Parse (PFAnalytics.o)' se creó sin código de bits. Debe reconstruirlo con el código de bits habilitado (configuración de Xcode ENABLE_BITCODE), obtener una biblioteca actualizada del proveedor o deshabilitar el código de bits para este objetivo. Nota: Esto será un error en el futuro.

Soy consciente del hecho de que puedo eliminar esas advertencias con esta respuesta, pero ahora me pregunto si tendrá algún impacto negativo con respecto al envío de AppStore y / o el rendimiento real de mi aplicación.

Xcode le informa sobre el código de bits

La activación de esta configuración indica que el destino o proyecto debe generar código de bits durante la compilación para plataformas y arquitecturas que lo soportan. Para las compilaciones de archivo, el código de bits se generará en el binario vinculado para enviarlo a la tienda de aplicaciones. Para otras compilaciones, el compilador y el enlazador comprobarán si el código cumple con los requisitos para la generación de código de bits, pero no generará un código de bits real. [ENABLE_BITCODE]

Pero no obtengo ninguna información realmente útil de este texto.

  • ¿Puedo usar la respuesta vinculada para eludir el problema sin ningún impacto negativo y sin comprometer un envío futuro a la AppStore?
  • ¿Qué hace ENABLE_BITCODErealmente? ¿Será un requisito no opcional en el futuro?
  • ¿Hay algún impacto en el rendimiento si lo habilito / deshabilito?
luk2302
fuente

Respuestas:

399
  • ¿Qué hace realmente el ENABLE_BITCODE? ¿Será un requisito no opcional en el futuro?

No estoy seguro de en qué nivel está buscando una respuesta, así que hagamos un pequeño viaje. Algo de esto ya puede saber.

Cuando construye su proyecto, Xcode invoca clangpara objetivos Objective-C y swift/ swiftcpara objetivos Swift. Ambos compiladores compilan la aplicación en una representación intermedia (IR), uno de estos IR es el código de bits. A partir de este IR, un programa llamado LLVM se hace cargo y crea los binarios necesarios para los modos x86 de 32 y 64 bits (para el simulador) y arm6 / arm7 / arm7s / arm64 (para el dispositivo). Normalmente, todos estos binarios diferentes se agrupan en un solo archivo llamado binario gordo .

La opción ENABLE_BITCODE corta este último paso. Crea una versión de la aplicación con un código de bits binario IR. Esto tiene una serie de características agradables, pero un inconveniente gigante: no puede ejecutarse en ningún lado. Para que se ejecute una aplicación con un binario de código de bits, el código de bits necesita ser recompilado ( tal vez ensamblado o transcodificado ... No estoy seguro del verbo correcto ) en un binario x86 o ARM.

Cuando se envía una aplicación de código de bits a la App Store, Apple realizará este último paso y creará los archivos binarios terminados.

En este momento, las aplicaciones de código de bits son opcionales, pero el historial ha demostrado que Apple convierte las cosas opcionales en requisitos (como soporte de 64 bits). Esto generalmente lleva algunos años, por lo que los desarrolladores de terceros (como Parse) tienen tiempo para actualizar.

  • ¿Puedo usar el método anterior sin ningún impacto negativo y sin comprometer una presentación futura de la tienda de aplicaciones?

Sí, puede desactivar ENABLE_BITCODE y todo funcionará igual que antes. Hasta que Apple haga que las aplicaciones de código de bits sean un requisito para la App Store, estará bien.

  • ¿Hay algún impacto en el rendimiento si lo habilito / deshabilito?

Nunca habrá impactos negativos en el rendimiento para habilitarlo, pero la distribución interna de una aplicación para pruebas puede ser más complicada.

En cuanto a los impactos positivos ... bueno, eso es complicado.

Para su distribución en la App Store, Apple creará versiones separadas de su aplicación para cada arquitectura de máquina (arm6 / arm7 / arm7s / arm64) en lugar de una aplicación con un binario gordo. Esto significa que la aplicación instalada en dispositivos iOS será más pequeña.

Además, cuando se recompila el código de bits ( tal vez ensamblado o transcodificado ... de nuevo, no estoy seguro del verbo correcto ), se optimiza. LLVM siempre está trabajando para crear nuevas optimizaciones mejores. En teoría, la App Store podría recrear la versión separada de la aplicación en la App Store con cada nueva versión de LLVM, por lo que su aplicación podría volver a optimizarse con la última tecnología LLVM.

Jeffery Thomas
fuente
19
"Apple creará versiones separadas de su aplicación para cada arquitectura de máquina (arm6 / arm7 / arm7s / arm64) en lugar de una aplicación con un binario gordo. Esto significa que la aplicación instalada en dispositivos iOS será más pequeña". Eso es lo que hace Slicing. Esto no está relacionado con Bitcode.
user102008
10
"La opción ENABLE_BITCODE elimina este paso final". No corta ningún paso. Todos los binarios de arquitectura todavía se producen. Luego, se agrega MÁS información de código de bits para CADA arquitectura. Ver stackoverflow.com/a/31030741/102008
user102008
66
Consulte developer.apple.com/library/prerelease/watchos/documentation/… "La división es el proceso de creación y entrega de variantes del paquete de aplicaciones para diferentes dispositivos de destino. Una variante contiene solo la arquitectura ejecutable y los recursos necesarios para el objetivo dispositivo."
user102008
77
No es una afirmación verdadera que habilitar Bitcode hará que la aplicación instalada en el dispositivo sea más pequeña en comparación con cuando Bitcode está desactivado. En ninguna parte dice eso.
user102008
77
@ onmyway133 No todos los proveedores proporcionan la fuente. Si todo lo que proporciona el proveedor es una lib estática y archivos de encabezado (o un Framework), entonces el proveedor necesita tener sus cosas compiladas con el código de bit habilitado.
Jeffery Thomas
65

Asegúrese de seleccionar "Todos" para encontrar la configuración de creación de código de bits de habilitación:

Configuración de compilación

Punto gamma
fuente
35

Bitcode es una nueva característica de iOS 9

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.

Nota: Para las aplicaciones de iOS, el código de bits es el predeterminado, pero opcional. Si proporciona código de bits, todas las aplicaciones y marcos en el paquete de aplicaciones deben incluir código de bits. Para las aplicaciones watchOS, se requiere un código de bits

Por lo tanto, debe deshabilitar el código de bits hasta que todos los marcos de su aplicación tengan habilitado el código de bits.

agy
fuente
'Re-optimice su aplicación binaria en el futuro', ¿puede explicar un poco más?
genaks
Aquí dice que: "Bitcode es una nueva característica de iOS 9" y que "[...] para las aplicaciones watchOS, se requiere bitcode [...]". Entonces, ¿qué pasa si me gustaría crear una aplicación WatchOS en iOS 8?
superpuccio
33

Bitcode hace que los informes de fallas sean más difíciles . Aquí hay una cita de HockeyApp (que también es válida para cualquier otra solución de informe de fallas ):

Al cargar una aplicación en la App Store y dejar activada la casilla de verificación "Bitcode", Apple utilizará esa compilación de Bitcode y la volverá a compilar antes de distribuirla a los dispositivos. Esto dará como resultado que el binario obtenga un nuevo UUID y haya una opción para descargar un dSYM correspondiente a través de Xcode.

Nota: la respuesta se editó en enero de 2016 para reflejar los cambios más recientes

Alexander Vasenin
fuente
2
Entre septiembre y diciembre, esto se arregló a través de la nueva opción de exportación de Xcode Organizer (vea la actualización en el tutorial de HA citado) y se rompió nuevamente (vea mi pregunta resuelta de HA )
Pavel Zdenek
13

@ vj9 thx. Actualizo a xcode 7. Me muestra el mismo error. Construir bien después de establecer "NO"

ingrese la descripción de la imagen aquí

establecer "NO" funciona bien.

ingrese la descripción de la imagen aquí

zszen
fuente
1
@Septronic Si desea seleccionar SÍ. Debe verificar que su tercer marco sea compatible con esto.
zszen
Su versión mínima de iOS compatible con objetivos debe ser iOS 6 o superior.
shallowThought
9

Aquí puede encontrar toda la solución con respecto a Bitcode

Según Apple Doc

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 tienda. 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.

Xcode oculta los símbolos generados durante el tiempo de construcción de forma predeterminada, por lo que Apple no los puede leer. Solo si elige incluir símbolos al cargar su aplicación en iTunes Connect, los símbolos se enviarán a Apple. Debe incluir símbolos para recibir informes de fallas de Apple.

Nota: Para las aplicaciones de iOS, el código de bits es el predeterminado, pero opcional. Para las aplicaciones watchOS y tvOS, se requiere un código de bits. Si proporciona código de bits, todas las aplicaciones y marcos en el paquete de aplicaciones (todos los objetivos en el proyecto) deben incluir código de bits. Después de distribuir su aplicación usando iTunes Connect, puede descargar el archivo dSYMs para la compilación, que se describe en Visualización e importación de bloqueos en la ventana Dispositivos

El lanzamiento inicial de Apple del código de bits y el servicio de adelgazamiento de aplicaciones se suspendió, porque los problemas en la actualización de un tipo de hardware a otro tipo de hardware no restauraron las versiones correctas de los archivos binarios. Este problema se solucionó posteriormente con iOS 9.0.2 y la función se volvió a habilitar.

Bitcode siempre ha sido parte de las fases de compilación y optimización de LLVM, pero al mover la lógica de back-end a los servidores de Apple, mueve las fases de optimización y ensamblaje desde el tiempo de compilación del desarrollador hasta la implementación de la tienda de aplicaciones. Esto desbloquea el potencial de una futura re-optimización o nueva traducción para admitir procesadores más nuevos y más rápidos en el futuro. Las implementaciones de código de bits son necesarias para los dispositivos watchOS y tvOS, y se pueden habilitar condicionalmente para implementaciones de iOS existentes con la opción "Activar código de bits" en la configuración del proyecto. Esto agregará un marcador embed-bitcode-marker para compilaciones de depuración y embed-bitcode para compilaciones de archivo / dispositivo. Estos pueden pasarse al compilador Swift con -embed-bitcode o usando clang con -fembed-bitcode.

Bitcode también tiene algunas desventajas.Los desarrolladores pueden depurar informes de fallas de las aplicaciones almacenando copias de los símbolos de depuración correspondientes al binario que se envió a Apple. Cuando ocurre un bloqueo en una pila determinada, el desarrollador puede restaurar el seguimiento original de la pila simbolizando el informe del bloqueo, utilizando estos símbolos de depuración. Sin embargo, los símbolos son un subproducto de traducir la forma intermedia al binario; pero si ese paso se realiza en el servidor, esta información se pierde. Apple proporciona un servicio de informe de fallos que puede desempeñar el papel del depurador, siempre que el desarrollador haya cargado los símbolos de depuración en el momento de la publicación de la aplicación. El hecho de que el desarrollador nunca vea el binario exacto significa que es posible que no pueda probar problemas específicos a medida que evoluciona el nuevo hardware.

Finalmente, el código de bits en el servidor se puede traducir para admitir nuevas arquitecturas y conjuntos de instrucciones a medida que evolucionan. Siempre que mantengan la convención de llamadas y el tamaño de la alineación y las palabras, una aplicación de código de bits podría traducirse a diferentes tipos de arquitectura y optimizarse específicamente para un nuevo procesador. Si se utilizan bibliotecas estándar para rutinas matemáticas y vectoriales, estas pueden optimizarse en instrucciones vectoriales específicas del procesador para obtener el mejor rendimiento para una aplicación determinada. Los optimizadores pueden incluso generar múltiples codificaciones diferentes y juzgar según el tamaño o la velocidad de ejecución.

Para obtener más información, consulte aquí y aquí

Rex
fuente
6

De los documentos

  • ¿Puedo usar el método anterior sin ningún impacto negativo y sin comprometer una presentación futura de la tienda de aplicaciones?

Bitcode permitirá a Apple optimizar la aplicación sin que tenga que enviar otra compilación. Pero, solo puede habilitar esta función si todos los marcos y aplicaciones en el paquete de aplicaciones tienen esta función habilitada. Tenerlo ayuda, pero no tenerlo no debería tener ningún impacto negativo.

  • ¿Qué hace realmente el ENABLE_BITCODE? ¿Será un requisito no opcional en el futuro?

Para las aplicaciones de iOS, el código de bits es el predeterminado, pero opcional. Si proporciona código de bits, todas las aplicaciones y marcos en el paquete de aplicaciones deben incluir código de bits. Para las aplicaciones watchOS, se requiere un código de bits.

  • ¿Hay algún impacto en el rendimiento si lo habilito / deshabilito?

La tienda de aplicaciones y el sistema operativo optimizan la instalación de aplicaciones iOS y watchOS al adaptar la entrega de aplicaciones a las capacidades del dispositivo particular del usuario, con una huella mínima. Esta optimización, llamada adelgazamiento de aplicaciones, le permite crear aplicaciones que utilizan la mayoría de las funciones del dispositivo, ocupan un espacio mínimo en el disco y se adaptan a futuras actualizaciones que Apple puede aplicar. Las descargas más rápidas y más espacio para otras aplicaciones y contenido proporcionan una mejor experiencia de usuario.

No debería haber ningún impacto en el rendimiento.

vj9
fuente