Impact des options de construction de Xcode «Activer le bitcode» Oui / Non

239

Hier, j'ai reconnu une tonne d'avertissements concernant la bibliothèque parse.com:

URGENT: tous les bitcode seront supprimés car «[chemin] /Parse.framework/Parse (PFAnalytics.o)» a été construit sans bitcode. Vous devez le reconstruire avec le code bit activé (paramètre Xcode ENABLE_BITCODE), obtenir une bibliothèque mise à jour auprès du fournisseur ou désactiver le code bit pour cette cible. Remarque: Ce sera une erreur à l'avenir.

Je suis conscient du fait que je peux supprimer ces avertissements avec cette réponse, mais je me demande maintenant si cela aura un impact négatif en ce qui concerne la soumission sur l'AppStore et / ou les performances réelles de mon application.

Xcode vous informe sur le bitcode

L'activation de ce paramètre indique que la cible ou le projet doit générer un bitcode lors de la compilation pour les plates-formes et architectures qui le prennent en charge. Pour les builds d'archives, le bitcode sera généré dans le binaire lié pour être soumis à l'App Store. Pour les autres builds, le compilateur et l'éditeur de liens vérifieront si le code est conforme aux exigences de génération de bitcode, mais ne générera pas de bitcode réel. [ENABLE_BITCODE]

Mais je ne tire aucune information vraiment utile de ce texte.

  • Puis-je utiliser la réponse liée pour contourner le problème sans aucun impact négatif et sans compromettre une future soumission AppStore?
  • Que fait ENABLE_BITCODEréellement, sera-ce une exigence non facultative à l'avenir?
  • Y a-t-il un impact sur les performances si je l'active / le désactive?
luk2302
la source

Réponses:

399
  • Que fait réellement ENABLE_BITCODE, sera-t-il une exigence non facultative à l'avenir?

Je ne sais pas à quel niveau vous cherchez une réponse, alors faisons un petit voyage. Vous le savez peut-être déjà en partie.

Lorsque vous générez votre projet, Xcode invoque clangpour les cibles Objective-C et swift/ swiftcpour les cibles Swift. Ces deux compilateurs compilent l'application en une représentation intermédiaire (IR), l'un de ces IR est le bitcode. À partir de cet IR, un programme appelé LLVM prend le relais et crée les fichiers binaires nécessaires pour les modes x86 32 et 64 bits (pour le simulateur) et arm6 / arm7 / arm7s / arm64 (pour le périphérique). Normalement, tous ces différents fichiers binaires sont regroupés dans un seul fichier appelé binaire gras .

L'option ENABLE_BITCODE supprime cette dernière étape. Il crée une version de l'application avec un binaire IR bitcode. Cela a un certain nombre de fonctionnalités intéressantes, mais un inconvénient géant: il ne peut fonctionner nulle part. Pour exécuter une application avec un binaire bitcode, le bitcode doit être recompilé ( peut-être assemblé ou transcodé… je ne suis pas sûr du verbe correct ) dans un binaire x86 ou ARM.

Lorsqu'une application bitcode est soumise à l'App Store, Apple effectue cette dernière étape et crée les fichiers binaires finis.

À l'heure actuelle, les applications bitcode sont facultatives, mais l'histoire a montré qu'Apple transforme les choses facultatives en exigences (comme la prise en charge 64 bits). Cela prend généralement quelques années, donc les développeurs tiers (comme Parse) ont le temps de mettre à jour.

  • puis-je utiliser la méthode ci-dessus sans aucun impact négatif et sans compromettre une future soumission d'appstore?

Oui, vous pouvez désactiver ENABLE_BITCODE et tout fonctionnera comme avant. Jusqu'à ce qu'Apple fasse des applications bitcode une exigence pour l'App Store, tout ira bien.

  • Y a-t-il un impact sur les performances si je l'active / le désactive?

Il n'y aura jamais d'impact négatif sur les performances pour l'activer, mais la distribution interne d'une application pour les tests peut devenir plus compliquée.

Quant aux impacts positifs… eh bien c'est compliqué.

Pour distribution dans l'App Store, Apple créera des versions distinctes de votre application pour chaque architecture de machine (arm6 / arm7 / arm7s / arm64) au lieu d'une application avec un gros binaire. Cela signifie que l'application installée sur les appareils iOS sera plus petite.

De plus, lorsque le bitcode est recompilé ( peut-être assemblé ou transcodé… encore une fois, je ne suis pas sûr du verbe correct ), il est optimisé. LLVM travaille toujours sur la création de nouvelles optimisations optimales. En théorie, l'App Store pourrait recréer la version distincte de l'application dans l'App Store avec chaque nouvelle version de LLVM, afin que votre application puisse être réoptimisée avec la dernière technologie LLVM.

Jeffery Thomas
la source
19
"Apple créera des versions distinctes de votre application pour chaque architecture de machine (arm6 / arm7 / arm7s / arm64) au lieu d'une application avec un gros binaire. Cela signifie que l'application installée sur les appareils iOS sera plus petite." C'est ce que fait Slicing. Ceci n'est pas lié au Bitcode.
user102008
10
"L'option ENABLE_BITCODE supprime cette dernière étape." Cela ne coupe aucune étape. Tous les binaires d'architecture sont toujours produits. Des informations de code bit PLUS sont ensuite ajoutées pour CHAQUE architecture. Voir stackoverflow.com/a/31030741/102008
user102008
6
Voir developer.apple.com/library/prerelease/watchos/documentation/… "Le découpage est le processus de création et de livraison de variantes du bundle d'application pour différents appareils cibles. Une variante contient uniquement l' architecture exécutable et les ressources nécessaires pour la cible dispositif."
user102008
7
Ce n'est pas une affirmation vraie que l'activation de Bitcode rendra l'application installée sur l'appareil plus petite que lorsque Bitcode est désactivé. Cela ne dit nulle part cela.
user102008
7
@ onmyway133 Tous les fournisseurs ne fournissent pas la source. Si tout le fournisseur fournit est une librairie statique et des fichiers d'en-tête (ou un Framework), alors le vendeur doit avoir leurs trucs compilés avec le code bit activé.
Jeffery Thomas
65

Assurez-vous de sélectionner "Tous" pour trouver les paramètres d'activation de la construction du code bit:

Paramètres de construction

Gamma-Point
la source
35

Bitcode est une nouvelle fonctionnalité d' iOS 9

Bitcode est une représentation intermédiaire d'un programme compilé. Les applications que vous téléchargez sur iTunes Connect qui contiennent du code bitmap seront compilées et liées sur l'App Store. L'inclusion de bitcode permettra à Apple de ré-optimiser votre binaire d'application à l'avenir sans avoir à soumettre une nouvelle version de votre application au magasin.

Remarque: Pour les applications iOS, le bitcode est le code par défaut, mais facultatif. Si vous fournissez un bitcode, toutes les applications et tous les frameworks du bundle d'applications doivent inclure le bitcode. Pour les applications watchOS, un code bit est requis

Vous devez donc désactiver le bitcode jusqu'à ce que tous les frameworks de votre application aient le bitcode activé.

agy
la source
«Réoptimisez votre application binaire à l'avenir» - pouvez-vous expliquer un peu plus?
genaks
Ici, il est dit que: "Le bitcode est une nouvelle fonctionnalité d'iOS 9" et que "[...] Pour les applications watchOS, le bitcode est requis [...]". Alors, que se passe-t-il si je souhaite créer une application WatchOS sous iOS 8?
superpuccio
33

Bitcode rend les rapports de plantage plus difficiles . Voici une citation de HockeyApp (qui vaut également pour toutes les autres solutions de rapport de crash):

Lors du téléchargement d'une application sur l'App Store et en laissant la case à cocher «Bitcode» activée, Apple utilisera cette génération de Bitcode et la recompilera de son côté avant de la distribuer aux appareils. Cela entraînera le binaire obtenir un nouvel UUID et il y a une option pour télécharger un dSYM correspondant via Xcode.

Remarque: la réponse a été modifiée en janvier 2016 pour refléter les changements les plus récents

Alexander Vasenin
la source
2
Entre septembre et décembre, cela a réussi à être corrigé via la nouvelle option d'exportation de Xcode Organizer (voir la mise à jour dans le guide HA cité) et à nouveau cassé (voir ma question HA résolue )
Pavel Zdenek
13

@ vj9 thx. Je mets à jour vers xcode 7. Cela me montre la même erreur. Construisez bien après avoir réglé "NON"

entrez la description de l'image ici

réglez "NON" cela fonctionne bien.

entrez la description de l'image ici

zszen
la source
1
@Septronic Si vous souhaitez sélectionner OUI. Vous devez vérifier que votre troisième framework le supporte.
zszen
Votre version iOS minimale prise en charge cible doit être iOS 6 ou une version ultérieure.
shallowThought
9

Vous trouverez ici toutes les solutions concernant le Bitcode

Selon Apple Doc

Bitcode est une représentation intermédiaire d'un programme compilé. Les applications que vous téléchargez sur iTunes Connect qui contiennent un code bit seront compilées et liées sur la boutique. L'inclusion de bitcode permettra à Apple de ré-optimiser votre binaire d'application à l'avenir sans avoir à soumettre une nouvelle version de votre application au magasin.

Xcode masque par défaut les symboles générés lors de la construction, ils ne sont donc pas lisibles par Apple. Ce n'est que si vous choisissez d'inclure des symboles lors du téléchargement de votre application sur iTunes Connect que les symboles seront envoyés à Apple. Vous devez inclure des symboles pour recevoir des rapports d'erreur d'Apple.

Remarque: Pour les applications iOS, le bitcode est le code par défaut, mais facultatif. Pour les applications watchOS et tvOS, un bitcode est requis. Si vous fournissez un bitcode, toutes les applications et tous les frameworks du bundle d'applications (toutes les cibles du projet) doivent inclure le bitcode. Après avoir distribué votre application à l'aide d'iTunes Connect, vous pouvez télécharger le fichier dSYMs pour la génération, décrit dans Affichage et importation de plantages dans la fenêtre Périphériques

Le déploiement initial par Apple du service de réduction des codes binaires et des applications a été suspendu, car les problèmes de mise à niveau d'un type de matériel vers un autre type de matériel n'ont pas restauré les bonnes versions des binaires. Ce problème a été résolu par la suite avec iOS 9.0.2 et la fonctionnalité a été réactivée.

Bitcode a toujours fait partie des phases de compilation et d'optimisation de LLVM, mais en déplaçant la logique principale vers les serveurs Apple, il déplace les phases d'optimisation et d'assemblage du moment de la compilation du développeur au déploiement de l'App Store. Cela libère le potentiel de réoptimisation ou de re-traduction futures pour prendre en charge les processeurs plus récents et plus rapides à l'avenir. Les déploiements de codes binaires sont requis pour les déploiements watchOS et tvOS, et peuvent être activés sous condition pour les déploiements iOS existants avec l'option "Activer le code binaire" dans les paramètres du projet. Cela ajoutera un marqueur embed-bitcode-marker pour les builds de débogage et embed-bitcode pour les builds d'archive / de périphérique. Celles-ci peuvent être transmises au compilateur Swift avec -embed-bitcode ou en utilisant clang avec -fembed-bitcode.

Le bitcode présente également certains inconvénients.Les développeurs peuvent déboguer les rapports de plantage des applications en stockant des copies des symboles de débogage correspondant au binaire qui a été livré à Apple. Lorsqu'un crash se produit dans une pile donnée, le développeur peut restaurer la trace de pile d'origine en symbolisant le rapport de crash, à l'aide de ces symboles de débogage. Cependant, les symboles sont un sous-produit de la traduction de la forme intermédiaire en binaire; mais si cette étape est effectuée sur le serveur, ces informations sont perdues. Apple fournit un service de rapport d'incident qui peut jouer le rôle du débogueur, à condition que le développeur ait téléchargé les symboles de débogage au moment de la publication de l'application. Le fait que le développeur ne voit jamais le binaire exact signifie qu'il peut ne pas être en mesure de tester des problèmes spécifiques à mesure que le nouveau matériel évolue.

Enfin, le bitcode sur le serveur peut être traduit pour prendre en charge de nouvelles architectures et jeux d'instructions à mesure qu'ils évoluent. Pourvu qu'ils maintiennent la convention d'appel et la taille de l'alignement et des mots, une application de code binaire peut être traduite en différents types d'architecture et optimisée spécifiquement pour un nouveau processeur. Si des bibliothèques standard pour les routines mathématiques et vectorielles sont utilisées, elles peuvent être optimisées en instructions vectorielles spécifiques au processeur pour obtenir les meilleures performances pour une application donnée. Les optimiseurs peuvent même générer plusieurs encodages différents et juger en fonction de la taille ou de la vitesse d'exécution.

Pour plus d'informations, veuillez vérifier ici et ici

Rex
la source
6

À partir des documents

  • puis-je utiliser la méthode ci-dessus sans aucun impact négatif et sans compromettre une future soumission d'appstore?

Bitcode permettra à Apple d'optimiser l'application sans que vous ayez à soumettre une autre version. Mais, vous ne pouvez activer cette fonctionnalité que si tous les frameworks et applications du bundle d'applications ont cette fonctionnalité activée. L'avoir aide, mais ne pas l'avoir ne devrait pas avoir d'impact négatif.

  • Que fait réellement ENABLE_BITCODE, sera-t-il une exigence non facultative à l'avenir?

Pour les applications iOS, le bitcode est la valeur par défaut, mais facultatif. Si vous fournissez un bitcode, toutes les applications et tous les frameworks du bundle d'applications doivent inclure le bitcode. Pour les applications watchOS, un bitcode est requis.

  • Y a-t-il un impact sur les performances si je l'active / le désactive?

L'App Store et le système d'exploitation optimisent l'installation des applications iOS et watchOS en adaptant la livraison des applications aux capacités de l'appareil particulier de l'utilisateur, avec un encombrement minimal. Cette optimisation, appelée amincissement des applications, vous permet de créer des applications qui utilisent le plus de fonctionnalités de l'appareil, occupent un espace disque minimal et prennent en charge les futures mises à jour qui pourront être appliquées par Apple. Des téléchargements plus rapides et plus d'espace pour d'autres applications et contenus offrent une meilleure expérience utilisateur.

Il ne devrait y avoir aucun impact sur les performances.

vj9
la source