web-dev-qa-db-fra.com

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

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

URGENT: tout le bitcode sera supprimé car '[chemin] /Parse.framework/Parse (PFAnalytics.o)' a été construit sans bitcode. Vous devez le reconstruire avec le code binaire activé (paramètre Xcode ENABLE_BITCODE), obtenir une bibliothèque mise à jour auprès du fournisseur ou désactiver le code binaire pour cette cible. Note: Ce sera une erreur dans le futur.

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

Xcode vous informe concernant le bitcode

L'activation de ce paramètre indique que la cible ou le projet doit générer un code binaire lors de la compilation pour les plates-formes et les architectures qui le prennent en charge. Pour les versions d’archive, le code binaire sera généré dans le fichier binaire lié en vue de sa soumission à l’app store. Pour les autres versions, le compilateur et l'éditeur de liens vérifieront si le code est conforme aux exigences de la génération de bitcode, mais ne générera pas le 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 réellement le ENABLE_BITCODE? S'agira-t-il d'une exigence non optionnelle à l'avenir?
  • Y at-il des impacts sur les performances si je l’active/le désactive?
219
luk2302
  • Qu'est-ce que ENABLE_BITCODE fait réellement, sera-t-il une exigence non optionnelle à l'avenir?

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

Lorsque vous générez votre projet, Xcode appelle clang pour les cibles Objective-C et Swift/swiftc pour les cibles Swift. Ces deux compilateurs compilent l'application en un représentation intermédiaire (IR), l'un de ces IR est un code binaire. À partir de cet IR, un programme appelé LLVM prend le relais et crée les fichiers binaires nécessaires aux 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 de Nice, mais un inconvénient énorme: il ne peut pas courir n'importe où. Pour exécuter une application avec un binaire bitcode, le bitcode doit être recompilé ( éventuellement assemblé ou transcodé… Je ne suis pas sûr du verbe correct ) dans un x86 ou ARM binaire.

Lorsqu'une application bitcode est soumise à l'App Store, Apple effectue cette étape finale et crée les fichiers binaires terminés.

Pour le moment, les applications bitcode sont facultatives, mais l'historique a montré que Apple transforme les éléments facultatifs en exigences (telles que 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 que Apple rende les applications bitcode obligatoires pour l'App Store, tout ira bien.

  • Y at-il des impacts sur les performances si je l’active/le désactive?

L'activation de cette fonctionnalité n'aura jamais d'impact négatif sur les performances, mais la distribution interne d'une application à tester risque de devenir plus compliquée.

En ce qui concerne les impacts positifs… ben c'est compliqué.

Pour la distribution dans l'App Store, Apple créera des versions séparées 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 à créer de nouvelles optimisations. 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.

365
Jeffery Thomas

Assurez-vous de sélectionner "Tous" pour trouver les paramètres d'activation de la génération de code binaire:

Build settings

60
Gamma-Point

Le bitcode est une nouvelle fonctionnalité de iOS 9

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

Remarque: pour les applications iOS, bitcode est la valeur par défaut, mais est facultatif. Si vous fournissez un bitcode, toutes les applications et les infrastructures du groupe d'applications doivent inclure le bitcode. Pour les applications watchOS, le bitcode est requis

Donc, vous devriez désactiver le bitcode jusqu'à ce que tous les frameworks de votre application aient le bitcode activé.

33
agy

Le bitcode rend plus difficile le signalement des collisions . Voici une citation de HockeyApp (qui s'applique également à toutes les autres solutions de génération de rapports de crash):

Lorsque vous téléchargez une application sur l'App Store et que la case "Bitcode" est activée, Apple utilisera cette version de Bitcode et la recompilera avant de la distribuer aux appareils. Cela aura pour résultat que le binaire obtiendra un nouvel UUID et qu'il sera possible de télécharger un dSYM correspondant via Xcode.

Remarque: la réponse a été modifiée en janvier 2016 pour refléter les modifications les plus récentes .

31
Alexander Vasenin

@ vj9 thx. Je mets à jour à xcode 7. Cela me montre la même erreur. Bien construire après le set "NO"

enter image description here

définir "NON" cela fonctionne bien.

enter image description here

11
zszen

Vous pouvez trouver ici toutes les solutions de 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 et contenant un code binaire seront compilées et liées sur le magasin. L'inclusion de bitcode permettra à Apple de ré-optimiser le binaire de votre application à l'avenir, sans qu'il soit nécessaire de soumettre une nouvelle version de votre application au magasin.

Xcode masque par défaut les symboles générés lors de la compilation, 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 ces symboles sont envoyés à Apple. Vous devez inclure des symboles pour recevoir les rapports d'incident d'Apple.

Remarque: Pour les applications iOS, le bitcode est la valeur par défaut, mais il est facultatif. Pour les applications watchOS et tvOS, le bitcode est requis. Si vous fournissez un code binaire, toutes les applications et les infrastructures du groupe d'applications (toutes les cibles du projet) doivent inclure un code binaire. Après avoir distribué votre application via iTunes Connect, vous pouvez télécharger le fichier dSYM pour la construction décrite dans la section Affichage et importation de pannes dans la fenêtre Périphériques

Le déploiement initial du service de réduction de code de bits et d'applications par Apple a été mis en attente, car des problèmes liés à la mise à niveau d'un type de matériel à un autre, n'ont pas permis de restaurer les versions correctes des fichiers binaires. Ce problème a ensuite été résolu avec iOS 9.0.2 et la fonctionnalité réactivée.

Bitcode a toujours fait partie des phases de compilation et d’optimisation de LLVM, mais en déplaçant la logique d’arrière-plan sur les serveurs Apple, il déplace les phases d’optimisation et d’assemblage du temps de compilation des développeurs au déploiement de l’App Store. Cela libère le potentiel de ré-optimisation ou de nouvelle conversion pour prendre en charge des processeurs plus récents et plus rapides. Les déploiements de code binaire sont requis pour les déploiements watchOS et tvOS, et peuvent être conditionnellement activés pour les déploiements iOS existants avec l'option "Activer le code binaire" dans les paramètres du projet. Cela ajoutera un indicateur embed-bitcode-marker pour les versions de débogage et embed-bitcode pour les versions archive/device. Ceux-ci peuvent être passés 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 d'incident des applications en stockant des copies des symboles de débogage correspondant au binaire fourni à Apple. Lorsqu'un incident se produit dans une pile donnée, le développeur peut restaurer la trace d'origine de la pile en symbolisant le rapport d'incident à 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, cette information est perdue. Apple fournit un service de génération de rapports d'incident pouvant jouer le rôle du débogueur, à condition que le développeur ait chargé les symboles de débogage au moment de la publication de l'application. Le fait que le développeur ne voie 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. Céder le pouvoir à Apple pour effectuer la compilation soulève également des problèmes, notamment la possibilité d'injecter des routines ou des extraits de code supplémentaires, mais comme Apple contrôle entièrement le processus de publication, actuellement possible que le développeur utilise ou non des fichiers binaires codés en bitcode ou compilés.

Enfin, le bitcode sur le serveur peut être traduit pour prendre en charge de nouvelles architectures et de nouveaux jeux d'instructions à mesure qu'ils évoluent. À condition de respecter 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, celles-ci 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

7
Rex

De la docs

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

Le bitcode permettra à Apple d'optimiser l'application sans que vous ayez à soumettre une nouvelle construction. Toutefois, vous ne pouvez activer cette fonctionnalité que si cette fonctionnalité est activée pour tous les frameworks et applications de l'ensemble d'applications. Avoir ça aide, mais ne pas l'avoir ne devrait pas avoir d'impact négatif.

  • Qu'est-ce que ENABLE_BITCODE fait réellement, sera-t-il une exigence non optionnelle à l'avenir?

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

  • Y at-il des impacts 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 du périphérique particulier de l’utilisateur, avec un encombrement minimal. Cette optimisation, appelée amincissement des applications, vous permet de créer des applications utilisant le plus grand nombre de fonctionnalités de l'appareil, occupant un minimum d'espace disque et prenant en charge les futures mises à jour pouvant ê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.

4
vj9