Ich habe ein Problem mit dem eingebetteten Bitcode-Begriff.
Was ist eingebetteter Bitcode?
Wann ENABLE_BITCODE
in neuem Xcode aktivieren ?
Was passiert mit der Binärdatei, wenn sie ENABLE_BITCODE
in Xcode 7 aktiviert ist ?
Bitcode bezieht sich auf den Codetyp: "LLVM-Bitcode", der an iTunes Connect gesendet wird. Auf diese Weise kann Apple bestimmte Berechnungen verwenden, um Apps weiter zu optimieren (z. B. möglicherweise die Größe der ausführbaren Dateien zu verringern). Wenn Apple Ihre ausführbare Datei ändern muss, können sie dies tun, ohne dass ein neuer Build hochgeladen wird.
Dies unterscheidet sich von: Slicing , bei dem Apple Ihre App basierend auf der Auflösung und Architektur des Geräts für das Gerät eines Benutzers optimiert. Für das Schneiden ist kein Bitcode erforderlich. (Beispiel: nur mit @ 2x Bildern auf einer 5s)
App Thinning ist die Kombination aus Slicing-, Bitcode- und On-Demand-Ressourcen
Bitcode ist eine Zwischendarstellung eines kompilierten Programms. Apps, die Sie in iTunes Connect hochladen und die Bitcode enthalten, werden im App Store kompiliert und verknüpft. Durch das Einfügen von Bitcode kann Apple Ihre App-Binärdatei in Zukunft erneut optimieren, ohne eine neue Version Ihrer App an den Store senden zu müssen.
Was ist eingebetteter Bitcode?
Laut Dokumentation :
Update: Dieser Satz in „Neue Funktionen in Xcode 7“ hat mich für eine lange Zeit zu denken , dass Bitcode für erforderlich Slicing App Größe zu reduzieren:
Dies ist jedoch nicht der Fall. Bitcode und Slicing funktionieren unabhängig voneinander: Beim Slicing geht es darum, die App-Größe zu reduzieren und App-Bundle-Varianten zu generieren , und bei Bitcode geht es um bestimmte binäre Optimierungen. Ich habe dies überprüft, indem ich die in ausführbaren Dateien von Nicht-Bitcode-Apps enthaltenen Architekturen überprüft und festgestellt habe, dass sie nur die erforderlichen enthalten.
Mit Bitcode können andere App-Ausdünnungskomponenten namens Slicing App-Bundle-Varianten mit bestimmten ausführbaren Dateien für bestimmte Architekturen generieren, z. B. enthält die iPhone 5S-Variante nur die ausführbare Datei arm64, das iPad Mini armv7 usw.Wann muss ENABLE_BITCODE in neuem Xcode aktiviert werden?
Was passiert mit der Binärdatei, wenn ENABLE_BITCODE im neuen Xcode aktiviert ist?
Aus Xcode 7 Referenz:
Hier sind einige Links, die zum tieferen Verständnis von Bitcode beitragen :
quelle
Da die genaue Frage lautet: "Was macht Bitcode?", Möchte ich einige dünne technische Details nennen, die ich bisher herausgefunden habe. Das meiste davon ist praktisch nicht mit 100% iger Sicherheit herauszufinden, bis Apple den Quellcode für diesen Compiler veröffentlicht
Zuerst Apples Bitcode nicht erscheint dasselbe wie LLVM Bytecode zu sein. Zumindest konnte ich keine Ähnlichkeit zwischen ihnen feststellen. Es scheint einen proprietären Header zu haben (beginnt immer mit "xar!") Und wahrscheinlich eine Referenzmagie zur Verbindungszeit, die Datenverdopplungen verhindert. Wenn Sie eine fest codierte Zeichenfolge schreiben, wird diese Zeichenfolge nur einmal in die Daten eingefügt und nicht zweimal, wie dies bei einem normalen LLVM-Bytecode zu erwarten wäre.
Zweitens wird Bitcode nicht wie erwartet als separate Architektur im Binärarchiv ausgeliefert. Es wird nicht auf die gleiche Weise ausgeliefert, wie beispielsweise x86 und ARM in einer Binärdatei (FAT-Archiv) zusammengefasst sind. Stattdessen verwenden sie einen speziellen Abschnitt in der architekturspezifischen MachO-Binärdatei mit dem Namen "__LLVM", der mit jeder unterstützten Architektur geliefert wird (dh dupliziert wird). Ich gehe davon aus, dass dies mit ihrem Compilersystem ein Mangel ist und möglicherweise in Zukunft behoben wird, um die Duplizierung zu vermeiden.
C-Code (kompiliert mit
clang -fembed-bitcode hi.c -S -emit-llvm
):LLVM IR-Ausgang:
Das Datenarray im IR ändert sich auch in Abhängigkeit von der Optimierung und anderen Einstellungen für die Codegenerierung von clang. Mir ist völlig unbekannt, in welchem Format oder in welchem Format dies ist.
BEARBEITEN:
Dem Hinweis auf Twitter folgend, habe ich mich entschlossen, dies erneut zu besuchen und zu bestätigen. Ich folgte diesem Blog-Beitrag und benutzte sein Bitcode-Extraktor-Tool, um die Apple Archive-Binärdatei aus der ausführbaren MachO-Datei zu entfernen. Und nachdem ich das Apple-Archiv mit dem Dienstprogramm xar extrahiert hatte, bekam ich dies (natürlich mit llvm-dis in Text konvertiert)
Der einzige bemerkenswerte Unterschied zwischen dem Nicht-Bitcode-IR und dem Bitcode-IR besteht darin, dass die Dateinamen für jede Architektur auf nur 1, 2 usw. reduziert wurden.
Ich habe auch bestätigt, dass der in eine Binärdatei eingebettete Bitcode nach Optimierungen generiert wird. Wenn Sie mit -O3 kompilieren und den Bitcode extrahieren, ist dies anders als beim Kompilieren mit -O0.
Und um zusätzliche Gutschriften zu erhalten, habe ich auch bestätigt, dass Apple beim Herunterladen einer iOS 9-App keinen Bitcode an Geräte sendet. Sie enthalten eine Reihe anderer seltsamer Abschnitte, die ich nicht als __LINKEDIT erkannt habe, aber sie enthalten kein __LLVM .__-Bundle und scheinen daher keinen Bitcode in der endgültigen Binärdatei zu enthalten, die auf einem Gerät ausgeführt wird. Seltsamerweise liefert Apple immer noch fette Binärdateien mit separatem 32/64-Bit-Code an iOS 8-Geräte.
quelle
xar!
ist Archivdateiformat von Apple.Grundsätzlich ähnelt dieses Konzept Java, bei dem Bytecode auf verschiedenen JVMs ausgeführt wird. In diesem Fall wird der Bitcode im iTune-Speicher abgelegt und statt den Zwischencode an verschiedene Plattformen (Geräte) weiterzugeben, wird der kompilierte Code bereitgestellt, der nicht benötigt wird jede auszuführende virtuelle Maschine.
Daher müssen wir den Bitcode einmal erstellen und er wird für vorhandene oder kommende Geräte verfügbar sein. Es ist das Problem von Apple, zu kompilieren und es mit jeder Plattform kompatibel zu machen, die sie haben.
Entwickler müssen keine Änderungen vornehmen und die App erneut senden, um neue Plattformen zu unterstützen.
Nehmen wir das Beispiel des iPhone 5s, als Apple einen
x64
Chip einführte . Obwohlx86
Apps vollständig mit derx64
Architektur kompatibel waren, mussx64
der Entwickler die Architektur oder einen Code ändern, um die Plattform vollständig nutzen zu können . Sobald er fertig ist, wird die App zur Überprüfung an den App Store gesendet.Wenn dieses Bitcode-Konzept früher gestartet wurde, müssen wir Entwickler keine Änderungen vornehmen, um die
x64
Bit-Architektur zu unterstützen.quelle
Aktualisieren
Apple hat klargestellt, dass das Schneiden unabhängig von der Aktivierung des Bitcodes erfolgt. Ich habe dies auch in der Praxis beobachtet, wo eine nicht Bitcode-fähige App nur als die für das Zielgerät geeignete Architektur heruntergeladen wird.
Original
Genauer gesagt :
So wie ich das lese, erhalten Downloader Ihrer App, wenn Sie Bitcode unterstützen, nur die kompilierte Architektur, die für ihr eigenes Gerät erforderlich ist.
quelle