そのため、Xamarin.Formsを使用してアプリを開発するのに苦労した後、今日リリースビルドを作成しようとすると、アプリのサイズが最大25MBから最大31MBになることにショックを受けました(SDKのみのリンク、ProGuard、apkの作成後)各アビについて)。私のリソースフォルダはKB単位です。 apkは実際にはデバッグモードでわずか5MBで、それを見てとても幸せでした。これは、リリースモードでは使用しない「共有ランタイムを使用する」オプションが原因であることに後で気付きました。
次に、空のXamarin.Androidアプリを作成しようとしましたが、Linking SDKとユーザーアセンブリ、ProGuard、各abiのAPKを使用したリリースビルドは、依然として最大8MBから最大13MBです。
以下のリンクによると、Hello Worldアプリでの最小サイズは2.9MBですが、そのようなサイズを作成することはできません。 https://developer.xamarin.com/guides/Android/advanced_topics/application_package_sizes/
私のアプリと私が作成した空のアプリの場合、必要なdllは高いようです(例:mscorlib.dllは2.2 MBですが、リンク後にリンクが示すように1 mbになります)これが後のアセンブリフォルダーとして表示されるものですapkの抽出
最近のマイクロソフトの技術会議の1つで、「9 News」アプリ(以下のリンク)がxamarinを使用して構築されており、作成者がステージにいることを偶然知りました。しかし、アプリのサイズには驚きました。たった5.85MBです。それがどのように達成されるのかわかりませんか?
誰かがこれらを手伝ってくれる?
https://play.google.com/store/apps/details?id=nineNewsAlerts.nine.com
マイクロソフトがアプリのパッケージサイズを改善するために何かをしているのかどうかも知りたいですか?または、.NET Coreをxamarinに導入した場合、これは解決されますか?
Xamarin Android APKファイルは、C#コードをJavaコードに変換してAndroid OSで実行するXamarinライブラリが含まれているため、通常よりもサイズが大きくなります。
次のオプションを使用して、APKサイズを減らすことができます。
印刷画面の例を次に示します。
これが、GooglePlayコンソールからのXamarin.Formsアプリのサイズの統計です。対象を真剣に受け止め、デフォルトのXamarin設定から移動するとすぐに、どれだけ低下したかがわかります。
主題をグーグルで検索するときに通常見られる手段(リンク、独自のリソースの監視、ABIごとのAPKなど)に加えて、ここに私自身の発見と癖のいくつかがあります:
aapt2パッケージャーを有効にすると、App Compat libsリソース(Xamarin.Formsによって参照および含まれるリソース)のみが最大1MB削減されます。あなたがあなた自身の資源の多くを持っているならば、より多くを与えるかもしれません。 Androidの.csprojファイルで次の追加の引数を使用することにより、aapt2でリソースをさらにストライピングすることができます。
<PropertyGroup> <AndroidUseAapt2>true</AndroidUseAapt2> <AndroidAapt2LinkExtraArgs>--no-version-vectors -c en-rUS</AndroidAapt2LinkExtraArgs> </PropertyGroup>
D8とR8をオンにすると、小さなXamarin.Formsアプリでさらに約1MBが得られます(プロジェクトオプション-> Androidオプションまたは.csproj)
<PropertyGroup> <AndroidDexTool>d8</AndroidDexTool> <AndroidLinkTool>r8</AndroidLinkTool> </PropertyGroup>
SkiaSharp 1.60.3は、最新バージョン(1.68.0など)と比較して、アーキテクチャごとに最大2MBの経済性を提供します。 APKを肥大化させる依存関係とそのバージョンを探すことは価値があります。
AoTを無効にすると(以前に有効にしていた場合は、デフォルトでオフになっています)、アプリのサイズを簡単に半分に減らすことができます。 Ahead-of-Timeコンプリケーションをオンにすることは、アプリの起動パフォーマンスを向上させるための意図的なステップであった可能性があります。明確なトレードオフがあります。AoTを使用してアプリのサイズを大きくするORアプリを持たず、アプリの起動が遅い場合はサイズを最小限に抑える。決定する際のポイントの1つトレードオフについて...ほとんどのASO記事(およびGoogle Playコンソール)では、インストールのコンバージョンを増やすためにアプリのサイズを小さくすることがいかに重要であるかについて言及しています。GooglePlayを閲覧すると、アプリの起動ではなく、アプリのダウンロードサイズが表示されることは明らかです。時間。
AoTを調整してフットプリントを最小化するには、リリース構成の.csprojに以下を追加します。
<PropertyGroup> <AotAssemblies>true</AotAssemblies> <AndroidAotAdditionalArguments>no-write-symbols,nodebug</AndroidAotAdditionalArguments> </PropertyGroup>
部分的なAoTを実行しています。デフォルトでは、AoTはプロジェクトによって解決されたすべてのアセンブリを調べ、APKの/ libディレクトリに30以上の.soファイルを追加します。多数のアプリ互換ライブラリ、BCL、システムライブラリがあります。パフォーマンスとアプリサイズの間のスイートスポットを見つけるために、AoTを通過させるアセンブリと無視するアセンブリを制御したい場合があります。ええと、標準機能として利用できるものはありません(少なくとも私はそれを見つけられませんでした)。 Xamarin.Android.Common.targetsに変更を加えることで、Xamarinビルドプロセスを試すことができます-このプロセスに関するいくつかの洞察を見つけることができます ここ 。私は3つのライブラリ(1つは自分のXF共有UIライブラリと2つはXFライブラリ)だけをAoTすることで中庸を見つけました:
<_ResolvedUserAssemblies2 Include = "Tmp/Android/assets/Xamarin.Forms.Core.dll; Tmp/Android/assets/Saplin.CPDT.UICore.dll; Tmp/Android/assets/Xamarin.Forms.Platform.Android.dll;" />
追伸:リンクの有効化(SDKとユーザーアセンブリ)-XAMLとバインディングを広範囲に使用している場合、90%の確率でアプリが壊れていることに気付くでしょう。独自のライブラリをリンカー例外に追加します-UIをホストするXFクラスライブラリ、作成したクラスライブラリ、およびリフレクションを使用する可能性のあるクラスライブラリ。
PPS:ミニファイの取り組み、部分的なAoT、非同期/遅延Xamarin.Forms UIの読み込み( ここ および ここ )で、アプリのサイズが大幅に縮小されました(写真を参照)。上記)アプリの起動時間が大幅に改善されました(ADBを介してNokia N1で測定):