ios - Impacto de las opciones de compilación de Xcode "Habilitar código de bits" Sí/No
parse.com parse-platform (7)
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 realmente el
ENABLE_BITCODE
¿Será un requisito no opcional en el futuro? - ¿Hay algún impacto en el rendimiento si lo habilito / deshabilito?
- ¿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 construyes tu proyecto, Xcode invoca
clang
para objetivos Objective-C y
swift
/
swiftc
para 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 toma el control y crea los archivos 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 paso final 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 el 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 un envío futuro 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 en 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.
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 puede leerlos. 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
La implementación inicial de Apple del código de bits y el servicio de adelgazamiento de aplicaciones se suspendió, porque los problemas al actualizar 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 libera el potencial de una futura re-optimización o re-traducción para soportar 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 de la pila original 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. También hay algunas preocupaciones acerca de ceder el poder a Apple para realizar la compilación, incluida la capacidad de inyectar rutinas adicionales o fragmentos de código, pero dado que Apple tiene el control total del proceso de publicación, esto es posible actualmente si el desarrollador usa o no código de bits o archivos binarios compilados .
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.
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.
De los docs
- ¿Puedo usar el método anterior sin ningún impacto negativo y sin comprometer un envío futuro 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 frameworks 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 permiten 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.
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 HockeyApp ):
Al cargar una aplicación en la App Store y dejar activada la casilla de verificación "Bitcode", Apple usará 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