Bitcode ist eine Zwischendarstellung eines Programms in der Kompilierungsphase einer iOS-Anwendung. Im Gegensatz zu Maschinencode ist Bitcode nicht an eine bestimmte Prozessorarchitektur gebunden. Laut Apple Developer Documentation kann der App Store Bitcode für die Zielarchitektur neu kompilieren, was die Leistung verbessert und die Größe der Installationsdatei reduziert. Der Entwickler sendet Bitcode an den App Store, und der Store selbst generiert eine optimierte Binärdatei für jeden Gerätetyp.
Wichtige Punkte
Bitcode ist eine Zwischendarstellung eines Programms (Intermediate Representation, IR), die von der LLVM-Compilerinfrastruktur generiert wird. Apple führte die Bitcode-Unterstützung ab Xcode 7 und iOS 9 als verbindliche Anforderung für watchOS-Anwendungen und optional für iOS und tvOS ein. Ab Xcode 14 wurde die Anforderung für alle Plattformen außer watchOS aufgehoben.
Das Konzept der Zwischencodedarstellung existiert seit den 2000er Jahren als Teil des LLVM-Projekts, das von Chris Lattner an der University of Illinois gegründet wurde. Apple adaptierte LLVM für Xcode im Jahr 2011 und stellte 2015 Bitcode als Möglichkeit vor, Anwendungen zu aktualisieren, ohne sie erneut an den App Store übermitteln zu müssen. Die Technologie wurde auf der WWDC 2015 in der Session „What's New in Xcode“ angekündigt.
Maschinencode besteht aus binären Anweisungen für einen bestimmten Prozessor: arm64, armv7 oder x86_64. Bitcode wird in einem hardwareunabhängigen Format gespeichert, sodass der App Store aus einer einzigen Quellendarstellung optimierte Binärdateien für verschiedene Architekturen generieren kann. Dieser wesentliche Unterschied bestimmt alle Vorteile der Technologie.
| Eigenschaft | Bitcode | Maschinencode |
|---|---|---|
| Architekturabhängigkeit | Unabhängig | An CPU gebunden |
| Binärdateigröße | Kompakt | Größer |
| Neukompilierungsfähigkeit | Ja | Nein |
| App Store-Unterstützung | Wird neukompiliert | Wird unverändert genutzt |
| Debugging | Eingeschränkt | Volle Unterstützung |
Bitcode ist keine ausführbare Datei. Es ist LLVM IR im Binärformat, das der Entwickler zusammen mit den Projektmetadaten an den App Store sendet. Der App Store führt den Neukompilierungsprozess durch und passt den Code an jede Zielplattform und Betriebssystemversion an.
Der Bitcode-Erzeugungsprozess beginnt mit dem Compiler-Frontend, das Swift- oder Objective-C-Quellcode in LLVM IR umwandelt. In der Verknüpfungsphase packt Xcode die IR in Dateien im .bc-Format (Bitcode), die dann zusammen mit dem .xcarchive an den App Store gesendet werden. Der App Store wiederum führt den Neukompilierungsprozess auf seiner Seite durch.
Die LLVM-Infrastruktur besteht aus drei Teilen: dem Frontend (Clang für C/ObjC, Swift Frontend für Swift), dem Middle-End-Optimierer und dem Backend (Maschinencode-Generator). Bitcode ist das Ergebnis der ersten beiden Phasen, ohne zur Generierung von Assembleranweisungen überzugehen. Der Middle-End führt plattformunabhängige Optimierungen durch: Totes-Code-Entfernung, Inlining und Konstantenfaltung.
// Swift-Quellcode-Beispiel
func calculateSum(a: Int, b: Int) -> Int {
return a + b
}
// LLVM IR nach Kompilierung (vereinfacht)
; define i32 @calculateSum(i32 %a, i32 %b)
; %result = add i32 %a, %b
; ret i32 %result
Nach der IR-Generierung führt der Compiler eine Reihe von Optimierungen auf Darstellungsebene durch: Totes-Code-Entfernung, Funktions-Inlining und Konstantenfaltung. Diese Optimierungen sind architekturunabhängig und bleiben in Bitcode erhalten. Bei der Neukompilierung im App Store werden architekturabhängige Optimierungen hinzugefügt, wie die Anweisungsumordnung für einen bestimmten Prozessor.
App Store Connect empfängt das Archiv mit Bitcode und führt eine eigene Kompilierungsinfrastruktur aus. Das System bestimmt die Zielarchitektur des Benutzergeräts und generiert Maschinencode, der zusätzlich für die spezifischen Prozessoreigenschaften optimiert wird. Für arm64e (A12+- und M-Serie-Prozessoren) werden zusätzliche Sicherheitsoptimierungen angewendet.
Dieser Prozess wird App Thinning genannt — eine Technologie, die nur die für die Architektur eines Geräts erforderlichen Ressourcen und Code an dieses Gerät liefert. Ein Benutzer mit einem iPhone mit A17 Pro-Prozessor erhält eine für arm64e optimierte Binärdatei ohne überflüssige Anweisungen für ältere Architekturen. Dies reduziert die Downloadzeit und spart Platz auf dem Gerät.
Bitcode bietet mehrere wichtige Vorteile für iOS-Anwendungsentwickler. Der wichtigste ist die automatische Optimierung für neue Apple-Prozessoren, ohne ein Update erneut an den App Store übermitteln zu müssen. Dies ist besonders relevant beim Übergang zu neuen Architekturen, wie dem Wechsel von armv7 zu arm64.
Wenn Apple einen Prozessor mit einer neuen Architektur veröffentlicht, werden Anwendungen, die mit Bitcode eingereicht wurden, automatisch dafür neukompiliert. Der Entwickler muss das Projekt nicht neu erstellen und ein Update veröffentlichen — der App Store erledigt dies auf seiner Seite beim ersten Download durch den Benutzer. Dies ist besonders wichtig für langlebige Anwendungen, die über Jahre hinweg gewartet werden.
App Thinning in Kombination mit Bitcode kann die Größe der installierten Anwendung um 15–40 % reduzieren. Der App Store generiert nur die Maschinenanweisungen, die für ein bestimmtes Gerät erforderlich sind, und löscht Code für andere Architekturen und Variationen für verschiedene iOS-Versionen. In der Praxis bedeutet dies, dass ein Benutzer mit einem neuen iPhone eine kompakte Binärdatei erhält.
Laut Apple WWDC 2015 Session 102 kann die Verwendung von Bitcode und App Thinning die Größe der heruntergeladenen Anwendung im Durchschnitt um 25 % im Vergleich zu einer universellen Binärdatei reduzieren, die alle Architekturen enthält. Bei einer 100 MB großen Anwendung kann die Einsparung auf dem Benutzergerät bis zu 40 MB betragen.
Die Bitcode-Konfiguration erfolgt in den Xcode-Buildeinstellungen. Der Parameter Enable Bitcode befindet sich in den Build Settings und ist für neue Projekte standardmäßig aktiviert, aber Entwickler können ihn fürs Debugging oder bei Verwendung von Drittanbieterbibliotheken ohne Bitcode-Unterstützung deaktivieren.
// Build Settings -> Apple Clang - Code Generation
// Enable Bitcode = YES
// Oder über Info.plist für einzelne Targets
@property (nonatomic, assign) BOOL enableBitcode;
- (void)configureBuildSettings {
// Überprüfung des Bitcode-Status in der Konfiguration
if (self.enableBitcode) {
NSLog(@"Bitcode is enabled for this target");
} else {
NSLog(@"Bitcode is disabled");
}
}
Um zu überprüfen, ob das Archiv Bitcode enthält, öffnen Sie die .xcarchive-Datei über den Xcode Organizer oder führen Sie den Befehl otool -l im Terminal aus. Das Vorhandensein eines __LLVM-Abschnitts in der Binärdatei bestätigt, dass Bitcode aktiviert und korrekt verpackt ist. Fehlt der Abschnitt, wurde Bitcode während des Builds nicht generiert.
# Überprüfung der Bitcode-Präsenz im Archiv
otool -l YourApp.app/YourApp | grep __LLVM
# Ausgabe: Wenn ein __LLVM-Abschnitt vorhanden ist — Bitcode ist vorhanden
# Wenn die Ausgabe leer ist — Bitcode ist nicht aktiviert oder nicht generiert
# Sie können auch mit dem size-Befehl überprüfen
size -m -l YourApp.app/YourApp | grep __LLVM
Bei Verwendung von Drittanbieterbibliotheken über CocoaPods oder SPM stellen Sie sicher, dass alle Abhängigkeiten mit Bitcode erstellt wurden. Wenn mindestens eine Bibliothek Bitcode nicht unterstützt, generiert Xcode während der Archivierung einen Verknüpfungsfehler. Für CocoaPods überprüfen Sie das Flag bitcode_enabled in den Subspecs oder verwenden Sie use_frameworks! mit enable_bitcode.
Bitcode ist keine universelle Lösung für alle Arten von iOS-Projekten. Die Technologie hat Einschränkungen, die der Entwickler berücksichtigen sollte, bevor er die Option in der Build-Konfiguration aktiviert. Das Verständnis dieser Einschränkungen hilft, Probleme bei der Archivierung und Veröffentlichung zu vermeiden.
Nicht alle Drittanbieterbibliotheken werden mit Bitcode-Unterstützung ausgeliefert. Wenn eine Bibliothek nur als kompilierte Binärdatei ohne Bitcode verteilt wird, lässt sich das Projekt mit aktivierter Option nicht erstellen. In diesem Fall muss der Entwickler entweder Bitcode deaktivieren oder eine Bitcode-fähige Version vom Anbieter anfordern. Dies ist besonders relevant für ältere Bibliotheken, die nicht mehr aktualisiert werden.
Absturzberichte von Anwendungen, die mit Bitcode erstellt wurden, erfordern eine zusätzliche Verarbeitung. Symbole (dSYM) für neukompilierten Code werden vom App Store generiert und sind über den Xcode Organizer zum Download verfügbar. Ohne das Laden der entsprechenden dSYM-Dateien ist der Aufrufstapel in Absturzberichten nicht lesbar, was die Diagnose von Problemen erschwert.
Ab iOS 17 und Xcode 15 verlangt Apple keine obligatorische Aktivierung von Bitcode für die Veröffentlichung im App Store. Für watchOS-Anwendungen bleibt Bitcode jedoch eine verbindliche Anforderung auf der Richtlinienebene von App Store Connect. Entwicklern wird empfohlen, Bitcode für neue Projekte zu aktivieren, wenn alle Abhängigkeiten es unterstützen.
Häufig gestellte Fragen
Für iOS- und tvOS-Anwendungen ist Bitcode ab Xcode 14 nicht obligatorisch. Für watchOS bleibt die Bitcode-Unterstützung verbindlich. Apple empfiehlt, Bitcode für neue Projekte zu aktivieren, blockiert aber die Veröffentlichung ohne es nicht.
Bitcode ermöglicht es dem App Store, App Thinning anzuwenden — Maschinencode nur für die Architektur des Benutzergeräts zu generieren. Dadurch wird die Größe der heruntergeladenen Binärdatei je nach Anzahl der im Projekt unterstützten Architekturen um 15–40 % reduziert.
Ja, dSYM-Dateien sind zur Symbolisierung von Absturzberichten aus neukompilierten Binärdateien erforderlich. Der App Store bietet die Möglichkeit, dSYM über den Xcode Organizer nach der Archivverarbeitung herunterzuladen. Ohne sie enthält der Aufrufstapel in Crashlytics und der Konsole nur Speicheradressen.
SPM unterstützt Bitcode, wenn Abhängigkeiten im Quellcode und nicht als Binärdateien verteilt werden. Binäre Abhängigkeiten über SPM müssen eine Version mit Bitcode bereitstellen, andernfalls wird ein Projekt mit aktivierter Option nicht kompiliert.
Bitcode ist eine hardwareunabhängige Zwischen-LLVM-IR-Darstellung, die nicht direkt von einem Prozessor ausgeführt werden kann. Maschinencode enthält fertige Anweisungen für eine bestimmte Architektur (arm64, x86_64) und wird ohne zusätzliche Kompilierung ausgeführt.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch