Flutter-デバイスのアプリサイズを縮小する方法


17

Google PlayStoreでのApp Bundleのダウンロードサイズは約23 MBです。

ここに画像の説明を入力してください

しかし、インストール後、ディスク上のアプリサイズが83 MBに大幅に増加するのはなぜですか。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

これが発生する理由:

1)Flutterの約11 MBのみのプロジェクトのアセットファイル(画像、サウンド、フォント)

2)ディスク上のフラッターソースコード(.dart)のサイズはわずか1.4 MB

3)Androidネイティブリソース/アイコン(解像度)は約800 KB

以下で使用するフラッターのプラグインに関して:

dependencies:
  flutter:
    sdk: flutter
  flutter_localizations:
    sdk: flutter
  angles: ^1.0.1
  app_settings: ^1.0.5
  archive: ^2.0.8
  cached_network_image: ^1.1.1
  carousel_slider: ^1.3.0
  cron: ^0.2.1
  crypto: ^2.0.6
  cupertino_icons: ^0.1.2
  date_format: ^1.0.5
  device_id: ^0.1.3
  dio: ^2.0.0
  easy_alert: ^0.0.2
  localstorage: ^2.0.0
  audioplayers: ^0.13.1
  path_provider: ^1.1.0
  esys_flutter_share: ^1.0.2
  flutter_compass: ^0.3.2
  flutter_html: ^0.9.6
  flutter_local_notifications: ^0.8.2
  flutter_offline: ^0.2.4+1
  flutter_swiper: ^1.1.6
  flutter_xlider: ^2.4.5
  font_awesome_flutter: ^8.2.0
  geolocator: ^5.0.1
  google_maps_flutter: ^0.2.0
  google_sign_in: ^4.0.1+1
  http: ^0.12.0+2
  libcalendar: ^0.2.0
  location : ^2.3.0
  numberpicker: ^1.0.0
  pigment: ^1.0.3
  rxdart: ^0.21.0
  shared_preferences: ^0.5.1+1
  shimmer: ^1.0.0
  unicode: ^0.1.0
  url_launcher: ^5.0.2
  validate: ^1.6.0
  vibrate: ^0.0.4
  after_layout: ^1.0.7+2
  draggable_scrollbar: ^0.0.4
  flutter_web_browser: ^0.11.0
  flutter_youtube: ^1.1.6
  google_api_availability: ^2.0.1
  indexed_list_view: ^0.0.5
  permission_handler: ^3.1.0
  queries: ^0.1.4
  rect_getter: ^0.0.1
  scroll_to_index: any
  sqflite: ^1.1.5
  tuple: ^1.0.2
  xml2json: ^3.0.3
  firebase_messaging: ^5.1.6
  firebase_analytics: ^3.0.2
  firebase_core: ^0.4.0+3
  firebase_auth: ^0.11.1+6
  firebase_admob: ^0.9.0+1
  firebase_in_app_messaging: ^0.0.1+3
  superellipse_shape: ^0.1.5
  device_info: ^0.4.0+2
  in_app_purchase: ^0.2.0+6
  sentry: any
  system_info: ^0.1.1
  highlighter_coachmark: ^0.0.3
  volume: ^0.1.0
  admob_flutter: ^0.3.2
  bubble_tab_indicator: "^0.1.4"
  material_design_icons_flutter: ^3.0.3289
  scoped_model: ^1.0.1
  flutter_slidable: ^0.4.9
  kiwi: ^0.1.0
  flutter_markdown: ^0.2.0
  flutter_downloader: ^1.2.1
  native_ads: ^0.2.0  
  onesignal_flutter: ^2.0.0

サイズのアプリを削減する方法?

前もって感謝します...

更新

私が設定しminifyEnabled = trueshrinkResources = trueRavinder Kumarによって提案されているようにbuild.gradle非常に長いエラーを生成する場合、ログは次のとおりです。

== Android向けのビルド==

... (非常に長いためエラーログを切りましたが、完全なログがここに表示されます:https : //www.dropbox.com/s/jy92d1lmj9pgb6d/full_flutter_error_log.txt?dl=0

注:構成ではエントリポイント 'io.flutter.plugins.googlesignin.GoogleSignInPlugin $ Delegate $ 3 {void onComplete(com.google.android.gms.tasks.Task);が保持されます。} '、ただし記述子クラス「com.google.android.gms.tasks.Task」は除く

注:設定ではエントリポイント 'io.flutter.plugins.inapppurchase.Translator {java.util.HashMap fromSkuDetail(com.android.billingclient.api.SkuDetails);が保持されます。} 'ですが、記述子クラス' com.android.billingclient.api.SkuDetails 'ではありません

注:設定ではエントリポイント 'io.flutter.plugins.inapppurchase.Translator {java.util.HashMap fromPurchase(com.android.billingclient.api.Purchase);が保持されます。} '、ただし記述子クラス' com.android.billingclient.api.Purchase 'は除く

注:設定はエントリポイントを保持します 'io.flutter.plugins.inapppurchase.Translator {java.util.HashMap fromPurchasesResult(com.android.billingclient.api.Purchase $ PurchasesResult); } '、ただし記述子クラス' com.android.billingclient.api.Purchase $ PurchasesResult 'は除く

注:不明なクラスへの参照が7つありました。

     You should check your configuration for typos.

    (http://proguard.sourceforge.net/manual/troubleshooting.html#unknownclass)

注:不明なクラスメンバーへの参照が3つありました。

     You should check your configuration for typos.

注:保存されたクラスメンバーには242個の不必要な記述子クラスがありました。

     You should consider explicitly keeping the mentioned classes

     (using '-keep').

     (http://proguard.sourceforge.net/manual/troubleshooting.html#descriptorclass)

注:クラスまたはインターフェースへの未解決の動的参照が68個ありました。

     You should check if you need to specify additional program jars.

     (http://proguard.sourceforge.net/manual/troubleshooting.html#dynamicalclass)

警告:クラスまたはインターフェースへの未解決の参照が25個ありました。

        You may need to add missing library jars or update their versions.

        If your code works fine without the missing classes, you can suppress

        the warnings with '-dontwarn' options.

        (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedclass)

警告:ライブラリクラスメンバーへの未解決の参照が2つありました。

        You probably need to update the library versions.

        (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedlibraryclassmember)

警告:タスクjava.io.IOExceptionの処理中の例外:最初に上記の警告を修正してください。

スレッド(タスクlimiter_1):破棄Gradleタスク 'bundleRelease'を実行しています... 690.7秒(!)

************************************************** **********************> ******************* Gradleの失敗は、 AndroidX>このFlutterアプリの非互換性。問題の詳細と修正方法については、「https://goo.gl / CP92wY」を参照してください。************************************************** **********************> ******************* GradleタスクbundleReleaseが終了コード1で失敗しました

ビルドに失敗しました:| Android用にビルドできませんでした

ところで、以下は私のものproguard-rules.proです:

#Flutter Wrapper
-keep class io.flutter.app.** { *; }
-keep class io.flutter.plugin.**  { *; }
-keep class io.flutter.util.**  { *; }
-keep class io.flutter.view.**  { *; }
-keep class io.flutter.**  { *; }
-keep class io.flutter.plugins.**  { *; }
-keep class com.baseflow.** { *; }
#-keep class com.chartboost.** { *; }

-dontwarn com.google.common.base.**
-keep class com.google.common.base.** {*;}
-dontwarn com.google.errorprone.annotations.**
-keep class com.google.errorprone.annotations.** {*;}
-dontwarn com.google.j2objc.annotations.**
-keep class com.google.j2objc.annotations.** { *; }
-dontwarn java.lang.ClassValue
-keep class java.lang.ClassValue { *; }
-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
-keep class org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement { *; }

多分それはダーツのスナップショットと関係があります。github.com/dart-lang/sdk/wiki/Snapshots
アリゲーター

回答:


6

私の答えは公式文書に基づいています


これらとは別に、アプリのリバースエンジニアリングを防止するだけでなく、proguard有効にしてapkのサイズを小さくする必要がありますFlutterでは、

アプリをできるだけ小さくするには、リリースビルドで圧縮を有効にして、未使用のコードとリソースを削除する必要があります。

デフォルトでは、FlutterはAndroidホストを難読化または縮小しません。サードパーティのJava、Kotlin、またはAndroidライブラリを使用する場合は、APKのサイズを小さくするか、そのコードをリバースエンジニアリングから保護する必要があります。

フォローこのリンクをお使いのアプリでprogaurdを有効にするために、

ステップ1:ステップ1-Proguardの構成/android/app/proguard-rules.proファイルを 作成し、以下にリストされているルールを追加します。

## Flutter wrapper
-keep class io.flutter.app.** { *; }
-keep class io.flutter.plugin.**  { *; }
-keep class io.flutter.util.**  { *; }
-keep class io.flutter.view.**  { *; }
-keep class io.flutter.**  { *; }
-keep class io.flutter.plugins.**  { *; }
-dontwarn io.flutter.embedding.**

ステップ2:難読化や縮小を有効にする

android {

    ...

    buildTypes {

        release {

            signingConfig signingConfigs.release

            minifyEnabled true
            shrinkResources true// to shrink your image resource read more at https://developer.android.com/studio/build/shrink-code
            useProguard true// enables progaurd

            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

        }
    }

注:プロガードはプロダクションAPKでのみ使用してください。

また、 「デバイス上のアプリサイズがAPKまたはPlayストアのサイズと異なる理由」をご覧ください。


アプリもネイティブライブラリに依存しており、ほとんどのネイティブライブラリはデバイスで利用できるAndroidフレームワークライブラリであるため、apk / aabにバンドルされません。ただし、これらのライブラリはodexファイルに含まれるため、インストールするとサイズが拡大します。

質問:可能な予防策は何ですか?

回答: ライブラリからのリソースの使用を最小限に抑える

ライブラリがサーバーまたはデスクトップ用に設計されている場合は、アプリに不要な多くのオブジェクトやメソッドを含めることができます。アプリで必要なライブラリの部分のみを含めるには、ライセンスでライブラリの変更が許可されている場合は、ライブラリのファイルを編集できます。モバイルフレンドリーな代替ライブラリを使用して、アプリに特定の機能を追加することもできます。

注:コード圧縮により、ライブラリの不要なコードの一部をクリーンアップできますが、大きな内部依存関係を削除できない場合があります。

ここで言及されているステップも読んでください

https://developer.android.com/topic/performance/reduce-apk-size#reduce-code


設定するminifyEnabled = trueshrinkResources = true、多くのエラーが発生します
coderInrRain

私はあなたの答えに関する私の質問を更新しています...
coderInrRain

ファイル/android/app/proguard-rules.proを作成しましたか?これを読んでください?
Ravinder Kumar

はい、私の最新の答えを読んでくださいproguard-rules.pro、下部にコンテンツを投稿します...
coderInrRain

あなたはこれを読みたいかもしれません、そしてあなたの問題に関するフラッターGitHubリポジトリに未解決の問題があります。googleまたはfirebaseプラグインはprogaurdと競合しているようですが、それ以外の場合は問題なく動作するはずです。
Ravinder Kumar

0

下記のコマンドを使用してアプリをビルドします。

flutter build apk --release --split-per-abi    

または

flutter build appbundle --target-platform android-arm,android-arm64

この方法はApp Size、インストール後App Download Sizeのみに影響しますか?
coderInrRain

この方法では、どちらの場合もアプリのサイズが小さくなります。
Rudresh Narwal

1週間後、playstore Apps Vitalを見て、メソッドがうまくいかないことを確認できます-アプリのサイズはまだ
最初

0

App Bundleを生成するには、次を実行します。

 flutter build appbundle --target-platform android-arm,android-arm64

詳細:https : //developer.android.com/guide/app-bundle

ABIごとにAPKを分割するには、次のコマンドを実行します。

flutter build apk --target-platform android-arm,android-arm64 --split-per-abi

詳細:https : //developer.android.com/studio/build/configure-apk-splits#configure-abi-split


ABIごとに分割を使用する目的は何ですか?
coderInrRain

64ビットコードと86ビットコードを分離する
Arun R. Prajapati
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.