1. ホーム
  2. アイオス

[解決済み】Xcodeのビルドオプション「Enable bitcode」Yes/Noの影響について

2022-04-06 19:57:41

質問

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

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

でその警告を消すことができることは承知しています。 この回答 しかし、AppStoreへの登録や、私のアプリの実際のパフォーマンスに関して、何か悪い影響があるのかどうか、今考えています。

Xcodeはビットコードに関する情報を提供します

<ブロッククオート

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

しかし、この文章から本当に役に立つ情報を得ることはできません。

  • リンク先の回答を使って、悪影響を与えず、将来のAppStoreへの投稿を損なうことなく、この問題を回避することは可能ですか?
  • は何を意味しているのでしょうか? ENABLE_BITCODE 将来的には、オプションではない要件になるのでしょうか?
  • 有効化/無効化した場合、パフォーマンスに影響はありますか?

解決方法は?

<ブロッククオート
  • ENABLE_BITCODEは実際に何をするのですか、将来的には非オプションの要件になるのでしょうか。

どのレベルの回答を求めているのかわからないので、少し旅をしてみましょう。すでにご存知の方もいらっしゃるかもしれませんが。

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

ENABLE_BITCODEオプションは、この最後のステップをカットします。これは、IRビットコードバイナリを持つアプリのバージョンを作成します。これには多くの素晴らしい機能がありますが、1つの大きな欠点があります。ビットコードバイナリを持つアプリを実行するためには、ビットコードを再コンパイルする必要があります ( アセンブルされたとか、トランスコードされたとか...正しい動詞は分かりませんが...。 をx86またはARMのバイナリに変換します。

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

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

<ブロッククオート
  • 上記の方法は、悪影響を与えず、将来のAppStoreへの登録を損なうことなく使用できますか?

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

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

しかし、テスト用アプリの内部配布はより複雑になる可能性があります。

ポジティブな影響については......それは複雑ですね。

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

また、ビットコードの再コンパイル時( アセンブルされた、あるいはトランスコードされた......また、正しい動詞がわからないのですが......。 )、最適化されます。LLVMは常に新しい、より良い最適化を生み出すために努力している。理論的には、App Storeは、LLVMの新しいリリースごとに、App Storeのアプリの別バージョンを再作成することができるので、あなたのアプリは、最新のLLVM技術で再最適化される可能性があります。