Flutter - Comment réduire la taille de l'application sur l'appareil

17

La taille de téléchargement de mon ensemble d'applications dans Google PlayStore est d'environ 23 Mo :

entrez la description de l'image ici

Mais pourquoi après l'installation, la taille de l'application sur le disque augmente considérablement à 83 Mo :

entrez la description de l'image ici

entrez la description de l'image ici

Toute idée pourquoi cela se produit, car:

1) Fichier d'actifs Flutter (images, sons et polices) sur des projets d'environ 11 Mo

2) Taille du code source Flutter (.dart) sur le disque seulement 1,4 Mo

3) Ressource / icône Android native (Res) seulement environ 800 Ko

concernant le plugin de flutter que j'utilise ci-dessous:

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

Toute idée Comment réduire la taille de l'application ?

Merci d'avance...

MISE À JOUR

Si je mets minifyEnabled = trueet shrinkResources = true( comme suggéré par Ravinder Kumar ) dans mon build.gradlealors cela générera une très longue erreur, voici le journal:

== Construire pour Android ==

... (J'ai coupé le journal des erreurs car très long, mais le journal complet peut être vu ici: https://www.dropbox.com/s/jy92d1lmj9pgb6d/full_flutter_error_log.txt?dl=0 )

Remarque: la configuration conserve le point d'entrée 'io.flutter.plugins.googlesignin.GoogleSignInPlugin $ Delegate $ 3 {void onComplete (com.google.android.gms.tasks.Task); } ', mais pas la classe de descripteurs' com.google.android.gms.tasks.Task '

Remarque: la configuration conserve le point d'entrée 'io.flutter.plugins.inapppurchase.Translator {java.util.HashMap fromSkuDetail (com.android.billingclient.api.SkuDetails); } ', mais pas la classe de descripteurs' com.android.billingclient.api.SkuDetails '

Remarque: la configuration conserve le point d'entrée 'io.flutter.plugins.inapppurchase.Translator {java.util.HashMap fromPurchase (com.android.billingclient.api.Purchase); } ', mais pas la classe de descripteurs' com.android.billingclient.api.Purchase '

Remarque: la configuration conserve le point d'entrée 'io.flutter.plugins.inapppurchase.Translator {java.util.HashMap fromPurchasesResult (com.android.billingclient.api.Purchase $ PurchasesResult); } ', mais pas la classe de descripteurs' com.android.billingclient.api.Purchase $ PurchasesResult '

Remarque: il y avait 7 références à des classes inconnues.

     You should check your configuration for typos.

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

Remarque: il y avait 3 références à des élèves inconnus.

     You should check your configuration for typos.

Remarque: il y avait 242 classes de descripteurs non maintenues dans les membres de classe conservés.

     You should consider explicitly keeping the mentioned classes

     (using '-keep').

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

Remarque: il y avait 68 références dynamiques non résolues à des classes ou des interfaces.

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

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

Avertissement: il y avait 25 références non résolues à des classes ou des interfaces.

        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)

Avertissement: il y avait 2 références non résolues aux membres de la classe de bibliothèque.

        You probably need to update the library versions.

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

Avertissement: exception lors du traitement de la tâche java.io.IOException: veuillez d'abord corriger les avertissements ci-dessus.

Thread (Tasks limiter_1): destruction Exécution de la tâche Gradle 'bundleRelease' ... 690.7s (!)

************************************************** **********************> ******************* L'échec de Gradle peut être dû à AndroidX> incompatibilités dans cette application Flutter. Voir "https: //goo.gl / CP92wY" pour plus d'informations sur le problème et> comment le résoudre. ************************************************** **********************> ******************* Ensemble de tâches Gradle La libération a échoué avec le code de sortie 1

Échec de la construction: | Impossible de créer pour Android

btw, ci-dessous est mon 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 { *; }
coderInrRain
la source
Peut-être que cela a quelque chose à voir avec les instantanés de fléchettes. github.com/dart-lang/sdk/wiki/Snapshots
aligator

Réponses:

6

Ma réponse est basée sur le document officiel ,


En dehors de ceux-ci, vous devez activer proguard pour réduire la taille de l'apk et empêcher l'ingénierie inverse de l'application. À Flutter,

Pour rendre votre application aussi petite que possible, vous devez activer la réduction dans votre version pour supprimer le code et les ressources inutilisés.

Par défaut, Flutter n'obscurcit ni ne minimise l'hôte Android. Si vous avez l'intention d'utiliser des bibliothèques Java, Kotlin ou Android tierces, vous souhaiterez peut-être réduire la taille de l'APK ou protéger ce code de l'ingénierie inverse.

Suivez ce lien pour activer progaurd dans votre application,

Étape 1: Étape 1 - Configurer Proguard Créez un /android/app/proguard-rules.profichier et ajoutez les règles répertoriées ci-dessous.

## 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.**

Étape 2: activer l'obscurcissement et / ou la minification

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'

        }
    }

Remarque: Utilisez Proguard uniquement dans l'apk de production.

Lisez également Pourquoi la taille de mon application sur l'appareil est-elle différente de la taille de l'APK ou du Play Store


Une application dépend également des bibliothèques natives et la plupart des bibliothèques natives sont des bibliothèques de framework Android qui sont également disponibles sur l'appareil, donc elles ne seront pas regroupées dans l'apk / aab. Mais ces bibliothèques seront incluses dans les fichiers odex et élargiront donc sa taille une fois installées.

Question: Quelle est la prévention possible?

Réponse: Minimisez l'utilisation des ressources des bibliothèques

Si une bibliothèque a été conçue pour un serveur ou un bureau, elle peut inclure de nombreux objets et méthodes dont votre application n'a pas besoin. Pour inclure uniquement les parties de la bibliothèque dont votre application a besoin, vous pouvez modifier les fichiers de la bibliothèque si la licence vous permet de modifier la bibliothèque. Vous pouvez également utiliser une bibliothèque alternative adaptée aux mobiles pour ajouter des fonctionnalités spécifiques à votre application.

Remarque: le rétrécissement du code peut nettoyer une partie du code inutile d'une bibliothèque, mais il peut ne pas être en mesure de supprimer certaines grandes dépendances internes.

Lisez également les étapes mentionnées ici

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

Ravinder Kumar
la source
si je minifyEnabled = trueshrinkResources = true
mets
J'ai mis à jour ma question concernant votre réponse ...
coderInrRain
Avez-vous créé le fichier /android/app/proguard-rules.pro, veuillez lire ceci ?
Ravinder Kumar
oui, veuillez lire ma réponse mise à jour, je poste le contenu de proguard-rules.proen bas ...
coderInrRain
Vous voudrez peut-être lire ceci , et il y a un problème ouvert dans le référentiel de flutter GitHub concernant votre problème. Il semble que les plugins google ou firebase semblent être en conflit avec progaurd, sinon, cela devrait fonctionner correctement.
Ravinder Kumar
0

Créez votre application en utilisant la commande mentionnée ci-dessous:

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

ou

flutter build appbundle --target-platform android-arm,android-arm64
Rudresh Narwal
la source
Cette méthode affectera-t-elle App Sizeaprès l'installation ou App Download Sizeuniquement?
coderInrRain
Cette méthode réduira la taille de l'application pour les deux cas.
Rudresh Narwal
Après une semaine, je peux confirmer en voyant Playstore Apps Vital que votre méthode n'est toujours pas réussie - la taille de l'application est toujours la même que celle du début ...
coderInrRain
0

Pour générer un bundle d'applications, exécutez:

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

En savoir plus sur: https://developer.android.com/guide/app-bundle

Pour diviser les APK par ABI, exécutez:

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

En savoir plus sur: https://developer.android.com/studio/build/configure-apk-splits#configure-abi-split

Arun R. Prajapati
la source
Quel est le but d'utiliser split par ABI?
coderInrRain
séparer le code 64 et 86 bits
Arun R. Prajapati