詳細がわからないと、明確な答えを出すのは難しいです。アプリケーションのサイズに影響を与える可能性のあるものはたくさんあります。基本から始めましょう。
確認すべきこと:
まず、アプリケーションが Don't link でビルドされていないことを確認してください。Xamarin.iOS が出荷するほぼ完全な .NET フレームワークをAOT するため、非常に大きなアプリケーションが作成されます。
次に、単一のアーキテクチャ (ARMv7) 用にビルドしていることを確認してください。FAT バイナリ (ARMv7 や ARMv7s など) は 2 回ビルドされ、2 倍のスペースが必要です。
3 番目に、デバッグビルドを有効にしていないことを確認します(リリース ビルドでは有効にすることができます。これはチェックボックスです)。これにより、デバッグをサポートするためのより大きなバイナリが作成されます。
4 番目に、 LLVMコンパイラを使用していることを確認します。コンパイルに時間がかかりますが、生成されるコードはより優れた (そしてより小さく) なります。
これらの初期チェックは非常に簡単に実行でき、非常に大きなバイナリを取得する最も一般的な理由です。
サイズの由来を理解するには、アプリケーションがどのように構築されているかを知る必要があります。
Android 版と iOS 版の主な違いは、iOS では JIT (ジャストインタイム コンパイル) が許可されていないことです (Apple の規則)。
つまり、コードを AOT 処理 (事前コンパイル) する必要があり、そのプロセスにより、はるかに大きな実行可能ファイルが作成されます (IL はネイティブ コードよりもはるかにコンパクトであるため)。
コードがジェネリックに重きを置いている場合、最終的なバイナリは、すべてのジェネリックの可能性をネイティブにコンパイルする必要があるため、非常に大きくなる可能性があります (多くのケースは共有できますが、値型は共有できません)。
サイズを小さくするためにできること:
- まず、マネージコードのサイズを小さくしてみてください。これを行う簡単な方法は、すべてのアセンブリでリンカーを有効にすることです。つまり、プロジェクト オプションですべてのアセンブリをリンクします。
多くの人は、自分のコードをリンクする価値はないと考えています。なぜなら、実行時にコードが必要になることを知っているからです (したがって、リンカーはコードを削除できません)。
それは半分本当です。リンカーはアプリケーション コードのほとんどを削除できない可能性がありますが、サード パーティのアセンブリを使用している場合、100% 使用されているとは限りません。リンカーは、その余分なコードを削除できます (また、不要なコードをサポートするために保持されているすべてのコードを SDK から削除します)。共有コードが多ければ多いほど、リンカが役立ちます。
IL コードが少ないということは、AOT 時間が速くなることを意味し、ビルドが速くなり、最終的なバイネアが小さくなります (実行可能サイズを含む)。
注: リンカを制御して一部のアセンブリ、一部の型、またはメソッドを処理/削除からスキップする方法については、多くのドキュメントとブログ エントリがあります。
- 次に、ネイティブサイズを小さくしてみてください。ネイティブ ライブラリを構築している場合は、最終的なバイナリに (動的ではなく)静的にリンクされるため、もう一度確認してください (iOS アプリケーションの別のルール)。それらのいくつかは、最終的なバイナリで(機能的に)価値がないかもしれません(そして、より軽い代替手段があるかもしれません)。