Que fait ENABLE BITCODE dans xcode 7?

j'ai un problème avec le terme bitcode intégré.

Qu'est-ce que le bitcode intégré?

Quand activer ENABLE_BITCODE dans le nouveau Xcode?

Qu'arrive-t-il au binaire lorsqu'il est activé, ENABLE_BITCODE dans Xcode 7 ?

237
demandé sur damithH 2015-06-09 06:40:33

6 réponses

Bitcode renvoie au type de code: "LLVM Bitcode" qui est envoyé à iTunes Connect. Cela permet à Apple d'utiliser certains calculs pour optimiser davantage les applications (E. g: possibilité de réduire la taille des exécutables). Si Apple doit modifier votre exécutable, alors ils peuvent le faire sans qu'une nouvelle compilation soit téléchargée.

: trancher qui est le processus D'Apple l'optimisation de votre application pour un appareil de l'utilisateur basé sur la résolution et l'architecture de l'appareil. Le tranchage ne nécessite pas de Bitcode. (Ex: n'incluant que des images @2x sur un 5s)

App Amincissement est la combinaison de découpage, bitcode, et les ressources à la demande

Bitcode est une représentation intermédiaire d'un programme compilé. Apps vous téléchargez sur iTunes Connect qui contient bitcode sera compilé et lié sur L'App Store. Y compris bitcode permettra à Apple de re-optimisez votre binaire app dans le futur sans avoir à soumettre un nouvelle version de votre application pour le magasin.

dans la Documentation d'Apple sur l'App Amincissement

282
répondu kezi 2016-09-09 05:54:07

Qu'est-ce que le bitcode intégré?

selon docs :

Bitcode est une représentation intermédiaire d'un programme compilé. Les applications que vous téléchargez sur iTunes Connect qui contiennent du bitcode seront compilées et liées sur L'App Store. Y compris bitcode permettra à Apple de Ré-optimiser votre application binaire à l'avenir sans la nécessité de soumettre une nouvelle version de votre application à la boutique.

mise à Jour: Cette phrase dans "les Nouvelles Fonctionnalités dans Xcode 7" m'a fait penser depuis longtemps que Bitcode est nécessaire pour Découpage pour réduire la taille de l'application:

lorsque vous archivez pour soumission à L'App Store, Xcode compilera votre application dans une représentation intermédiaire. L'App Store compilera alors le bitcode en 64 ou 32 bits exécutables au besoin.

Cependant ce n'est pas vrai, Bitcode et Découpage travailler de manière indépendante: Découpage est la réduction de la taille de l'application et de générer des app bundle variantes, et Bitcode est à propos de certains binaires optimisations. J'ai vérifié cela en vérifiant les architectures incluses dans les exécutables d'applications non-bitcode et en fondant qu'elles incluent seulement nécessaire.

Bitcode allows other App Thinning component called Slicing to generate app bundle variantes with particular executables for particular architectures, e.g. la variante iPhone 5S inclura uniquement l'exécutable arm64, l'iPad Mini armv7 et ainsi de suite.

quand activer ENABL_BITCODE dans le nouveau Xcode?

pour les applications iOS, bitcode est la valeur par défaut, mais optionnelle. Si vous fournissez du bitcode, toutes les applications et tous les cadres du pack d'applications doivent inclure du bitcode. Pour les applications watchOS et tvOS, le bitcode est requis.

Qu'arrive-t-il au binaire lorsque ENABL_BITCODE est activé dans le nouveau Xcode?

du Xcode 7 référence:

activer ce paramètre indique que la cible ou le projet devrait générer bitcode lors de la compilation pour les plates-formes et les architectures qui le supportent. Pour les compilations D'Archives, bitcode sera généré dans le binaire lié pour la soumission à l'app store. Pour les autres constructions, le compilateur et le linker vérifieront si le code est conforme aux exigences pour la génération de bitcode, mais ne généreront pas de bitcode réel.

voici quelques liens qui vous aideront à mieux comprendre Bitcode :

78
répondu Maxim Pavlov 2017-08-29 08:43:27

en ce qui concerne le code Bit et le code bit habilitant, la première chose à comprendre est l'histoire d'où tout cela a commencé.

donc, fondamentalement si je parle de ENABLE_BITCODE qui est introduit dans iOS 9, est une partie du processus D'éclaircissement D'application.

et c'est une partie du problème qui répond " comment Apple a-t-il réussi à réduire la taille de stockage de iOS 9 à 1 Go à partir de 5 Go dans iOS 8? "

Cela est dû à une nouvelle technologie appelée 'Application Amincissement'

et qu'est-ce que L'éclaircie ?

L'amincissement de L'application

fait baisser la mise à jour iOS 9 OTA de 4,6 Go à 1,3 Go, une réduction de taille de 71%. Non seulement cela aidera avec les futures mises à jour OTA, mais la technologie sera disponible pour les développeurs afin de réduire le stockage requis par les applications tierces.

app thinning a essentiellement trois composants à savoir- découpage, bitcode, et les ressources à la demande.

App Slicing : les applications iOS sont développées pour fonctionner sur une variété d'appareils, ils viennent donc avec le code pour les supporter tous, que votre appareil particulier l'exige ou non. Application de Découpage permettra à votre appareil pour télécharger uniquement les fichiers requis par notre dispositif. Exemple: vous n'avez pas besoin des actifs 3x iPhone 6 Plus Si vous utilisez un modèle de 4 pouces.

Ressources Sur Demande (ODRs) : il fonctionne sur l'idée qu'une application n'a probablement pas besoin de toute sa bibliothèque de ressources à tout moment, de sorte que des parties de celui-ci peuvent être téléchargées ou supprimées si nécessaire. Les développeurs seront en mesure de spécifier quel code est nécessaire à quel moment en étiquetant les sections de code comme ODRs. Ces portions seront automatiquement téléchargées à partir de L'App Store lorsqu'elles sont requises et supprimées lorsqu'elles ne seront plus nécessaires.

Bitcode : il se réfère à une "représentation intermédiaire" d'une application que les développeurs télécharger sur l'App Store, plutôt que d'une pré-compilés. Cela fonctionne main dans la main avec App Slicing, permettant au bitcode d'être compilé à la demande en 32 bits ou 64 bits, selon le périphérique de téléchargement. Cela permettra également aux améliorations apportées par Apple aux compilateurs d'être implémentées automatiquement, plutôt que de demander aux développeurs de resoumettre leurs applications.

enter image description here

32
répondu Sanjay Mohnani 2015-09-15 14:07:29

puisque la question exacte est "qu'est-ce que le bitcode peut faire", j'aimerais donner quelques détails techniques 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 n'apparaît pas comme pour être la même chose que le bytecode LLVM. Au moins, je n'ai pas été en mesure de comprendre toute ressemblance entre eux. Il semble avoir un en-tête propriétaire (commence toujours par " xar!") et probablement une magie de référence de temps de lien qui empêche les duplications de données. Si vous écrivez une chaîne codée en dur, cette chaîne ne sera mis dans les données une seule fois, plutôt que deux, comme si c'était normal bytecode LLVM.

Deuxièmement, bitcode n'est pas vraiment envoyé dans l'archive binaire comme une architecture séparée comme on pourrait s'y attendre. Il n'est pas expédié de la même manière que say x86 et le bras sont mis dans un binaire (Fat archive). Au lieu de cela, ils utilisent une section spéciale dans L'architecture binaire MachO spécifique appelé "__LLVM" qui est envoyé avec chaque architecture prise en charge (c'est-à-dire dupliqué). Je suppose que c'est une courte venir avec leur compilateur système et peut être corrigé à l'avenir pour éviter la duplication.

code C (compilé avec clang -fembed-bitcode hi.c -S -emit-llvm ):

#include <stdio.h>

int main() {
    printf("hi there!");
    return 0;
}

LLVM IR output:

; ModuleID = '/var/folders/rd/sv6v2_f50nzbrn4f64gnd4gh0000gq/T/hi-a8c16c.bc'
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-apple-macosx10.10.0"

@.str = private unnamed_addr constant [10 x i8] c"hi there!"151910920"", align 1
@llvm.embedded.module = appending constant [1600 x i8] c"\DE\C0"151910920"B"151910920""151910920""151910920""151910920""151910920""151910920""151910920"$"151910920""151910920""151910920""151910920"BC\C0\DE!"151910920"C"151910920""151910920""151910920""151910920""151910920"B "151910920""151910920""151910920""151910920""151910920""151910920""151910920"#A\C8I29"151910920"C%EBbEB"151910920"BB28I"151910920"A2D$H"151910920"A!#\C4R"151910920"C!r$\C8b\A8\A0\A8@\C6\F0"151910920""151910920""151910920"Q"151910920""151910920"\C7"151910920""151910920""151910920"Bp$\F8\FF\FF\FF\FF"151910920""151910920"DD\CAaE\E6\A1"151910920"D\E0AE\CAaC\D2aE\CA\A1"151910920"D\CCE\DA!C\C80p`y(pwhsphrhxxtpz(yhr`thE\E4\A1E\CA\DC\E1D\DA\C0C\E4!C\DA\A1C\DA"151910920"E\DE!D\DCE\CAAE\DA\A0C\D8!D\DA\A1"151910920"D\DC\E1D\DC\A1"151910920"D\D8\A1C\C2\C1C"151910920"\C2D\DE\A1"151910920"D\D2\C1D\CCaE\DA\C0C\E0\A1"151910920"D\DA!C\E8D"151910920"svr"151910920"wx6pppyhs6hp\A0t"151910920"\CC!C\D8aE\CA \E6E\C2aC\D6\A1"151910920"D\E0AE\DEE\CAaC\E8\E1D\E4\A1"151910920"D\C4\A1E\CC\C1C\CAAE\DA`E\D2AF\CA\C0\A0ps(zhqz"151910920"\C6\E1D\E4\A1C\E4"151910920" \E8!C\E4\E1C\CAE\DA\C0C\CA!C\E8\A1E\E4\A1C\E6Xyy(9`5|;`5y(6Xyr6Xyr\A8wp0rhs6hp\A0t"151910920"\CC!C\D8aE\CA \EAaE\CA\A1"151910920"D\E6\E1D\CCE\DA\C0C\D8\E1D\C2E"151910920"svr"151910920"6\C8\F0\FF\FF\FF\FF\C1"151910920"E\E50"151910920"F\F3\D0\F0 "151910920"F\E50"151910920"E\E90"151910920"F\E5\D0\E6"151910920""151910920"F\ED"151910920"E\E4"151910920"C8\B0\C3<@\B8\C3;\B49\C8C8\B4C9\B4<\BCC:\B8=<\B4A9\B0C:\B4@"151910920"F\F2P"151910920"F\E5"151910920""151910920"C\EE\F0"151910920"Em`"151910920"E\F2"151910920"E\EDP"151910920"Em"151910920""151910920"F\EF"151910920"E\EE@"151910920"F\E5 "151910920"FmP"151910920"E\EC"151910920"E\ED\D0\EE\F0"151910920"E\EE\D0\ECP"151910920"E\E1`"151910920"E"151910920"\E1"151910920"E\EF\D0\E9\E0"151910920"E\E60"151910920"Fm`"151910920"E\F0\D0\ED"151910920"E\F4"151910920"E9;\CCC9"151910920";\BCCB\B8C8\B8\C3<\B49\C0CB\B4C8\D0:"151910920"\E6"151910920"E\EC0"151910920"F\E5"151910920"\F3@"151910920"F\E10"151910920"E\EB\D0\F0 "151910920"F\EF@"151910920"F\E50"151910920"E\F4\F0"151910920"E\F2\D0\E2P"151910920"F\E6`"151910920"E\E5 "151910920"Fm0"151910920"F\E9\A0"151910920"F\E5"151910920"\E0@\D0C8\C8\C39=\B4\C18\C0C="151910920"\E3\F0"151910920"E\F2P"151910920"Er"151910920"\F4"151910920"E\F2p"151910920"E\E5@"151910920"Fm`"151910920"E\E5"151910920"E\F4P"151910920"F\F2P"151910920"E\F3"151910920"\AC\C1<\CC\C3<\C3C\B0\C1AC>\C4D\B0\C1A\CC\C3<B\AC\C1<\CCC9\C8B\AC\C1<\CCC9\CC@\D4;\CCC8C9\B49\C0CB\B4C8\D0:"151910920"\E6"151910920"E\EC0"151910920"F\E5"151910920"\F50"151910920"F\E5\D0\F3\F0"151910920"E\E6@"151910920"Fm`"151910920"E\EC\F0"151910920"E\E1@"151910920"F9;\CCC9"151910920""151910920"I"151910920""151910920""151910920""151910920""151910920"`B "151910920""151910920""151910920" "151910920""151910920""151910920"D"151910920""151910920""151910920"2 d\A4\E3\A1LC"151910920"BL0sH*"151910920"\C5C`\AA0F7@3"151910920"4|\C0;\F8;\A06xv(6hpw|8p87"151910920"DeP"151910920"Em\D0"151910920"Ez\F0"151910920"Em"151910920"Ev@z`t\D0\E6p\A0q x\D0\EEzv\A0s z`t\D0\B3r:"151910920"FDH #EBDCI"151910920""151910920"@"151910920""151910920"\C0\A7"151910920""151910920" "151910920""151910920""151910920""151910920""151910920""151910920""151910920"8"151910920""151910920""151910920""151910920""151910920""151910920""151910920""151910920""151910920""151910920""151910920""151910920"2E"151910920"CLC&G\C6CA("151910920"AM\D0iD]C"151910920""151910920""151910920"y"151910920""151910920"C"151910920""151910920""151910920"ALF4A&PIC Levela\D80\C2\C05c+ab\B2j\B1+BK{s\B9qqAc"151910920"Bs;k\B9qq\A9qI\D9D\D8\D8\EC\DAC\DA\DE\C8\EA\D8\CAC\CC\D8\C2\CE\E6\A6C66\BB64\B227\BA)A"151910920"y"151910920""151910920"2"151910920""151910920""151910920"3C\C4\E1Cf=C8\C3CByxsq"151910920"C\E6"151910920""151910920"F\ED"151910920"E\F4"151910920"E3"151910920"CBE\C2\C1D\CE\A1Cf0=C8B\CC=\C8C=C=\CCxCtp{yHppzpvxp \CC"151910920"E\EC"151910920"E\E10"151910920"Fn0"151910920"F\E3\F0"151910920"E\F0P"151910920"E3\C4D\DE!C\D8!D\C2aEf0;\BC;\D0C9\B4<\BC<;\CC\F0v`{h7hrh7pp`v(v\F8vxw_qry,\EE\F0"151910920"E\EE\E0"151910920"E\F5\C0"151910920"E\EC"151910920"q "151910920""151910920""151910920""151910920""151910920"&`<\D2L"151910920"C4@\F8\D2"151910920""151910920"a "151910920""151910920""151910920"B"151910920""151910920""151910920"A,"151910920""151910920""151910920""151910920""151910920""151910920"4#"151910920"dC0"151910920"3\CA@"151910920"C\C1"151910920""151910920"#"151910920"CB"151910920""151910920""151910920""151910920""151910920""151910920""151910920""151910920""151910920""151910920""151910920""151910920""151910920""151910920""151910920"", section "__LLVM,__bitcode"
@llvm.cmdline = appending constant [67 x i8] c"-triple"151910920"x86_64-apple-macosx10.10.0"151910920"-emit-llvm"151910920"-disable-llvm-optzns"151910920"", section "__LLVM,__cmdline"

; Function Attrs: nounwind ssp uwtable
define i32 @main() #0 {
  %1 = alloca i32, align 4
  store i32 0, i32* %1
  %2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str, i32 0, i32 0))
  ret i32 0
}

declare i32 @printf(i8*, ...) #1

attributes #0 = { nounwind ssp uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="core2" "target-features"="+ssse3,+cx16,+sse,+sse2,+sse3" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="core2" "target-features"="+ssse3,+cx16,+sse,+sse2,+sse3" "unsafe-fp-math"="false" "use-soft-float"="false" }

!llvm.module.flags = !{!0}
!llvm.ident = !{!1}

!0 = !{i32 1, !"PIC Level", i32 2}
!1 = !{!"Apple LLVM version 7.0.0 (clang-700.0.53.3)"}

le tableau de données qui est dans L'IR aussi des changements en fonction de l'optimisation et d'autres paramètres de génération de code de bruit. Je ne sais absolument pas dans quel format ou quoi que ce soit.

EDIT:

suite à L'allusion sur Twitter, j'ai décidé de revoir ceci et de le confirmer. J'ai suivi ce billet de blog et j'ai utilisé son outil d'extraction de bitcode pour extraire le binaire D'Archives D'Apple de L'exécutable MachO. Et après avoir extrait L'Archive Apple avec le xar utilitaire, j'ai obtenu ceci (converti en texte avec llvm-dis bien sûr)

; ModuleID = '1'
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-apple-macosx10.10.0"

@.str = private unnamed_addr constant [10 x i8] c"hi there!"151920920"", align 1

; Function Attrs: nounwind ssp uwtable
define i32 @main() #0 {
  %1 = alloca i32, align 4
  store i32 0, i32* %1
  %2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str, i32 0, i32 0))
  ret i32 0
}

declare i32 @printf(i8*, ...) #1

attributes #0 = { nounwind ssp uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="core2" "target-features"="+ssse3,+cx16,+sse,+sse2,+sse3" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="core2" "target-features"="+ssse3,+cx16,+sse,+sse2,+sse3" "unsafe-fp-math"="false" "use-soft-float"="false" }

!llvm.module.flags = !{!0}
!llvm.ident = !{!1}

!0 = !{i32 1, !"PIC Level", i32 2}
!1 = !{!"Apple LLVM version 7.0.0 (clang-700.1.76)"}

la seule différence notable entre L'IR non-bitcode et L'IR bitcode est que les noms de fichiers ont été dépouillés à 1, 2, etc. pour chaque architecture.

j'ai également confirmé que le bitcode intégré dans un binaire est généré après optimisations. Si vous compilez avec-O3 et que vous extrayez le bitcode, ce sera différent que si vous compilez avec-O0.

et juste pour obtenir des crédits supplémentaires, J'ai également confirmé Qu'Apple n'envoie pas de bitcode sur les appareils lorsque vous téléchargez une application iOS 9. Ils comprennent un certain nombre d'autres sections étranges que je ne reconnais pas comme __LINKEDIT, mais ils ne comprennent pas __LLVM.__bundle, et donc ne semblent pas inclure bitcode dans le binaire final qui tourne sur un périphérique. Assez curieusement, Apple fournit encore des binaires gras avec le code 32/64bit séparé pour iOS 8 appareils cependant.

18
répondu Earlz 2015-11-06 15:23:52

Bitcode (iOS, watchOS)
151980920 "

Bitcode est une représentation intermédiaire d'un programme compilé. Les applications que vous téléchargez sur iTunes Connect qui contiennent du bitcode seront compilées et liées sur L'App Store. Y compris bitcode permettra à Apple de Ré-optimiser votre application binaire à l'avenir sans la nécessité de soumettre une nouvelle version de votre application à la boutique.



fondamentalement ce concept est quelque peu similaire à java où le code octet est exécuté sur différentes JVM et dans ce cas le bitcode est placé sur iTune store et au lieu de donner le code intermédiaire à différentes plateformes(périphériques) il fournit le code compilé qui n'a pas besoin d'une machine virtuelle pour fonctionner.

nous avons donc besoin de créer le bitcode une fois et il sera disponible pour les appareils existants ou à venir. C'est le mal de tête de la pomme de compiler un make it compatible avec chaque plate-forme qu'ils ont.

les développeurs N'ont pas à faire de changements et à soumettre l'application à nouveau pour prendre en charge les nouvelles plates-formes.

prenons l'exemple de l'iPhone 5s quand apple a introduit x64 puce dans elle. Bien que les applications x86 soient totalement compatibles avec l'architecture x64 mais pour utiliser pleinement la plate-forme x64 le développeur doit changer l'architecture ou un peu de code. Une fois qu'il est fait, l'application est soumise à l'app store pour l'examen.

si ce concept de bitcode a été lancé plus tôt, nous les développeurs n'avons pas à faire de changements pour prendre en charge l'architecture bit x64 .

11
répondu Inder Kumar Rathore 2015-09-11 09:39:38

mise à Jour

Apple a clarifié que le tranchage se produit indépendamment de l'activation du bitcode. J'ai observé cela dans la pratique aussi bien quand une application non-bitcode activée ne sera téléchargée que comme l'architecture appropriée pour le périphérique cible.

Original

plus spécifiquement :

Bitcode. Archiver votre application pour soumission à L'App Store dans un représentation intermédiaire, qui est compilée en 64 ou 32 bits exécutables pour les périphériques cibles lorsqu'ils sont livrés.

tranchant. Œuvres d'art intégrées dans l'Actif de Catalogue et étiquetés pour une plate-forme permet à L'App Store de fournir seulement ce qui est nécessaire pour installation.

la façon dont je lis ceci, si vous supportez bitcode, les téléchargeurs de votre application sera obtenez seulement l'architecture compilée nécessaire pour leur propre appareil.

4
répondu Ben Flynn 2016-03-11 18:23:39