J'ai un problème avec le terme de code bit intégré.
Qu'est-ce qu'un bitcode intégré?
Quand l'activer, ENABLE_BITCODE
dans le nouveau Xcode?
Qu'advient-il du binaire lorsqu'il est activé, ENABLE_BITCODE
dans Xcode 7?
Bitcode fait référence au type de code: "LLVM Bitcode" qui est envoyé à iTunes Connect. Cela permet à Apple d'utiliser certains calculs pour réoptimiser davantage les applications (par exemple: éventuellement réduire la taille des exécutables). Si Apple doit modifier votre exécutable, il peut le faire sans télécharger une nouvelle version.
Cela diffère de: le découpage qui est le processus d'Apple optimisant votre application pour l'appareil d'un utilisateur en fonction de la résolution et de l'architecture de l'appareil. Le découpage ne nécessite pas de Bitcode. (Ex: n'incluant que les images @ 2x sur un 5s)
L'App Thinning est la combinaison de ressources de découpage, de bitcode et à la demande
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.
Qu'est-ce qu'un bitcode intégré?
Selon les documents :
Mise à jour: Cette phrase dans "Nouvelles fonctionnalités de Xcode 7" m'a fait penser pendant longtemps que Bitcode est nécessaire pour que Slicing réduise la taille de l'application:
Cependant, ce n'est pas vrai, Bitcode et Slicing fonctionnent indépendamment: Slicing consiste à réduire la taille de l'application et à générer des variantes de bundle d'applications, et Bitcode concerne certaines optimisations binaires. J'ai vérifié cela en vérifiant les architectures incluses dans les exécutables des applications non-bitcode et en constatant qu'elles n'en incluent que les nécessaires.
Bitcode permet à un autre composant App Thinning appelé Slicing de générer des variantes de bundle d'applications avec des exécutables particuliers pour des architectures particulières, par exemple, la variante iPhone 5S inclura uniquement l'exécutable arm64, l'iPad Mini armv7, etc.Quand activer ENABLE_BITCODE dans le nouveau Xcode?
Qu'arrive-t-il au binaire lorsque ENABLE_BITCODE est activé dans le nouveau Xcode?
De la référence Xcode 7:
Voici quelques liens qui vous aideront à mieux comprendre Bitcode :
la source
Étant donné que la question exacte est "qu'est-ce que permet le bitcode", je voudrais donner quelques détails techniques minces que j'ai compris jusqu'à présent. La plupart de cela est pratiquement impossible à comprendre avec 100% de certitude jusqu'à ce qu'Apple publie le code source de ce compilateur
Tout d'abord, le bitcode d'Apple ne semble pas être la même chose que le bytecode LLVM. Au moins, je n'ai pas pu trouver de ressemblance entre eux. Il semble avoir un en-tête propriétaire (commence toujours par "xar!") Et probablement une magie de référence au moment du lien qui empêche les duplications de données. Si vous écrivez une chaîne codée en dur, cette chaîne ne sera insérée dans les données qu'une seule fois, plutôt que deux comme on pourrait s'y attendre si c'était un bytecode LLVM normal.
Deuxièmement, le bitcode n'est pas vraiment livré dans l'archive binaire en tant qu'architecture distincte comme on pourrait s'y attendre. Il n'est pas livré de la même manière que disons que x86 et ARM sont mis dans un seul binaire (archive FAT). Au lieu de cela, ils utilisent une section spéciale dans le binaire MachO spécifique à l'architecture nommée "__LLVM" qui est livrée avec chaque architecture prise en charge (c'est-à-dire dupliquée). Je suppose que c'est un court terme avec leur système de compilation et peut être corrigé à l'avenir pour éviter la duplication.
Code C (compilé avec
clang -fembed-bitcode hi.c -S -emit-llvm
):Sortie IR LLVM:
Le tableau de données qui se trouve dans l'IR change également en fonction de l'optimisation et d'autres paramètres de génération de code de clang. Je ne sais absolument pas dans quel format ou quoi que ce soit.
ÉDITER:
Suite à l'allusion sur Twitter, j'ai décidé de revisiter cela et de le confirmer. J'ai suivi ce billet de blog et utilisé son outil d'extraction de bitcode pour extraire le binaire Apple Archive de l'exécutable MachO. Et après avoir extrait les archives Apple avec l'utilitaire xar, j'ai obtenu ceci (converti en texte avec llvm-dis bien sûr)
La seule différence notable entre l'IR non-bitcode et l'IR bitcode est que les noms de fichiers ont été supprimés à seulement 1, 2, etc. pour chaque architecture.
J'ai également confirmé que le bitcode incorporé dans un binaire est généré après optimisations. Si vous compilez avec -O3 et extrayez le bitcode, ce sera différent de si vous compilez avec -O0.
Et juste pour obtenir un crédit supplémentaire, j'ai également confirmé qu'Apple n'envoie pas de bitcode aux appareils lorsque vous téléchargez une application iOS 9. Ils incluent un certain nombre d'autres sections étranges que je ne reconnais pas comme __LINKEDIT, mais ils n'incluent pas le bundle __LLVM .__, et ne semblent donc pas inclure le code bit dans le binaire final qui s'exécute sur un périphérique. Curieusement, Apple expédie toujours de gros fichiers binaires avec un code 32 / 64bit séparé aux appareils iOS 8.
la source
xar!
est le format de fichier d'archive d'Apple.Fondamentalement, ce concept est quelque peu similaire à java où le code d'octet est exécuté sur différentes machines virtuelles Java et dans ce cas, le bitcode est placé sur iTune Store et au lieu de donner le code intermédiaire à différentes plates-formes (appareils), il fournit le code compilé qui n'a pas besoin n'importe quelle machine virtuelle à exécuter.
Nous devons donc créer le bitcode une fois et il sera disponible pour les appareils existants ou à venir. C'est le casse-tête d'Apple de compiler et de le rendre compatible avec chaque plate-forme qu'ils ont.
Les développeurs n'ont pas à apporter de modifications ni à soumettre à nouveau l'application pour prendre en charge de nouvelles plateformes.
Prenons l'exemple de l'iPhone 5 lorsque Apple y a introduit une
x64
puce. Bien que lesx86
applications soient totalement compatibles avec l'x64
architecture, mais pour utiliser pleinement lax64
plate-forme, le développeur doit changer l'architecture ou du code. Une fois terminé, l'application est soumise à l'App Store pour examen.Si ce concept de bitcode a été lancé plus tôt, nous, les développeurs, n'avons pas à apporter de modifications pour prendre en charge l'
x64
architecture bit.la source
Mettre à jour
Apple a précisé que le découpage se produit indépendamment de l'activation du bitcode. J'ai également observé cela dans la pratique où une application non compatible bitcode ne sera téléchargée qu'en tant qu'architecture appropriée pour le périphérique cible.
Original
Plus précisément :
La façon dont je lis cela, si vous prenez en charge le bitcode, les téléchargeurs de votre application obtiendront uniquement l'architecture compilée nécessaire pour leur propre appareil.
la source