266

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

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

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

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

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

しかし、私はこのテキストから本当に有益な情報を得ることができません.

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

7 に答える 7

445
  • ENABLE_BITCODE は実際に何をしますか? 将来的には必須ではなくなりますか?

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

プロジェクトをビルドすると、Xcode はclangObjective-C ターゲットおよびswift/ swiftcSwift ターゲットに対して呼び出します。これらのコンパイラはどちらもアプリを中間表現(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 テクノロジを使用してアプリを再最適化できます。

于 2015-07-03T12:41:53.443 に答える
36

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

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

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

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

于 2015-06-27T12:26:19.543 に答える
6

ドキュメントから

  • 悪影響を与えず、将来のアプリストアへの提出を損なうことなく、上記の方法を使用できますか?

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

  • ENABLE_BITCODE は実際に何をしますか? 将来的には必須ではなくなりますか?

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

  • 有効または無効にした場合、パフォーマンスに影響はありますか?

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

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

于 2015-07-03T11:45:57.513 に答える