Google PlayStoreでの私のApp Bundleのダウンロードサイズはおよそ23 MBです:
しかし、インストール後、ディスク上のアプリサイズが83 MBに大幅に増加する理由:
これが発生する理由:
1)プロジェクトのFlutterのアセットファイル(画像、サウンド、フォント)のみ11 MB
2)ディスクのみのフラッターソースコード(.Dart)のサイズ1.4 MB
3)Androidネイティブリソース/アイコン(Res)のみ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
任意のアイデアどのようにサイズを小さくするApp?
前もって感謝します...
[〜#〜]更新[〜#〜]
minifyEnabled = true
およびshrinkResources = true
(Ravinder Kumarによって提案されたとおり)build.gradle
その後、非常に長いエラーが生成されます。ここにログがあります:
==ビルドAndroid ==
...(エラーログは非常に長いためカットしましたが、ここでは完全なログが表示されます: https://www.dropbox.com/s/jy92d1lmj9pgb6d/full_flutter_error_log .txt?dl = )
注:構成ではエントリポイント '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の処理中の例外:最初に上記の警告を修正してください。
Thread(Tasks 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 { *; }
私の答えは 公式文書 に基づいています
これらとは別に、apkのサイズを減らすためにプロガードを有効にする必要があるだけでなく、アプリのリバースエンジニアリングを防止する必要があります。Flutterでは、
アプリをできるだけ小さくするには、リリースビルドで圧縮を有効にして、未使用のコードとリソースを削除する必要があります。
デフォルトでは、FlutterはAndroidホストを難読化または縮小しません。サードパーティのJava、Kotlin、またはAndroidライブラリを使用する場合は、 APKのサイズを縮小するか、そのコードをリバースエンジニアリングから保護します。
このリンク に従って、アプリでプログラムを有効にし、
ステップ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
下記のコマンドを使用してアプリをビルドします。
flutter build apk --release --split-per-abi
または
flutter build appbundle --target-platform Android-arm,Android-arm64
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