Impacto de las opciones de compilation de Xcode "Activar código de bits" Sí / No

Ayer reconocí una tonelada de advertencias con respecto a la biblioteca de parse.com:

URGENTE: se eliminarán todos los bitcodes porque '[path] /Parse.framework/Parse (PFAnalytics.o)' se creó sin bitcode. Debe rebuildlo con el código de bits activado (configuration Xcode ENABLE_BITCODE), get una biblioteca actualizada del proveedor o inhabilitar el código de bits para este objective. 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á un impacto negativo en lo que respecta a la presentación de AppStore y / o el performance real de mi aplicación.

Xcode le informa sobre el código de bits

Activar esta configuration indica que el objective o proyecto debe generar bitcode durante la compilation para plataforms y architectures que lo soportan. Para comstackciones de file, se generará un código de bits en el binary vinculado para su envío a la tienda de aplicaciones. Para otras comstackciones, el comstackdor y el linker verificarán si el código cumple con los requisitos para la generación de código de bits, pero no generará el código de bits real. [ENABLE_BITCODE]

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

  • ¿Puedo usar la respuesta vinculada para sortear el problema sin impacto negativo y sin comprometer una futura presentación de AppStore?
  • ¿Qué hace realmente el ENABLE_BITCODE , será un requisito no opcional en el futuro?
  • ¿Hay algún impacto en el performance si lo habilito / lo deshabilito?

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

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

Cuando construyes tu proyecto, Xcode invoca el clang para objectives Objective-C y swiftc / swiftc para objectives Swift. Ambos comstackdores comstackn la aplicación en una representación intermedia (IR), uno de estos IR es bitcode. Desde este IR, un progtwig llamado LLVM toma el control y crea los binarys necesarios para los modos x86 de 32 y 64 bits (para el simulador) y arm6 / arm7 / arm7s / arm64 (para el dispositivo). Normalmente, todos estos binarys diferentes se agrupan en un único file llamado binary gordo .

La opción ENABLE_BITCODE corta este último paso. Crea una versión de la aplicación con un código bit de infrarrojos. Esto tiene una serie de características agradables, pero un inconveniente gigante: no puede ejecutarse en ningún lado. Para poder ejecutar una aplicación con un bitcode binary, el bitcode necesita ser recomstackdo ( tal vez ensamblado o transcodificado … No estoy seguro del verbo correcto ) en un binary x86 o ARM.

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

En este momento, las aplicaciones de código de bits son opcionales, pero la historia ha demostrado que Apple convierte los elementos opcionales en requisitos (como el soporte de 64 bits). Esto usualmente toma algunos años, por lo que los desarrolladores de terceros (como Parse) tienen time para actualizar.

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

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 App Store, estarás bien.

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

Nunca habrá impactos de performance negativos para habilitarlo, pero la distribución interna de una aplicación para realizar testings puede ser más complicada.

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

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

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

Asegúrese de seleccionar "Todos" para encontrar la configuration de compilation de códigos de bits:

Construir configuraciones

Bitcode es una nueva característica de iOS 9

Bitcode es una representación intermedia de un progtwig comstackdo. Las aplicaciones que subas a iTunes Connect que contengan bitcode se comstackrán y vincularán en App Store. Incluir bitcode le permitirá a Apple volver a optimizar su aplicación binaria 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 pnetworkingeterminado, pero opcional. Si proporciona bitcode, todas las aplicaciones y frameworks en el package de aplicaciones deben include bitcode. Para las aplicaciones de watchOS, se requiere bitcode

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

Bitcode hace que el reporte de fallas sea más difícil . Aquí hay una cita de HockeyApp (que también es cierto para cualquier otra solución de informes de fallos ):

Cuando se carga una aplicación en App Store y se deja activada la checkbox "Bitcode", Apple utilizará esa compilation de código de bits y la volverá a comstackr en su final antes de distribuirla a los dispositivos. Esto dará como resultado que el binary obtenga un nuevo UUID y hay una opción para download un dSYM correspondiente a través de Xcode.

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

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

introduzca la descripción de la imagen aquí

establecer "NO" funciona bien.

introduzca la descripción de la imagen aquí

De los documentos

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

Bitcode permitirá a Apple optimizar la aplicación sin tener que enviar otra compilation. Pero, solo puede habilitar esta function si todos los frameworks y aplicaciones en el package de la aplicación tienen esta function habilitada. Tenerlo ayuda, pero no tenerlo no debe 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 pnetworkingeterminado, pero opcional. Si proporciona bitcode, todas las aplicaciones y frameworks en el package de aplicaciones deben include bitcode. Para las aplicaciones watchOS, se requiere bitcode.

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

La App Store y el sistema operativo optimizan la installation de las aplicaciones iOS y watchOS al adaptar la entrega de la aplicación a las capacidades del dispositivo particular del usuario, con una huella mínima. Esta optimization, 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. Descargas más rápidas y más espacio para otras aplicaciones y contenido proporciona una mejor experiencia de usuario.

No debe haber ningún impacto en el desempeño.

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

Según Apple Doc Bitcode es una representación intermedia de un progtwig comstackdo. Las aplicaciones que subas a iTunes Connect que contengan bitcode se comstackrán y vincularán en la tienda. Incluir bitcode le permitirá a Apple volver a optimizar su aplicación binaria en el futuro sin la necesidad de enviar una nueva versión de su aplicación a la tienda.

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

Nota: para las aplicaciones de iOS, el código de bits es el pnetworkingeterminado, pero opcional. Para las aplicaciones watchOS y tvOS, se requiere bitcode. Si proporciona bitcode, todas las aplicaciones y frameworks en el package de aplicaciones (todos los objectives en el proyecto) deben include bitcode. Después de distribuir su aplicación con iTunes Connect, puede download el file dSYMs para la compilation, que se describe en Visualización e import de lockings en la window Dispositivos

El lanzamiento inicial de Apple del service de networkingucción de bits y códigos de bits se puso en espera, ya que las cuestiones relacionadas con la actualización de un tipo de hardware a otro tipo de hardware no restauraron las versiones correctas de los files binarys. Posteriormente, este problema se solucionó con iOS 9.0.2 y la function se volvió a habilitar.

Bitcode siempre ha sido parte de las fases de compilation y optimization de LLVM, pero al mover la lógica de back-end a los serveres de Apple, mueve las fases de optimization y ensamblaje desde el time de compilation de desarrolladores hasta la implementación de App Store. Esto desbloquea el potencial de una futura optimization o re-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 deployments de watchOS y tvOS, y pueden habilitarse condicionalmente para implementaciones de iOS existentes con la opción "Activar código de bits" en la configuration del proyecto. Esto agregará un marcador embed-bitcode-marker para las comstackciones de debugging, y embed-bitcode para las comstackciones de files / dispositivos. Estos pueden pasarse al comstackdor Swift con -embed-bitcode o mediante el uso de clang con -fembed-bitcode.

Bitcode también tiene algunas desventajas. Los desarrolladores pueden depurar los informes de fallos de las aplicaciones almacenando copys de los símbolos de debugging correspondientes al binary que se envió a Apple. Cuando ocurre un locking en una stack determinada, el desarrollador puede restaurar la traza de stack original al simbolizar el informe de locking, utilizando estos símbolos de debugging. Sin embargo, los símbolos son un subproducto de traducir la forma intermedia al binary; pero si ese paso se realiza en el server, esta información se pierde. Apple proporciona un service de informes de fallas que puede ser parte del depurador, siempre que el desarrollador haya cargado los símbolos de debugging en el momento de la publicación de la aplicación. El hecho de que el desarrollador nunca vea el binary exacto significa que es posible que no puedan probar problemas específicos a medida que evoluciona el nuevo hardware. También hay algunas preocupaciones acerca de la posibilidad de ceder poder a Apple para realizar la compilation, incluida la posibilidad de inyectar rutinas adicionales o fragments de código, pero dado que Apple tiene el control total del process de publicación, actualmente es posible que el desarrollador use bitmaps o binarys comstackdos .

Finalmente, el bitcode en el server se puede traducir para admitir nuevas architectures y sets de instrucciones a medida que evolucionan. Siempre que mantengan la convención de llamada y el tamaño de la alignment y las palabras, una aplicación de código de bits podría traducirse a diferentes types de architecture y optimizarse específicamente para un nuevo procesador. Si se utilizan bibliotecas estándar para matemáticas y rutinas vectoriales, éstas se pueden optimizar en instrucciones de vectores específicos del procesador para get el mejor performance para una aplicación determinada. Los optimizadores incluso pueden generar múltiples codificaciones diferentes y juzgar según el tamaño o la velocidad de ejecución.

Para más información, marque aquí y aquí