Xcodeビルドオプションの影響「ビットコードを有効にする」はい/いいえ


238

昨日、parse.comライブラリに関する大量の警告を認識しました。

緊急: '[path] /Parse.framework/Parse(PFAnalytics.o)'がビットコードなしでビルドされたため、すべてのビットコードが削除されます。ビットコードを有効にして再構築するか(Xcode設定ENABLE_BITCODE)、ベンダーから更新されたライブラリを入手するか、このターゲットのビットコードを無効にする必要があります。注:これは将来のエラーになります。

この回答でこれらの警告を削除できることは承知していますが、AppStoreへの送信やアプリの実際のパフォーマンスに関してマイナスの影響があるかどうか疑問に思っています。

Xcodeはビットコードについて通知します

この設定をアクティブにすると、ターゲットまたはプロジェクトが、それをサポートするプラットフォームおよびアーキテクチャのコンパイル中にビットコードを生成する必要があることを示します。アーカイブビルドでは、リンクされたバイナリにビットコードが生成され、アプリストアに送信されます。他のビルドの場合、コンパイラーとリンカーは、コードがビットコード生成の要件に準拠しているかどうかをチェックしますが、実際のビットコードは生成しません。[ENABLE_BITCODE]

しかし、私はこのテキストから本当に有用な情報を得ていません。

  • リンクされた回答を使用して、悪影響を与えたり、将来のAppStore送信を損なうことなく問題を回避できますか?
  • ENABLE_BITCODE実際には何をしますか?将来的には必須ではなくなりますか?
  • 有効/無効にするとパフォーマンスに影響がありますか?

回答:


398
  • ENABLE_BITCODEは実際には何をしますか?将来的にはオプションではなくなりますか?

どんなレベルで答えを探しているのかわからないので、少し旅に出ましょう。あなたがすでに知っているかもしれないこのいくつか。

プロジェクトをビルドすると、XcodeはclangObjective-Cターゲットおよびswift/ swiftcのSwiftターゲットを呼び出します。これらのコンパイラはどちらもアプリを中間表現(IR)にコンパイルします。これらのIRの1つはビットコードです。このIRから、LLVMと呼ばれるプログラムが引き継ぎ、x86 32および64ビットモード(シミュレータ用)およびarm6 / arm7 / arm7s / arm64(デバイス用)に必要なバイナリを作成します。通常、これらの異なるバイナリはすべて、ファットバイナリと呼ばれる1つのファイルにまとめられます。

ENABLE_BITCODEオプションは、この最後のステップを省略します。IRビットコードバイナリでアプリのバージョンを作成します。これには多くの優れた機能がありますが、大きな欠点の1つは、どこでも実行できないことです。ビットコードバイナリを含むアプリを実行するには、ビットコードを再コンパイルする必要があります(アセンブルまたはトランスコードされている可能性があります...正しい動詞がわかりません) x86またはARMバイナリに)。

ビットコードアプリがApp Storeに送信されると、Appleはこの最後のステップを実行し、完成したバイナリを作成します。

現在、ビットコードアプリはオプションですが、歴史はAppleがオプションのものを要件(64ビットサポートなど)に変えることを示しています。これには通常数年かかるため、サードパーティの開発者(Parseなど)は更新する時間があります。

  • 上記の方法を使用して、悪影響を与えたり、将来のアプリストアの提出を損なうことはありませんか?

はい、ENABLE_BITCODEをオフにすれば、すべてが以前と同じように機能します。AppleがビットコードアプリをApp Storeの要件にするまでは、問題ありません。

  • 有効/無効にするとパフォーマンスに影響がありますか?

有効にしてもパフォーマンスに悪影響はありませんが、テスト用のアプリの内部配布はさらに複雑になる可能性があります。

プラスの影響については…まあそれは複雑です。

App Storeで配布する場合、Appleは、ファットバイナリを持つ1つのアプリではなく、マシンアーキテクチャ(arm6 / arm7 / arm7s / arm64)ごとに異なるバージョンのアプリを作成します。つまり、iOSデバイスにインストールされるアプリは小さくなります。

さらに、ビットコードが再コンパイルされると(多分アセンブルまたはトランスコードされる…繰り返しますが、正しい動詞がわかりません)、最適化されます。LLVMは常に、新しいより良い最適化の作成に取り組んでいます。理論的には、App StoreはLLVMの新しいリリースごとにApp Storeでアプリの個別のバージョンを再作成できるため、最新のLLVMテクノロジーでアプリを再最適化できます。


19
「Appleは、ファットバイナリを持つ1つのアプリではなく、マシンアーキテクチャ(arm6 / arm7 / arm7s / arm64)ごとに異なるバージョンのアプリを作成します。これは、iOSデバイスにインストールされるアプリが小さくなることを意味します。」それがスライシングです。これはビットコードとは無関係です。
user102008、2015

10
「ENABLE_BITCODEオプションは、この最後のステップを省略します。」それはステップを切り取りません。すべてのアーキテクチャバイナリは引き続き生成されます。PLUSビットコード情報が各アーキテクチャに追加されます。stackoverflow.com/a/31030741/102008を参照してください
user102008

6
developer.apple.com/library/prerelease/watchos/documentation/…を参照してください。「スライスは、さまざまなターゲットデバイス用のApp Bundleのバリアントを作成して配信するプロセスです。バリアントには、ターゲットに必要な実行可能なアーキテクチャとリソースのみが含まれています端末。"
user102008、2015

7
ビットコードを有効にすると、ビットコードが無効になっている場合と比較して、デバイスにインストールされているアプリが小さくなるというのは真実ではありません。それはどこにもそれを言っていません。
user102008

7
@ onmyway133すべてのベンダーがソースを提供するわけではありません。ベンダーが提供するすべてが静的libとヘッダーファイル(またはフレームワーク)である場合、ベンダーはビットコードを有効にしてコンテンツをコンパイルする必要があります。
Jeffery Thomas


35

ビットコードはiOS 9の新機能です

ビットコードは、コンパイルされたプログラムの中間表現です。iTunes Connectにアップロードしたビットコードを含むアプリは、App Storeでコンパイルおよびリンクされます。ビットコードを含めると、Appleはアプリの新しいバージョンをストアに送信しなくても、将来アプリバイナリを再最適化できるようになります。

注:iOSアプリの場合、ビットコードがデフォルトですがオプションです。ビットコードを提供する場合、App Bundleのすべてのアプリとフレームワークにビットコードを含める必要があります。watchOSアプリの場合、ビットコードが必要です

したがって、アプリのすべてのフレームワークでビットコードが有効になるまで、ビットコードを無効にする必要があります。


「将来的にアプリバイナリを再最適化する」-もう少し説明できますか?
genaks

ここでは、「ビットコードはiOS 9の新機能」であり、「[...] watchOSアプリの場合、ビットコードが必要です[...]」と記載されています。では、iOS 8でWatchOSアプリを作成したい場合はどうなりますか?
superpuccio

33

ビットコードにより、クラッシュレポートが困難になります。以下は、HockeyAppからの引用です他のクラッシュレポートソリューションにも当てはまります)。

アプリをApp Storeにアップロードし、「ビットコード」チェックボックスを有効にしたままにすると、Appleはそのビットコードビルドを使用し、デバイスに配布する前にエンドビットで再コンパイルします。これにより、バイナリが新しいUUIDを取得し、Xcodeを介して対応するdSYMをダウンロードするオプションがあります。

注:回答は2016年1月に編集され、最新の変更が反映されています


2
9月と12月の間に、これは新しいXcode Organizerエクスポートオプション(引用されたHA howtoの更新を参照)で修正され、再び壊れました(私の解決したHA質問を参照)
Pavel Zdenek

13

@ vj9 thx。xcode 7に更新します。同じエラーが表示されます。「NO」に設定した後、うまく構築する

ここに画像の説明を入力してください

「NO」に設定するとうまく機能します。

ここに画像の説明を入力してください


1
@Septronic YESを選択する場合。これをサポートするすべての3番目のフレームワークを確認する必要があります。
zszen 2015

サポートされているターゲットの最小iOSバージョンは、iOS 6以降である必要があります。
浅いThought

9

ここでは、ビットコードに関するすべてのソリューションを見つけることができます

Apple Docによる

ビットコードは、コンパイルされたプログラムの中間表現です。iTunes Connectにアップロードしたビットコードを含むアプリは、ストアでコンパイルおよびリンクされます。ビットコードを含めると、Appleはアプリの新しいバージョンをストアに送信しなくても、将来アプリバイナリを再最適化できるようになります。

Xcodeはデフォルトでビルド時に生成されるシンボルを非表示にするため、Appleはそれらを読み取ることができません。アプリをiTunes Connectにアップロードするときに記号を含めることを選択した場合のみ、記号がAppleに送信されます。Appleからクラッシュレポートを受け取るには、記号を含める必要があります。

注: iOSアプリの場合、ビットコードがデフォルトですがオプションです。watchOSおよびtvOSアプリの場合、ビットコードが必要です。ビットコードを提供する場合、アプリバンドル内のすべてのアプリとフレームワーク(プロジェクト内のすべてのターゲット)にビットコードを含める必要があります。iTunes Connectを使用してアプリを配布した後、「デバイス」ウィンドウでのクラッシュの表示とインポートで説明されているように、ビルド用のdSYMsファイルをダウンロードできます。

あるタイプのハードウェアから別のタイプのハードウェアにアップグレードする際の問題により、正しいバージョンのバイナリが復元されなかったため、ビットコードとアプリの間引きサービスのAppleの最初のロールアウトは保留されました。この問題はその後iOS 9.0.2で修正され、機能が再度有効になりました。

ビットコードは常にLLVMのコンパイルおよび最適化フェーズの一部でしたが、バックエンドロジックをAppleサーバーに移動することにより、最適化およびアセンブルフェーズを開発者のコ​​ンパイル時からApp Storeのデプロイメントに移行します。これにより、将来の再最適化または再変換の可能性が解放され、より新しくより高速なプロセッサが将来サポートされます。ビットコードのデプロイメントは、watchOSとtvOSのデプロイメントに必要であり、プロジェクト設定の「ビットコードを有効にする」オプションを使用して、既存のiOSデプロイメントに対して条件付きで有効にすることができます。これにより、デバッグビルドにはフラグembed-bitcode-marker、アーカイブ/デバイスビルドにはembed-bitcodeが追加されます。これらは、-embed-bitcodeを使用して、または-fembed-bitcodeを指定したclangを使用して、Swiftコンパイラーに渡すことができます。

ビットコードにはいくつかの欠点もあります。開発者は、アップルに出荷されたバイナリに対応するデバッグシンボルのコピーを保存することにより、アプリケーションからクラッシュレポートをデバッグできます。特定のスタックでクラッシュが発生した場合、開発者はこれらのデバッグシンボルを使用して、クラッシュレポートをシンボル表示することにより、元のスタックトレースを復元できます。ただし、シンボルは中間形式をバイナリに変換することの副産物です。ただし、その手順がサーバーで実行されると、この情報は失われます。Appleは、開発者がアプリケーションの公開時にデバッグシンボルをアップロードした場合、デバッガーの役割を果たすことができるクラッシュレポートサービスを提供しています。開発者が正確なバイナリを決して見ないという事実は、新しいハードウェアが進化するにつれて、特定の問題をテストできない可能性があることを意味します。

最後に、サーバーのビットコードを変換して、新しいアーキテクチャと命令セットが進化するにつれてそれらをサポートできます。それらが呼び出し規約とアライメントとワードのサイズを維持するという条件で、ビットコードアプリケーションは異なるアーキテクチャタイプに変換され、特に新しいプロセッサ用に最適化される可能性があります。数学およびベクトルルーチンの標準ライブラリを使用する場合、これらをプロセッサ固有のベクトル命令に最適化して、特定のアプリケーションで最高のパフォーマンスを得ることができます。オプティマイザは、複数の異なるエンコーディングを生成し、サイズまたは実行速度に基づいて判断することもできます。

詳しくはこちらこちらをご確認ください


6

ドキュメントから

  • 上記の方法を使用して、悪影響を与えたり、将来のアプリストアの提出を損なうことはありませんか?

ビットコードを使用すると、別のビルドを送信しなくても、アップルがアプリを最適化できます。ただし、この機能を有効にできるのは、App Bundleのすべてのフレームワークとアプリでこの機能が有効になっている場合のみです。持っていることは役立ちますが、持っていなくても悪影響はありません。

  • ENABLE_BITCODEは実際には何をしますか?将来的にはオプションではなくなりますか?

iOSアプリの場合、ビットコードがデフォルトですが、オプションです。ビットコードを提供する場合、App Bundleのすべてのアプリとフレームワークにビットコードを含める必要があります。watchOSアプリの場合、ビットコードが必要です。

  • 有効/無効にするとパフォーマンスに影響がありますか?

App Storeとオペレーティングシステムは、最小限のフットプリントでユーザーの特定のデバイスの機能に合わせてアプリの配信を調整することにより、iOSアプリとwatchOSアプリのインストールを最適化します。アプリのシンニングと呼ばれるこの最適化により、ほとんどのデバイス機能を使用するアプリを作成し、ディスク容量を最小限に抑え、アップルが適用できる将来のアップデートに対応できます。他のアプリやコンテンツのダウンロードが高速になり、容量が増えることで、ユーザーエクスペリエンスが向上します。

パフォーマンスへの影響はありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.