Bitcode: Was es ist, Zwischenbytecode und Kompilierung

Autor: IT Sectr Veröffentlicht: 2026-04-17 Lesezeit: 9 Min.

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 ein zwischengeschalteter LLVM-Bytecode, der während der Kompilierung eines iOS-Projekts generiert wird
  • App Store kompiliert Bitcode für den Prozessor des Benutzergeräts neu
  • Optimierung der Binärdateigröße wird durch hardwareabhängige Anweisungen erreicht
  • Aktivierung von Bitcode erfolgt in den Xcode-Einstellungen über das Flag Enable Bitcode
  • Einschränkung — Bitcode wird nur für iOS und tvOS unterstützt, nicht für macOS

Was ist Bitcode in der iOS-Entwicklung

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.

Geschichte von Bitcode

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.

Unterschied zwischen Bitcode und Maschinencode

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.

EigenschaftBitcodeMaschinencode
ArchitekturabhängigkeitUnabhängigAn CPU gebunden
BinärdateigrößeKompaktGrößer
NeukompilierungsfähigkeitJaNein
App Store-UnterstützungWird neukompiliertWird unverändert genutzt
DebuggingEingeschränktVolle 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.

Wie Bitcode in der iOS-Kompilierung funktioniert

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.

LLVM-Phase und Zwischencodegenerierung

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
// 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.

Neukompilierung im App Store

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.

Vorteile der Verwendung von Bitcode

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.

Optimierung für neue Architekturen

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.

Reduzierung der Binärdateigröße

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.

  • Automatische Anpassung an neue Prozessoren, ohne dass der Entwickler das Projekt neu erstellen muss
  • Verkürzung der Downloadzeit der Anwendung auf dem Benutzergerät
  • Vereinfachte Verteilung — ein Archiv für alle Architekturen, ein Metadatensatz
  • Zukunftskompatibilität — die Anwendung funktioniert auf noch nicht veröffentlichten Apple-Prozessoren

So aktivieren Sie Bitcode in einem Xcode-Projekt

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.

Konfiguration über Build Settings

objective-c
// 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 über das Terminal

bash
# Ü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.

Einschränkungen und Fallstricke von 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.

Bibliothekskompatibilität

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.

Debugging und Absturzberichte

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.

  • dSYM-Upload — zwingend erforderlich zum Dekodieren von Absturzprotokollen aus dem App Store nach der Neukompilierung
  • Archivgröße — .xcarchive mit Bitcode nimmt mehr Speicherplatz auf der Festplatte des Entwicklers ein
  • Build-Zeit — die Bitcode-Generierung verlängert die Kompilierungsphase des Projekts um etwa 10–15 %
  • macOS — Bitcode wird für macOS-Anwendungen und watchOS-Anwendungen nicht unterstützt
  • Legacy-Projekte — die Migration großer Projekte kann die Aktualisierung aller Abhängigkeiten erfordern

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

Ist die Aktivierung von Bitcode für die Veröffentlichung im App Store obligatorisch?

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.

Wie wirkt sich Bitcode auf die App-Größe im App Store aus?

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.

Müssen dSYM-Dateien hochgeladen werden, wenn Bitcode aktiviert ist?

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.

Unterstützt Swift Package Manager Bitcode?

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.

Was ist der Unterschied zwischen Bitcode und normalem Maschinencode?

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

  • Bitcode ist eine Zwischen-LLVM-IR-Darstellung, die beim Kompilieren von iOS-Anwendungen in Xcode generiert wird
  • App Store kompiliert Bitcode für die Architektur des Benutzergeräts neu und wendet App Thinning an
  • Größe der heruntergeladenen Anwendung wird durch Entfernen unnötiger Maschinenanweisungen um 15–40 % reduziert
  • Neue Apple-Prozessoren werden automatisch unterstützt, ohne dass der Entwickler ein Update erneut veröffentlichen muss
  • Aktivierung von Bitcode wird über das Flag Enable Bitcode in den Build Settings des Xcode-Projekts konfiguriert
  • Einschränkungen umfassen die Notwendigkeit von dSYM-Dateien für Absturzberichte und die Kompatibilität aller Drittanbieterbibliotheken
  • Empfehlung — Bitcode für neue Projekte aktivieren, aber die Unterstützung aller verwendeten Abhängigkeiten überprüfen

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.

Projekt besprechen

Lesen Sie auch