Flutter - Come ridurre le dimensioni dell'app sul dispositivo


17

La dimensione del download del mio pacchetto di app in Google PlayStore è di circa 23 MB :

inserisci qui la descrizione dell'immagine

Ma perché dopo l'installazione, la dimensione dell'app sul disco aumenta in modo significativo a 83 MB :

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

Qualche idea sul perché ciò accada, perché:

1) File delle risorse di Flutter (immagini, suoni e caratteri) su progetti solo circa 11 MB

2) Dimensione del codice sorgente Flutter (.dart) su disco solo 1,4 MB

3) Risorsa / icona nativa Android (Ris) solo circa 800 KB

per quanto riguarda il plugin di flutter che uso di seguito:

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

Qualche idea su come ridurre le app in termini di dimensioni ?

Grazie in anticipo...

AGGIORNARE

Se ho impostato minifyEnabled = truee shrinkResources = true( come suggerito da Ravinder Kumar ) nel mio build.gradlequindi genererà un errore molto lungo, ecco il registro:

== Creazione per Android ==

... (Ho tagliato il registro degli errori per molto tempo, ma il registro completo può essere visto qui: https://www.dropbox.com/s/jy92d1lmj9pgb6d/full_flutter_error_log.txt?dl=0 )

Nota: la configurazione mantiene il punto di ingresso 'io.flutter.plugins.googlesignin.GoogleSignInPlugin $ Delegate $ 3 {void onComplete (com.google.android.gms.tasks.Task); } ", ma non la classe del descrittore" com.google.android.gms.tasks.Task "

Nota: la configurazione mantiene il punto di ingresso 'io.flutter.plugins.inapppurchase.Translator {java.util.HashMap fromSkuDetail (com.android.billingclient.api.SkuDetails); } ", ma non la classe descrittiva" com.android.billingclient.api.SkuDetails "

Nota: la configurazione mantiene il punto di ingresso 'io.flutter.plugins.inapppurchase.Translator {java.util.HashMap fromPurchase (com.android.billingclient.api.Purchase); } ", ma non la classe del descrittore" com.android.billingclient.api.Purchase "

Nota: la configurazione mantiene il punto di ingresso 'io.flutter.plugins.inapppurchase.Translator {java.util.HashMap fromPurchasesResult (com.android.billingclient.api.Purchase $ PurchasesResult); } ", ma non la classe del descrittore" com.android.billingclient.api.Purchase $ PurchasesResult "

Nota: c'erano 7 riferimenti a classi sconosciute.

     You should check your configuration for typos.

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

Nota: c'erano 3 riferimenti a membri della classe sconosciuti.

     You should check your configuration for typos.

Nota: c'erano 242 classi descrittori non mantenute nei membri della classe mantenuti.

     You should consider explicitly keeping the mentioned classes

     (using '-keep').

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

Nota: c'erano 68 riferimenti dinamici non risolti a classi o interfacce.

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

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

Attenzione: c'erano 25 riferimenti non risolti a classi o interfacce.

        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)

Avvertenza: c'erano 2 riferimenti irrisolti ai membri della classe della biblioteca.

        You probably need to update the library versions.

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

Avvertenza: eccezione durante l'elaborazione dell'attività java.io.IOException: correggere prima gli avvisi di cui sopra.

Discussione (Task limiter_1): distruzione Esecuzione del task Gradle 'bundleRelease' ... 690.7s (!)

************************************************** **********************> ******************* L'errore Gradle potrebbe essere stato a causa di AndroidX> incompatibilità in questa app Flutter. Vedere "https: //goo.gl / CP92wY" per ulteriori informazioni sul problema e> come risolverlo. ************************************************** **********************> ******************* Bundle di attività Gradle Rilascio non riuscito con il codice di uscita 1

Build fallito: | Compilazione non riuscita per Android

a proposito, di seguito è il mio 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 { *; }

Forse ha qualcosa a che fare con le istantanee di freccette. github.com/dart-lang/sdk/wiki/Snapshots
aligator

Risposte:


6

La mia risposta si basa sul documento ufficiale ,


Oltre a questi, è necessario abilitare proguard per ridurre le dimensioni di apk e impedire il reverse engineering dell'app. In Flutter,

Per rendere l'app più piccola possibile, è necessario abilitare la riduzione nella build di rilascio per rimuovere il codice e le risorse non utilizzate.

Per impostazione predefinita, Flutter non offusca o minimizza l'host Android. Se si intende utilizzare librerie Java, Kotlin o Android di terze parti, è possibile che si desideri ridurre le dimensioni dell'APK o proteggere tale codice dal reverse engineering.

Segui questo link per abilitare progaurd nella tua app,

Passaggio 1: Passaggio 1: Configura Proguard Creare un /android/app/proguard-rules.profile e aggiungere le regole elencate di seguito.

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

Passaggio 2: abilitare l'offuscamento e / o la minificazione

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'

        }
    }

Nota: utilizzare Proguard solo nell'apk di produzione.

Inoltre, leggi Perché le dimensioni della mia app sul dispositivo differiscono dalle dimensioni dell'APK o del Play Store


Un'app dipende anche dalle librerie native e la maggior parte delle librerie native sono librerie framework Android disponibili anche sul dispositivo, quindi non verranno raggruppate in apk / aab. Ma queste librerie saranno incluse nei file odex e quindi si espandono quando vengono installate.

Domanda: qual è la possibile prevenzione?

Risposta: ridurre al minimo l'utilizzo delle risorse dalle librerie

Se una libreria è stata progettata per un server o desktop, può includere molti oggetti e metodi di cui l'app non necessita. Per includere solo le parti della libreria necessarie all'app, è possibile modificare i file della libreria se la licenza consente di modificare la libreria. Puoi anche utilizzare una libreria alternativa ottimizzata per dispositivi mobili per aggiungere funzionalità specifiche alla tua app.

Nota: la riduzione del codice può ripulire parte del codice non necessario di una libreria, ma potrebbe non essere in grado di rimuovere alcune grandi dipendenze interne.

Leggi anche i passaggi menzionati qui

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


se ho impostato minifyEnabled = truee shrinkResources = truegenererà molti errori
coderInrRain

Ho aggiornato la mia domanda riguardo alla tua risposta ...
coderInrRain

Hai creato il file /android/app/proguard-rules.pro per favore leggi questo ?
Ravinder Kumar,

si, per favore leggi la mia risposta aggiornata, proguard-rules.pro
inserisco il

Potresti voler leggere questo , e c'è un problema aperto nel repository GitHub flutter per quanto riguarda il tuo problema. Sembra che i plugin di Google o Firebase siano in conflitto con progaurd, altrimenti dovrebbe funzionare bene.
Ravinder Kumar,

0

Costruisci la tua app usando il comando seguente:

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

o

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

Questo metodo influirà App Sizedopo l'installazione o App Download Sizesolo?
coderInrain

Questo metodo ridurrà le dimensioni dell'app per entrambi i casi.
Rudresh Narwal,

Dopo una settimana, posso confermare vedendo il Play Store App Vital che il tuo metodo non ha avuto successo - le dimensioni dell'app sono ancora le stesse dimensioni
dell'inizio

0

Per generare un pacchetto di app, eseguire:

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

Ulteriori informazioni su: https://developer.android.com/guide/app-bundle

Per dividere gli APK per ABI, eseguire:

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

Ulteriori informazioni su: https://developer.android.com/studio/build/configure-apk-splits#configure-abi-split


Qual è lo scopo dell'utilizzo di split per ABI?
coderInrain

per separare il codice a 64 e 86 bit
Arun R. Prajapati il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.