web-dev-qa-db-ja.com

Xamarin-apkアプリサイズ

そのため、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の抽出 enter image description here

最近のマイクロソフトの技術会議の1つで、「9 News」アプリ(以下のリンク)がxamarinを使用して構築されており、作成者がステージにいることを偶然知りました。しかし、アプリのサイズには驚きました。たった5.85MBです。それがどのように達成されるのかわかりませんか?

誰かがこれらを手伝ってくれる?

https://play.google.com/store/apps/details?id=nineNewsAlerts.nine.com

マイクロソフトがアプリのパッケージサイズを改善するために何かをしているのかどうかも知りたいですか?または、.NET Coreをxamarinに導入した場合、これは解決されますか?

13
My Helper

Xamarin Android AP​​Kファイルは、C#コードをJavaコードに変換してAndroid OSで実行するXamarinライブラリが含まれているため、通常よりもサイズが大きくなります。

次のオプションを使用して、APKサイズを減らすことができます。

  • 構成アクティブ(リリース)
  • プラットフォームアクティブ(任意のCPU)。これらは、GooglePlayストアのAPKを作成するために必要です。
  • 共有ランタイムを使用false。 trueに設定すると、APKはMonoランタイムを使用して実行します。 Monoランタイムは、USBを介してデバッグするときに自動的にインストールされますが、リリースAPKにはインストールされません。 Mono Runtimeがデバイスにインストールされておらず、リリースAPKでこのオプションがtrueに設定されている場合、アプリはクラッシュします。
  • 選択したABIごとに1つのパッケージ(.apk)を生成します:false。互換性の理由から、できるだけ多くのプラットフォーム用にAPKを作成してください。
  • Multi-Dexを有効にする:true、ただしfalseに設定できますアプリがそれほど複雑でない場合(つまり、65536未満の変数またはメソッドがある場合、 ここを参照 )。
  • リリースAPKの開発者インストルメンテーション(デバッグとプロファイリング)falseを有効にします。
  • LinkingSDKとユーザーアセンブリ。これにより、XamarinコンパイラがSDKとコードから未使用のクラスをすべて削除し、APKのサイズを縮小します。
  • サポートされているアーキテクチャ互換性の理由から、すべてを選択してください。

印刷画面の例を次に示します。

enter image description here

11
Alexandre

これが、GooglePlayコンソールからのXamarin.Formsアプリのサイズの統計です。対象を真剣に受け止め、デフォルトのXamarin設定から移動するとすぐに、どれだけ低下したかがわかります。

enter image description here

主題をグーグルで検索するときに通常見られる手段(リンク、独自のリソースの監視、ABIごとのAPKなど)に加えて、ここに私自身の発見と癖のいくつかがあります:

  • マネージドTLSプロバイダーの有効化最大1MB-デフォルトでは、プロジェクトオプション->で[ネイティブTLS1.2]オプションが選択されていますAndroidオプション->詳細ボタン-> SSL/TLS実装ドロップダウン。マネージドTLSはバージョン1.1のみであり、誰かからの問題である可能性があります
  • Xamarin.Forms 4.1にアップグレードすると、(3.xおよび4.0と比較して)最大1MBの削減が得られます-未使用であるが参照されているものの一部が削除されましたAndroid互換性ライブラリ
  • 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で測定):

  • AOTなし、同期UI(ms):3613、3586、3576
  • 部分AOT、非同期UI(ms):2202、2255、2258
1
Maxim Saplin