Xamarin for AndroidでAOTがサポートされていることを知っています。ソフトウェアが無料になった後、その機能もすべて無料になりました。ドキュメントを読み、次のようにproject.csprojファイルを変更してAOTを有効にしました。
<AotAssemblies>True</AotAssemblies>
プロジェクトパスにスペースが含まれていない(プロセスが壊れている)ことを確認した後、ビルドを実行したところ、APKにbothマネージド.NET DLL andネイティブコンパイル済みライブラリが含まれています。残念なことに、アプリは.NET DLLを使用しており、ネイティブライブラリを完全に無視しているようです。これを解決する方法はありますか?
編集:他のいくつかのモノAOT関連の質問を読んで、これはそれが機能するはずの方法であるかもしれないようです。私は、JITからAOTに切り替えた後、変更されなかった最大2秒の起動時間を短縮するためにアプリをAOTコンパイルしたかったのです。誰かがこれを私に説明してくれませんか?
ボーナス:高度な最適化フラグを有効にする方法はありますか? (例-o)
アセンブリ/コードをAOTしても、アプリの初期化の起動は変更されません(ネイティブアプリbootstrap + Xamarin/Mono初期化BUTにコード実行時間は含まれません)。
ここで、[〜#〜] x [〜#〜]を実行している場合、コード内でCPUにバインドされている作業量、たとえばOnCreate
(実際にしてはいけない(= /// =)しない)、合計時間の減少が見られます(する必要があります)。私はすべきであるというのは、AOTを実行しても、コードの特定の部分の実行時間の高速化が保証されるわけではないため、ジッターは解消されますが、関与する他の多くの要因。私は長年Mono(AOT w /&w/o LLVM)を使用しており、実際にyourコードを計測してテストする必要があります。
JITモードは非常に高速であり、Monoのデフォルトの最適化は、最適化とJIT速度のバランスがとれるように調整されていますが、AOTコンパイルにはいくつかの利点があります。
- 起動時間の短縮。
注:これは、動作する前に多くのコードを実行する必要がある大規模なプログラムで特に役立ちます...
- パフォーマンスが向上する可能性があります。
注:....これは、生成されたコードがJITが生成できる特定のコードよりも一般的であるため、特定のプログラムの実行が遅くなる可能性があることを意味します。
参照: http://www.mono-project.com/docs/advanced/aot/
AOTコードの最適化の観点から、リリース/ビルドでLLVMとAOTを有効にして、パフォーマンス/計測テストを有効にします。注:テストが重要です。完全なアプリテストスイートを用意し、ランタイムパフォーマンスを収集するための内部計測がアプリストアでこれらの5つ星のレビューを取得するための鍵です;-)
EnableLLVM
Ahead-of-TimeコンパイルアセンブリをネイティブコードにコンパイルするときにLLVMを使用するかどうかを決定するブールプロパティ。このプロパティのサポートはXamarin.Android 5.1で追加されました。
このプロパティはデフォルトでFalseです。
$(AotAssemblies)MSBuildプロパティがTrueでない限り、このプロパティは無視されます。
AotAssemblies
アセンブリをAhead-of-Timeでネイティブコードにコンパイルし、.apkに含めるかどうかを決定するブールプロパティ。このプロパティのサポートは、Xamarin.Android 5.1で追加されました。
このプロパティはデフォルトでFalseです。
Android .csprojの<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
セクションに<AotAssemblies>True</AotAssemblies>
を追加すると、一致するかどうかに関係なく、起動時間が10秒から4秒に短縮されました。その後、削除しましたAotAssembliesを使用して再試行したところ、10秒になりました。AotAssembliesは何かを行います:)