Flutter - Jak zmniejszyć rozmiar aplikacji na urządzeniu

17

Rozmiar mojego pakietu aplikacji do pobrania w Google PlayStore wynosi około 23 MB :

wprowadź opis zdjęcia tutaj

Ale dlaczego po zainstalowaniu rozmiar aplikacji na dysku znacznie wzrasta do 83 MB :

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

Każdy pomysł, dlaczego tak się dzieje, ponieważ:

1) Plik zasobów Fluttera (obrazy, dźwięk i czcionki) w projektach ma tylko około 11 MB

2) Rozmiar kodu źródłowego trzepotania (.dart) na dysku tylko 1,4 MB

3) Android Native Resource / icon (Res) tylko około 800 KB

odnośnie wtyczki fluttera używam poniżej:

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

Jakiś pomysł Jak zmniejszyć rozmiar aplikacji ?

Z góry dziękuję...

AKTUALIZACJA

Jeśli ustawię minifyEnabled = truei shrinkResources = true( jak sugeruje Ravinder Kumar ) w moim build.gradle, wygeneruje to bardzo długi błąd, oto dziennik:

== Budowanie dla Androida ==

... (Wytnąłem dziennik błędów z powodu bardzo długiego, ale pełny dziennik można zobaczyć tutaj: https://www.dropbox.com/s/jy92d1lmj9pgb6d/full_flutter_error_log.txt?dl=0 )

Uwaga: konfiguracja zachowuje punkt wejścia „io.flutter.plugins.googlesignin.GoogleSignInPlugin $ Deleguj 3 $ {void onComplete (com.google.android.gms.tasks.Task); } ”, ale nie klasa deskryptora„ com.google.android.gms.tasks.Task ”

Uwaga: konfiguracja zachowuje punkt wejścia „io.flutter.plugins.inapppurchase.Translator {java.util.HashMap fromSkuDetail (com.android.billingclient.api.SkuDetails); } ”, ale nie klasa deskryptora„ com.android.billingclient.api.SkuDetails ”

Uwaga: konfiguracja zachowuje punkt wejścia „io.flutter.plugins.inapppurchase.Translator {java.util.HashMap fromPurchase (com.android.billingclient.api.Purchase); } ”, ale nie klasa deskryptora„ com.android.billingclient.api.Purchase ”

Uwaga: konfiguracja zachowuje punkt wejścia „io.flutter.plugins.inapppurchase.Translator {java.util.HashMap fromPurchasesResult (com.android.billingclient.api.Purchase $ PurchasesResult); } ”, ale nie klasa deskryptora„ com.android.billingclient.api.Purchase $ PurchasesResult ”

Uwaga: było 7 odniesień do nieznanych klas.

     You should check your configuration for typos.

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

Uwaga: były 3 odniesienia do nieznanych członków klasy.

     You should check your configuration for typos.

Uwaga: w utrzymywanych członkach klasy istniało 242 nieutrzymanych klas deskryptorów.

     You should consider explicitly keeping the mentioned classes

     (using '-keep').

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

Uwaga: istniało 68 nierozwiązanych dynamicznych odniesień do klas lub interfejsów.

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

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

Ostrzeżenie: istnieje 25 nierozwiązanych odwołań do klas lub interfejsów.

        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)

Ostrzeżenie: istnieją 2 nierozwiązane odwołania do członków klasy biblioteki.

        You probably need to update the library versions.

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

Ostrzeżenie: Wyjątek podczas przetwarzania zadania java.io.IO Wyjątek: Najpierw popraw powyższe ostrzeżenia.

Wątek (Tasks limiter_1): zniszczenie Uruchamianie zadania Gradle „bundleRelease” ... 690,7 s (!)

************************************************** **********************> ******************* Awaria stopniowania mogła być spowodowana AndroidX> niezgodności w tej aplikacji Flutter. Zobacz „https: //goo.gl / CP92wY”, aby uzyskać więcej informacji na temat problemu i> jak go naprawić. ************************************************** **********************> ******************* Stopień pakietu zadań Zwolnienie nie powiodło się z kodem wyjścia 1

Kompilacja nie powiodła się: | Nie udało się zbudować dla Androida

btw, poniżej jest moje 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
źródło
Może ma to coś wspólnego z migawkami rzutek. github.com/dart-lang/sdk/wiki/Snapshots
aligator

Odpowiedzi:

6

Moja odpowiedź oparta jest na oficjalnym dokumencie ,


Oprócz tego musisz włączyć proguard, aby zmniejszyć rozmiar apk, a także uniemożliwić inżynierii wstecznej aplikacji. W Flutter

Aby aplikacja była jak najmniejsza, należy włączyć zmniejszanie w kompilacji wersji w celu usunięcia nieużywanego kodu i zasobów.

Domyślnie Flutter nie zaciemnia ani nie ogranicza hosta Androida. Jeśli zamierzasz używać bibliotek Java, Kotlin lub Android innych firm, możesz zmniejszyć rozmiar pliku APK lub chronić ten kod przed inżynierią wsteczną.

Kliknij ten link, aby włączyć progaurd w swojej aplikacji,

Krok 1: Krok 1 - Skonfiguruj Proguard Utwórz /android/app/proguard-rules.proplik i dodaj reguły wymienione poniżej.

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

Krok 2: Włącz zaciemnianie i / lub minimalizację

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'

        }
    }

Uwaga: programu Proguard używaj tylko w apk produkcyjnym.

Przeczytaj także Dlaczego rozmiar mojej aplikacji na urządzeniu różni się od rozmiaru pliku APK lub Play


Aplikacja zależy również od rodzimych bibliotek lib, a większość bibliotek natywnych to biblioteki systemu Android, które są również dostępne na urządzeniu, więc nie zostaną dołączone do apk / aab. Ale te biblioteki zostaną uwzględnione w plikach odex, a zatem zwiększy swój rozmiar po zainstalowaniu.

Pytanie: Jakie jest możliwe zapobieganie?

Odpowiedź: Zminimalizuj zużycie zasobów z bibliotek

Jeśli biblioteka została zaprojektowana dla serwera lub komputera stacjonarnego, może zawierać wiele obiektów i metod, których Twoja aplikacja nie potrzebuje. Aby uwzględnić tylko te części biblioteki, których potrzebuje Twoja aplikacja, możesz edytować pliki biblioteki, jeśli licencja pozwala na modyfikowanie biblioteki. Możesz także użyć alternatywnej biblioteki przyjaznej dla urządzeń mobilnych, aby dodać określone funkcje do swojej aplikacji.

Uwaga: zmniejszanie się kodu może usunąć część niepotrzebnego kodu z biblioteki, ale może nie być w stanie usunąć niektórych dużych zależności wewnętrznych.

Przeczytaj także kroki wymienione tutaj

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

Ravinder Kumar
źródło
jeśli minifyEnabled = trueshrinkResources = true
ustawię
Zaktualizowałem moje pytanie dotyczące twojej odpowiedzi ...
coderInrRain
Czy utworzyłeś plik /android/app/proguard-rules.pro, przeczytaj to ?
Ravinder Kumar,
tak, proszę przeczytać moją zaktualizowaną odpowiedź, zamieszczam treść proguard-rules.prona dole ...
coderInrRain
Może chcesz przeczytać to , i nie jest kwestią otwartą w trzepotanie GitHub repo dotyczące Twojego problemu. Wygląda na to, że wtyczki Google lub Firebase są w konflikcie z progaurdem, w przeciwnym razie powinno działać dobrze.
Ravinder Kumar,
0

Zbuduj swoją aplikację za pomocą niżej wymienionego polecenia:

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

lub

flutter build appbundle --target-platform android-arm,android-arm64
Rudresh Narwal
źródło
Czy ta metoda wpłynie na App Sizeinstalację lub App Download Sizetylko?
coderInrRain,
Ta metoda zmniejszy rozmiar aplikacji w obu przypadkach.
Rudresh Narwal,
Po tygodniu mogę potwierdzić, widząc w sklepie PlayStation Apps Vital, że twoja metoda wciąż nie jest udana - rozmiar aplikacji jest nadal taki sam jak początek ...
coderInrRain
0

Aby wygenerować pakiet aplikacji, uruchom:

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

Dowiedz się więcej na: https://developer.android.com/guide/app-bundle

Aby podzielić pakiety APK według ABI, uruchom:

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

Dowiedz się więcej na: https://developer.android.com/studio/build/configure-apk-splits#configure-abi-split

Arun R. Prajapati
źródło
Jaki jest cel używania podziału według ABI?
coderInrRain
oddzielić 64 i 86 bitowy kod
Arun R. Prajapati,