Flattern - So reduzieren Sie die App-Größe auf dem Gerät

17

Die Download-Größe meines App-Bundles im Google PlayStore beträgt ca. 23 MB :

Geben Sie hier die Bildbeschreibung ein

Aber warum steigt die App-Größe auf der Festplatte nach der Installation erheblich auf 83 MB ?

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Irgendeine Idee, warum dies passiert, weil:

1) Flatters Assets-Datei (Bilder, Ton & Schriftarten) für Projekte mit nur ca. 11 MB

2) Größe des Flutter-Quellcodes (.dart) auf der Festplatte nur 1,4 MB

3) Android Native Resource / Symbol (Res) nur ca. 800 KB

In Bezug auf das Flatter-Plugin verwende ich unten:

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

Irgendeine Idee Wie man die Größe der App reduziert ?

Vielen Dank im Voraus...

AKTUALISIEREN

Wenn ich minifyEnabled = trueund shrinkResources = true( wie von Ravinder Kumar vorgeschlagen ) in meinem build.gradleeinstelle, wird ein sehr langer Fehler generiert. Hier ist das Protokoll:

== Bauen für Android ==

... (Ich habe das Fehlerprotokoll wegen sehr langer, aber vollständiger Protokolle hier abgeschnitten: https://www.dropbox.com/s/jy92d1lmj9pgb6d/full_flutter_error_log.txt?dl=0 )

Hinweis: Die Konfiguration behält den Einstiegspunkt 'io.flutter.plugins.googlesignin.GoogleSignInPlugin $ Delegate $ 3 {void onComplete (com.google.android.gms.tasks.Task); } ', aber nicht die Deskriptorklasse' com.google.android.gms.tasks.Task '

Hinweis: Die Konfiguration behält den Einstiegspunkt 'io.flutter.plugins.inapppurchase.Translator {java.util.HashMap fromSkuDetail (com.android.billingclient.api.SkuDetails); } ', aber nicht die Deskriptorklasse' com.android.billingclient.api.SkuDetails '

Hinweis: Die Konfiguration behält den Einstiegspunkt 'io.flutter.plugins.inapppurchase.Translator {java.util.HashMap fromPurchase (com.android.billingclient.api.Purchase); } ', aber nicht die Deskriptorklasse' com.android.billingclient.api.Purchase '

Hinweis: Die Konfiguration behält den Einstiegspunkt 'io.flutter.plugins.inapppurchase.Translator {java.util.HashMap fromPurchasesResult (com.android.billingclient.api.Purchase $ PurchasesResult); } ', aber nicht die Deskriptorklasse' com.android.billingclient.api.Purchase $ PurchasesResult '

Hinweis: Es gab 7 Verweise auf unbekannte Klassen.

     You should check your configuration for typos.

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

Hinweis: Es gab 3 Verweise auf unbekannte Klassenmitglieder.

     You should check your configuration for typos.

Hinweis: Es gab 242 nicht verwaltete Deskriptorklassen in gehaltenen Klassenmitgliedern.

     You should consider explicitly keeping the mentioned classes

     (using '-keep').

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

Hinweis: Es gab 68 ungelöste dynamische Verweise auf Klassen oder Schnittstellen.

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

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

Warnung: Es gab 25 ungelöste Verweise auf Klassen oder Schnittstellen.

        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)

Warnung: Es gab 2 ungelöste Verweise auf Mitglieder der Bibliotheksklasse.

        You probably need to update the library versions.

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

Warnung: Ausnahme bei der Verarbeitung der Aufgabe java.io.IOException: Bitte korrigieren Sie zuerst die obigen Warnungen.

Thread (Tasks limiter_1): Zerstörung Gradle-Task 'bundleRelease' ausführen ... 690.7s (!)

********************************************************** **********************> ******************* Der Gradle-Fehler kann auf zurückzuführen sein AndroidX> Inkompatibilitäten in dieser Flutter-App. Weitere Informationen zum Problem und zur Behebung finden Sie unter "https: //goo.gl / CP92wY". ********************************************************** **********************> ****************** Gradle Task BundleRelease fehlgeschlagen mit Exit-Code 1

Build fehlgeschlagen: | Fehler beim Erstellen für Android

Übrigens, unten ist meine 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
quelle
Vielleicht hat es etwas mit Dart-Schnappschüssen zu tun. github.com/dart-lang/sdk/wiki/Snapshots
Aligator

Antworten:

6

Meine Antwort basiert auf dem offiziellen Dokument .


Abgesehen von diesen müssen Sie Proguard aktivieren, um die Größe von apk zu reduzieren und das Reverse Engineering der App zu verhindern. In Flutter,

Um Ihre App so klein wie möglich zu halten, sollten Sie das Verkleinern in Ihrem Release-Build aktivieren, um nicht verwendeten Code und Ressourcen zu entfernen.

Standardmäßig verschleiert oder minimiert Flutter den Android-Host nicht. Wenn Sie Java-, Kotlin- oder Android-Bibliotheken von Drittanbietern verwenden möchten, möchten Sie möglicherweise die Größe des APK reduzieren oder diesen Code vor Reverse Engineering schützen.

Folgen diesem Link , um progaurd in Ihrer App zu aktivieren.

Schritt 1: Schritt 1 - Konfigurieren von Proguard Erstellen Sie eine /android/app/proguard-rules.proDatei und fügen Sie die unten aufgeführten Regeln hinzu.

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

Schritt 2: Aktivieren Sie die Verschleierung und / oder Minimierung

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'

        }
    }

Hinweis: Verwenden Sie Proguard nur in der Produktion apk.

Lesen Sie auch Warum unterscheidet sich meine App-Größe auf dem Gerät von der APK- oder Play Store-Größe?


Eine App hängt auch von nativen Bibliotheken ab und die meisten nativen Bibliotheken sind Android-Framework-Bibliotheken, die auch auf dem Gerät verfügbar sind, sodass sie nicht in apk / aab gebündelt werden. Diese Bibliotheken werden jedoch in die Odex-Dateien aufgenommen und erweitern daher ihre Größe bei der Installation.

Frage: Was ist die mögliche Prävention?

Antwort: Minimieren Sie den Ressourcenverbrauch aus Bibliotheken

Wenn eine Bibliothek für einen Server oder Desktop konzipiert wurde, kann sie viele Objekte und Methoden enthalten, die Ihre App nicht benötigt. Um nur die Teile der Bibliothek einzuschließen, die Ihre App benötigt, können Sie die Dateien der Bibliothek bearbeiten, wenn Sie mit der Lizenz die Bibliothek ändern können. Sie können auch eine alternative, mobilfreundliche Bibliothek verwenden, um Ihrer App bestimmte Funktionen hinzuzufügen.

Hinweis: Durch das Verkleinern von Code kann ein Teil des unnötigen Codes einer Bibliothek bereinigt werden, einige große interne Abhängigkeiten können jedoch möglicherweise nicht entfernt werden.

Lesen Sie auch die hier genannten Schritte

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

Ravinder Kumar
quelle
wenn ich setze minifyEnabled = trueund shrinkResources = truees wird viele Fehler erzeugen
coderInrRain
Ich habe meine Frage bezüglich Ihrer Antwort aktualisiert ...
coderInrRain
Haben Sie die Datei /android/app/proguard-rules.pro erstellt, lesen Sie diese bitte ?
Ravinder Kumar
Ja, bitte lesen Sie meine aktualisierte Antwort, ich proguard-rules.pro
poste den
Vielleicht möchten Sie dies lesen , und es gibt ein offenes Problem im flatternden GitHub-Repo bezüglich Ihres Problems. Es scheint, dass Google- oder Firebase-Plugins mit Progaurd in Konflikt stehen, andernfalls sollte es gut funktionieren.
Ravinder Kumar
0

Erstellen Sie Ihre App mit dem folgenden Befehl:

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

oder

flutter build appbundle --target-platform android-arm,android-arm64
Rudresh Narwal
quelle
Beeinflusst diese Methode App Sizenach der Installation oder App Download Sizenur?
coderInrRain
Diese Methode reduziert die App-Größe in beiden Fällen.
Rudresh Narwal
Nach einer Woche kann ich im Playstore Apps Vital bestätigen, dass Ihre Methode immer noch nicht erfolgreich ist - die App-Größe entspricht immer noch der Größe des
Anfangs
0

Führen Sie Folgendes aus, um ein App-Bundle zu generieren:

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

Weitere Informationen finden Sie unter: https://developer.android.com/guide/app-bundle

Führen Sie Folgendes aus, um die APKs nach ABI aufzuteilen:

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

Weitere Informationen finden Sie unter: https://developer.android.com/studio/build/configure-apk-splits#configure-abi-split

Arun R. Prajapati
quelle
Was ist der Zweck der Verwendung von Split pro ABI?
coderInrRain
64 und 86 Bit Code zu trennen
Arun R. Prajapati