it-swarm.com.de

Auswirkung der Xcode-Erstellungsoptionen "Bitcode aktivieren" Ja / Nein

Gestern habe ich eine Menge Warnungen bezüglich der parse.com-Bibliothek erkannt:

DRINGEND: Der gesamte Bitcode wird gelöscht, da "[Pfad] /Parse.framework/Parse (PFAnalytics.o)" ohne Bitcode erstellt wurde. Sie müssen es mit aktiviertem Bitcode neu erstellen (Xcode-Einstellung ENABLE_BITCODE), eine aktualisierte Bibliothek vom Hersteller beziehen oder den Bitcode für dieses Ziel deaktivieren. Hinweis: Dies wird in Zukunft ein Fehler sein.

Mir ist bewusst, dass ich diese Warnung mit diese Antwort entfernen kann, ich frage mich jetzt jedoch, ob sie negative Auswirkungen auf die AppStore-Übermittlung und/oder die tatsächliche Leistung meiner App haben wird.

Xcode informiert Sie über Bitcode

Das Aktivieren dieser Einstellung gibt an, dass das Ziel oder Projekt während der Kompilierung für Plattformen und Architekturen, die dies unterstützen, Bitcode generieren soll. Bei Archiv-Builds wird der Bitcode in der verknüpften Binärdatei zur Übermittlung an den App Store generiert. Bei anderen Builds prüfen der Compiler und der Linker, ob der Code den Anforderungen für die Bitcode-Generierung entspricht, generieren jedoch keinen tatsächlichen Bitcode. [ENABLE_BITCODE]

Aber ich bekomme keine wirklich nützlichen Informationen aus diesem Text.

  • Kann ich die verknüpfte Antwort verwenden, um das Problem ohne negative Auswirkungen und ohne Beeinträchtigung einer zukünftigen AppStore-Übermittlung zu umgehen?
  • Was macht der ENABLE_BITCODE eigentlich, wird es in Zukunft eine nicht optionale Anforderung sein?
  • Gibt es irgendwelche Leistungseinbußen, wenn ich es aktiviere/deaktiviere?
219
luk2302
  • Was macht der ENABLE_BITCODE eigentlich? Wird er in Zukunft nicht mehr optional sein?

Ich bin mir nicht sicher, auf welcher Ebene Sie nach einer Antwort suchen. Machen wir also einen kleinen Ausflug. Einige davon kennen Sie vielleicht bereits.

Wenn Sie Ihr Projekt erstellen, ruft Xcode clang für Objective-C-Ziele und Swift/swiftc für Swift Ziele auf. Beide Compiler kompilieren die App zu einem Intermediate Representation (IR), einer dieser IRs ist der Bitcode. Von diesem IR übernimmt ein Programm namens LLVM und erstellt die Binärdateien, die für die 32- und 64-Bit-Modi x86 (für den Simulator) und arm6/arm7/arm7s/arm64 (für das Gerät) benötigt werden. Normalerweise werden alle diese verschiedenen Binärdateien in einer einzigen Datei zusammengefasst, die als fat binary bezeichnet wird.

Die Option ENABLE_BITCODE schneidet diesen letzten Schritt aus. Es wird eine Version der App mit einem IR-Bitcode-Binärcode erstellt. Dies hat eine Reihe von netten Funktionen, aber einen großen Nachteil: Es kann nirgendwo laufen. Damit eine App mit einer Bitcode-Binärdatei ausgeführt werden kann, muss der Bitcode neu kompiliert (, möglicherweise zusammengesetzt oder transkodiert werden. Ich bin mir nicht sicher, welches Verb richtig ist ) in eine x86- oder ARM-Binärdatei.

Wenn eine Bitcode-App an den App Store gesendet wird, führt Apple diesen letzten Schritt aus und erstellt die fertigen Binärdateien.

Momentan sind Bitcode-Apps optional, aber der Verlauf hat gezeigt, dass Apple optionale Dinge in Anforderungen umwandelt (wie 64-Bit-Unterstützung). Dies dauert in der Regel einige Jahre, sodass Entwickler von Drittanbietern (wie Parse) Zeit haben, um Updates durchzuführen.

  • kann ich die oben beschriebene Methode ohne negative Auswirkungen und ohne Beeinträchtigung einer zukünftigen Appstore-Übermittlung anwenden?

Ja, Sie können ENABLE_BITCODE deaktivieren und alles funktioniert wie zuvor. Bis Apple Bitcode-Apps zur Anforderung für den App Store macht, ist alles in Ordnung.

  • Gibt es irgendwelche Leistungseinbußen, wenn ich es aktiviere/deaktiviere?

Es wird niemals negative Auswirkungen auf die Leistung geben, aber die interne Verteilung einer App zum Testen kann komplizierter werden.

Was die positiven Auswirkungen betrifft ... nun, das ist kompliziert.

Für die Verteilung im App Store erstellt Apple separate Versionen Ihrer App für jede Maschinenarchitektur (arm6/arm7/arm7s/arm64) anstelle einer App mit einer fetten Binärdatei. Dies bedeutet, dass die auf iOS-Geräten installierte App kleiner ist.

Wenn der Bitcode neu kompiliert wird (, möglicherweise zusammengesetzt oder transkodiert), bin ich mir außerdem nicht sicher, welches Verb richtig ist ), wird er optimiert. LLVM arbeitet ständig daran, neue und bessere Optimierungen zu erstellen. Theoretisch könnte der App Store die separate Version der App im App Store mit jeder neuen Version von LLVM neu erstellen, sodass Ihre App mit der neuesten LLVM-Technologie erneut optimiert werden kann.

365
Jeffery Thomas

Stellen Sie sicher, dass Sie "Alle" auswählen, um die Einstellungen für die Bitcode-Erstellung zu finden:

Build settings

60
Gamma-Point

Bitcode ist eine neue Funktion von iOS 9

Bitcode ist eine Zwischendarstellung eines kompilierten Programms. Apps, die Sie zu iTunes Connect hochladen und die Bitcode enthalten, werden im App Store kompiliert und verlinkt. Durch das Einfügen von Bitcode kann Apple Ihre App-Binärdatei in Zukunft erneut optimieren, ohne dass eine neue Version Ihrer App an den Store gesendet werden muss.

Hinweis: Bei iOS-Apps ist Bitcode die Standardeinstellung, jedoch optional. Wenn Sie Bitcode bereitstellen, müssen alle Apps und Frameworks im App-Bundle Bitcode enthalten. Für watchOS-Apps ist ein Bitcode erforderlich

Daher sollten Sie Bitcode deaktivieren, bis für alle Frameworks Ihrer App Bitcode aktiviert ist.

33
agy

Bitcode erschwert das Melden von Abstürzen . Hier ist ein Zitat aus HockeyApp (das gilt auch für andere Crash-Reporting-Lösungen):

Wenn Sie eine App in den App Store hochladen und das Kontrollkästchen "Bitcode" aktiviert lassen, verwendet Apple diesen Bitcode-Build und kompiliert ihn am Ende erneut, bevor er an Geräte verteilt wird. Dies führt dazu, dass die Binärdatei eine neue UUID erhält, und es besteht die Möglichkeit, ein entsprechendes dSYM über Xcode herunterzuladen.

Hinweis: Die Antwort wurde am Januar 2016 bearbeitet, um die letzten Änderungen wiederzugeben.

31

@ vj9 thx. Ich aktualisiere auf xcode 7. Es zeigt mir den gleichen Fehler. Bauen Sie gut nach "NEIN"

enter image description here

setze "NEIN" es funktioniert gut.

enter image description here

11
zszen

Hier finden Sie alle Lösungen zu Bitcode

Gemäß Apple Doc

Bitcode ist eine Zwischendarstellung eines kompilierten Programms. Apps, die Sie zu iTunes Connect hochladen und die Bitcode enthalten, werden im Store kompiliert und verlinkt. Durch das Einfügen von Bitcode kann Apple Ihre App-Binärdatei in Zukunft erneut optimieren, ohne dass eine neue Version Ihrer App an den Store gesendet werden muss.

Xcode verbirgt standardmäßig Symbole, die während der Erstellungszeit generiert wurden, sodass sie von Apple nicht gelesen werden können. Nur wenn Sie beim Hochladen Ihrer App auf iTunes Connect die Option zum Einbeziehen von Symbolen auswählen, werden die Symbole an Apple gesendet. Sie müssen Symbole einfügen, um Absturzberichte von Apple zu erhalten.

Hinweis: Bei iOS-Apps ist Bitcode der Standardwert, jedoch optional. Für watchOS- und tvOS-Apps ist ein Bitcode erforderlich. Wenn Sie Bitcode bereitstellen, müssen alle Apps und Frameworks im App-Bundle (alle Ziele im Projekt) Bitcode enthalten. Nachdem Sie Ihre App mit iTunes Connect verteilt haben, können Sie die dSYMs-Datei für den Build herunterladen, wie in Anzeigen und Importieren von Abstürzen im Gerätefenster beschrieben

Die anfängliche Einführung des Bitcode- und App-Ausdünnungsdienstes durch Apple wurde ausgesetzt, da Probleme beim Upgrade von einem Hardwaretyp auf einen anderen Hardwaretyp nicht die richtigen Versionen der Binärdateien wiederherstellten. Dieses Problem wurde später mit iOS 9.0.2 behoben und die Funktion wieder aktiviert.

Bitcode war schon immer Teil der LLVM-Kompilierungs- und -Optimierungsphase. Durch Verschieben der Back-End-Logik auf die Apple Server werden jedoch die Optimierungs- und Assemblierungsphasen von der Entwickler-Kompilierungszeit bis zur App Store-Bereitstellung verschoben. Dies erschließt das Potenzial einer zukünftigen Neuoptimierung oder Neuübersetzung, um in Zukunft neuere und schnellere Prozessoren zu unterstützen. Bitcode-Bereitstellungen sind für watchOS- und tvOS-Deploments erforderlich und können für vorhandene iOS-Bereitstellungen mit der Option "Bitcode aktivieren" in den Projekteinstellungen bedingt aktiviert werden. Dies fügt ein Flag Embed-Bitcode-Marker für Debug-Builds und Embed-Bitcode für Archiv-/Geräte-Builds hinzu. Diese können mit -embed-bitcode oder mit clang mit -fembed-bitcode an den Compiler Swift übergeben werden.

Bitcode hat auch einige Nachteile. Entwickler können Absturzberichte von Anwendungen debuggen, indem sie Kopien der Debugsymbole speichern, die der an Apple gelieferten Binärdatei entsprechen. Wenn in einem bestimmten Stack ein Absturz auftritt, kann der Entwickler den ursprünglichen Stack-Trace wiederherstellen, indem er den Absturzbericht mithilfe dieser Debug-Symbole symbolisiert. Die Symbole sind jedoch ein Nebenprodukt der Übersetzung der Zwischenform in die Binärform. Wenn dieser Schritt jedoch auf dem Server ausgeführt wird, gehen diese Informationen verloren. Apple stellt einen Absturzberichtsdienst bereit, der die Rolle des Debuggers übernehmen kann, vorausgesetzt, der Entwickler hat die Debugsymbole zum Zeitpunkt der Veröffentlichung der Anwendung hochgeladen. Die Tatsache, dass der Entwickler niemals die exakte Binärdatei sieht, bedeutet, dass er möglicherweise nicht in der Lage ist, bestimmte Probleme zu testen, wenn sich neue Hardware entwickelt. Es gibt auch einige Bedenken hinsichtlich der Abtretung von Macht an Apple, um die Kompilierung durchzuführen - einschließlich der Fähigkeit, zusätzliche Routinen oder Code-Schnipsel einzufügen -, aber da Apple die vollständige Kontrolle über den Veröffentlichungsprozess hat, sind dies Derzeit möglich, unabhängig davon, ob der Entwickler Bitcode oder kompilierte Binärdateien verwendet.

Schließlich kann der Bitcode auf dem Server übersetzt werden, um neue Architekturen und Befehlssätze bei ihrer Entwicklung zu unterstützen. Unter der Voraussetzung, dass die Aufrufkonvention und die Größe der Ausrichtung und der Wörter beibehalten werden, kann eine Bitcode-Anwendung in verschiedene Architekturarten übersetzt und speziell für einen neuen Prozessor optimiert werden. Wenn Standardbibliotheken für Mathematik- und Vektorroutinen verwendet werden, können diese in prozessorspezifische Vektoranweisungen optimiert werden, um die beste Leistung für eine bestimmte Anwendung zu erzielen. Die Optimierer können sogar mehrere verschiedene Codierungen generieren und anhand der Größe oder Ausführungsgeschwindigkeit beurteilen.

Weitere Informationen finden Sie unter hier und hier

7
Rex

Aus dem docs

  • kann ich die oben beschriebene Methode ohne negative Auswirkungen und ohne Beeinträchtigung einer zukünftigen Appstore-Übermittlung anwenden?

Mit dem Bitcode kann Apple die App optimieren, ohne dass Sie einen weiteren Build einreichen müssen. Sie können diese Funktion jedoch nur aktivieren, wenn für alle Frameworks und Apps im App-Bundle diese Funktion aktiviert ist. Es hilft, aber es nicht zu haben, sollte keine negativen Auswirkungen haben.

  • Was macht der ENABLE_BITCODE eigentlich? Wird er in Zukunft nicht mehr optional sein?

Bei iOS-Apps ist Bitcode die Standardeinstellung, jedoch optional. Wenn Sie Bitcode bereitstellen, müssen alle Apps und Frameworks im App-Bundle Bitcode enthalten. Für watchOS-Apps ist ein Bitcode erforderlich.

  • Gibt es irgendwelche Leistungseinbußen, wenn ich es aktiviere/deaktiviere?

Der App Store und das Betriebssystem optimieren die Installation von iOS- und watchOS-Apps, indem sie die App-Bereitstellung mit minimalem Platzbedarf auf die Funktionen des jeweiligen Geräts des Benutzers abstimmen. Mit dieser Optimierung, die als App-Ausdünnung bezeichnet wird, können Sie Apps erstellen, die die meisten Gerätefunktionen nutzen, minimalen Speicherplatz belegen und zukünftige Updates aufnehmen, die von Apple angewendet werden können. Schnellere Downloads und mehr Speicherplatz für andere Apps und Inhalte sorgen für eine bessere Benutzererfahrung.

Es sollten keine Leistungseinbußen auftreten.

4
vj9