Auswirkungen der Xcode-Erstellungsoptionen „Bitcode aktivieren“ Ja / Nein

238

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 erhalten oder den Bitcode für dieses Ziel deaktivieren. Hinweis: Dies wird in Zukunft ein Fehler sein.

Ich bin mir der Tatsache bewusst, dass ich diese Warnung mit dieser Antwort entfernen kann, frage mich jetzt jedoch, ob sich dies negativ auf die AppStore-Übermittlung und / oder die tatsächliche Leistung meiner App auswirkt.

Xcode informiert Sie über Bitcode

Wenn Sie diese Einstellung aktivieren, sollte das Ziel oder Projekt während der Kompilierung Bitcode für Plattformen und Architekturen generieren, die dies unterstützen. Bei Archiv-Builds wird 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 zu umgehen, ohne negative Auswirkungen zu haben und ohne eine zukünftige AppStore-Einreichung zu gefährden?
  • Was macht das ENABLE_BITCODEeigentlich, wird es in Zukunft eine nicht optionale Anforderung sein?
  • Gibt es Leistungseinbußen, wenn ich es aktiviere / deaktiviere?
luk2302
quelle

Antworten:

398
  • Was macht der ENABLE_BITCODE tatsächlich, wird er in Zukunft nicht optional sein?

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

Wenn Sie Ihr Projekt erstellen, ruft Xcode clangfür Objective-C-Ziele und swift/ oder swiftcfür Swift-Ziele auf. Beide Compiler kompilieren die App zu einer Intermediate Representation (IR). Eine dieser IRs ist Bitcode. Von diesem IR übernimmt ein Programm namens LLVM und erstellt die Binärdateien, die für die x86 32- und 64-Bit-Modi (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 einer IR-Bitcode-Binärdatei 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 in eine x86- oder ARM-Binärdatei neu kompiliert ( möglicherweise zusammengestellt oder transkodiert… ich bin mir nicht sicher, welches Verb korrekt ist ) werden.

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

Derzeit sind Bitcode-Apps optional, aber die Geschichte hat gezeigt, dass Apple optionale Dinge in Anforderungen umwandelt (z. B. 64-Bit-Unterstützung). Dies dauert normalerweise einige Jahre, sodass Entwickler von Drittanbietern (wie Parse) Zeit zum Aktualisieren haben.

  • Kann ich die oben beschriebene Methode ohne negative Auswirkungen und ohne Beeinträchtigung einer zukünftigen Appstore-Einreichung verwenden?

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

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

Die Aktivierung wird niemals negative Auswirkungen auf die Leistung haben, aber die interne Verteilung einer App zum Testen kann komplizierter werden.

Was positive Auswirkungen betrifft ... nun, das ist kompliziert.

Für die Verteilung im App Store erstellt Apple für jede Maschinenarchitektur (arm6 / arm7 / arm7s / arm64) separate Versionen Ihrer App 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… auch hier bin ich mir nicht sicher, welches Verb richtig ist ), wird er optimiert. LLVM arbeitet ständig daran, neue und bessere Optimierungen zu schaffen. Theoretisch könnte der App Store mit jeder neuen Version von LLVM die separate Version der App im App Store neu erstellen, sodass Ihre App mit der neuesten LLVM-Technologie neu optimiert werden kann.

Jeffery Thomas
quelle
19
"Apple erstellt für jede Maschinenarchitektur (arm6 / arm7 / arm7s / arm64) separate Versionen Ihrer App anstelle einer App mit einer fetten Binärdatei. Dies bedeutet, dass die auf iOS-Geräten installierte App kleiner ist." Das macht Slicing. Dies hat nichts mit Bitcode zu tun.
user102008
10
"Die Option ENABLE_BITCODE schneidet diesen letzten Schritt aus." Es schneidet keinen Schritt aus. Alle Architektur-Binärdateien werden weiterhin erstellt. PLUS-Bitcode-Informationen werden dann für JEDE Architektur hinzugefügt. Siehe stackoverflow.com/a/31030741/102008
user102008
6
Siehe developer.apple.com/library/prerelease/watchos/documentation/… "Beim Slicing werden Varianten des App-Bundles für verschiedene Zielgeräte erstellt und bereitgestellt. Eine Variante enthält nur die ausführbare Architektur und die Ressourcen, die für das Ziel benötigt werden Gerät."
user102008
7
Es ist keine echte Aussage, dass durch das Aktivieren von Bitcode die auf dem Gerät installierte App kleiner wird als bei deaktiviertem Bitcode. Nirgends heißt es so.
user102008
7
@ onmyway133 Nicht alle Anbieter geben die Quelle an. Wenn der Anbieter lediglich eine statische Bibliothek und Header-Dateien (oder ein Framework) bereitstellt, muss der Anbieter seine Inhalte mit aktiviertem Bitcode kompilieren lassen.
Jeffery Thomas
65

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

Einstellungen erstellen

Gammapunkt
quelle
35

Bitcode ist eine neue Funktion von iOS 9

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.

Hinweis: Für 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 Bitcode erforderlich

Daher sollten Sie den Bitcode deaktivieren, bis in allen Frameworks Ihrer App der Bitcode aktiviert ist.

agy
quelle
"Optimieren Sie Ihre App-Binärdatei in Zukunft neu" - können Sie etwas mehr erklären?
Genaks
Hier heißt es: "Bitcode ist eine neue Funktion von iOS 9" und "[...] Für watchOS-Apps ist Bitcode erforderlich [...]". Was ist, wenn ich eine WatchOS-App unter iOS 8 erstellen möchte?
Superpuccio
33

Bitcode erschwert die Meldung von Abstürzen . Hier ist ein Zitat von HockeyApp (das auch für alle anderen Crash-Reporting-Lösungen gilt):

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 neu, bevor er ihn an Geräte verteilt. Dies führt dazu, dass die Binärdatei eine neue UUID erhält und es eine Option gibt, ein entsprechendes dSYM über Xcode herunterzuladen.

Hinweis: Die Antwort wurde im Januar 2016 bearbeitet, um die neuesten Änderungen widerzuspiegeln

Alexander Vasenin
quelle
2
Zwischen September und Dezember konnte dies über die neue Exportoption von Xcode Organizer behoben werden (siehe das Update im zitierten HA-Howto) und erneut unterbrochen werden (siehe meine gelöste HA-Frage )
Pavel Zdenek
13

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

Geben Sie hier die Bildbeschreibung ein

setze "NEIN" es funktioniert gut.

Geben Sie hier die Bildbeschreibung ein

zszen
quelle
1
@Septronic Wenn Sie JA auswählen möchten. Sie müssen überprüfen, ob Ihr gesamtes drittes Framework dies unterstützt.
Zszen
Die mindestens unterstützte iOS-Version Ihres Ziels muss iOS 6 oder höher sein.
flach gedacht
9

Hier finden Sie alle Lösungen zu Bitcode

Gemäß Apple Doc

Bitcode ist eine Zwischendarstellung eines kompilierten Programms. Apps, die Sie auf iTunes Connect hochladen und die Bitcode enthalten, werden im 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.

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 zu iTunes Connect Symbole hinzufügen, werden die Symbole an Apple gesendet. Sie müssen Symbole einfügen, um Absturzberichte von Apple zu erhalten.

Hinweis: Für iOS-Apps ist Bitcode die Standardeinstellung, jedoch optional. Für watchOS- und tvOS-Apps ist 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, die unter Anzeigen und Importieren von Abstürzen im Gerätefenster beschrieben wird

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

Bitcode war schon immer Teil der LLVM-Kompilierungs- und Optimierungsphasen. Durch Verschieben der Back-End-Logik auf die Apple-Server werden jedoch die Optimierungs- und Assemblierungsphasen von der Kompilierungszeit des Entwicklers zur App Store-Bereitstellung verschoben. Dies eröffnet 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 unter bestimmten Bedingungen aktiviert werden. Dadurch wird ein Flag-Embed-Bitcode-Marker für Debug-Builds und ein Embed-Bitcode für Archiv- / Geräte-Builds hinzugefügt. Diese können mit -embed-Bitcode oder mithilfe von clang mit -fembed-Bitcode an den Swift-Compiler übergeben werden.

Bitcode hat auch einige Nachteile.Entwickler können Absturzberichte aus Anwendungen debuggen, indem sie Kopien der Debug-Symbole speichern, die der an Apple gelieferten Binärdatei entsprechen. Wenn ein Absturz in einem bestimmten Stapel auftritt, kann der Entwickler die ursprüngliche Stapelverfolgung wiederherstellen, indem er den Absturzbericht mithilfe dieser Debugsymbole 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 bietet einen Crash-Reporting-Service, der die Rolle des Debuggers übernehmen kann, vorausgesetzt, der Entwickler hat die Debug-Symbole zum Zeitpunkt der Veröffentlichung der Anwendung hochgeladen. Die Tatsache, dass der Entwickler niemals die genaue Binärdatei sieht, bedeutet, dass er möglicherweise nicht in der Lage ist, auf bestimmte Probleme zu testen, wenn sich neue Hardware entwickelt.

Endlich der Bitcode auf dem Server übersetzt werden, um neue Architekturen und Befehlssätze während ihrer Entwicklung zu unterstützen. Vorausgesetzt, sie behalten die Aufrufkonvention und die Größe der Ausrichtung und der Wörter bei, kann eine Bitcode-Anwendung in verschiedene Architekturtypen ü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 hier und hier

Rex
quelle
6

Aus den Dokumenten

  • Kann ich die oben beschriebene Methode ohne negative Auswirkungen und ohne Beeinträchtigung einer zukünftigen Appstore-Einreichung verwenden?

Mit 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 tatsächlich, wird er in Zukunft nicht optional sein?

Für 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 Bitcode erforderlich.

  • Gibt es 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 an die Funktionen des jeweiligen Geräts des Benutzers anpassen. Mit dieser Optimierung, die als App-Ausdünnung bezeichnet wird, können Sie Apps erstellen, die die meisten Gerätefunktionen nutzen, nur minimalen Speicherplatz belegen und zukünftige Updates berücksichtigen, 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.

vj9
quelle