Flutter - Як зменшити розмір програми на пристрої


17

Розмір завантаження пакета мого додатка в Google PlayStore становить близько 23 Мб :

введіть тут опис зображення

Але чому після встановлення розмір додатка на диску значно збільшується до 83 Мб :

введіть тут опис зображення

введіть тут опис зображення

Будь-яка ідея, чому це відбувається, тому що:

1) Файл активів Flutter (зображення, звук та шрифти) для проектів лише близько 11 Мб

2) Розмір вихідного коду Flutter (.dart) на диску всього 1,4 Мб

3) Рідний ресурс / значок Android (Res) лише близько 800 Кб

стосовно плагіна Flutter я використовую нижче:

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

Будь-яка ідея Як зменшити розмір програми ?

Наперед дякую...

ОНОВЛЕННЯ

Якщо я встановив minifyEnabled = trueі shrinkResources = true( як це запропонував Равіндер Кумар ) у своєму моєму build.gradleвипадку, він створить дуже довгу помилку, ось журнал:

== Створення для Android ==

... (Я вирізав журнал помилок через дуже довгий, але повний журнал можна побачити тут: https://www.dropbox.com/s/jy92d1lmj9pgb6d/full_flutter_error_log.txt?dl=0 )

Примітка: конфігурація зберігає точку входу '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: спочатку виправте вищезазначені попередження.

Нитка (обмеження завдань_1): знищення Запуск завдання Gradle 'bundleRelease' ... 690,7s (!)

**************************************************** **********************> ******************* Невдача Gradle могла статися через AndroidX> несумісність у цій програмі Flutter Див. "Https: //goo.gl / CP92wY" для отримання додаткової інформації про проблему та> як її виправити. **************************************************** **********************> ******************* Пакет завдань GradleЗапустіть помилку з кодом виходу 1

Помилка побудови: | Не вдалося створити для Android

btw, нижче моє 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 { *; }

Можливо, це має щось спільне із знімками знімків. github.com/dart-lang/sdk/wiki/Snapshots
алігатор

Відповіді:


6

Моя відповідь ґрунтується на офіційному документі ,


Крім них, вам потрібно включити proguard для зменшення розміру apk, а також заважає зворотному проектуванню додатків. У Flutter,

Щоб зробити ваш додаток якомога меншим, слід увімкнути скорочення у версії версії, щоб видалити невикористаний код та ресурси.

За замовчуванням Flutter не приховує та не змінює хост Android. Якщо ви маєте намір використовувати сторонні бібліотеки Java, Kotlin або Android, ви можете зменшити розмір APK або захистити цей код від зворотної інженерії.

Перейдіть за цим посиланням, щоб увімкнути progaurd у вашому додатку,

Крок 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'

        }
    }

Примітка: Використовуйте Proguard лише у виробництві apk.

Також прочитайте, чому розмір мого додатка на пристрої відрізняється від розміру магазину APK або Play


Додаток також залежить від рідних файлів, і більшість вроджених бібліотек також є андроїд-рамковими бібліотеками, які також доступні на пристрої, тому вони не потраплять у пакет apk / aab. Але ці файли будуть включені у файли odex і, отже, збільшують його розмір при встановленні.

Питання: Яка можлива профілактика?

Відповідь: Мінімізуйте використання ресурсів у бібліотеках

Якщо бібліотека була розроблена для сервера або робочого столу, вона може включати в себе безліч об'єктів і методів, які ваша програма не потребує. Щоб включити лише ті частини бібліотеки, які потрібні вашому додатку, ви можете редагувати файли бібліотеки, якщо ліцензія дозволяє змінювати бібліотеку. Ви також можете використовувати альтернативну мобільну бібліотеку, щоб додати певну функціональність до свого додатка.

Примітка: зменшення коду може очистити частину непотрібного коду бібліотеки, але, можливо, не вдасться усунути деякі великі внутрішні залежності.

Також прочитайте вказані тут кроки

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


якщо я встановлю, minifyEnabled = trueі shrinkResources = trueце створить багато помилок
coderInrRain

Я оновив своє запитання щодо вашої відповіді ...
coderInrRain

Ви створили файл /android/app/proguard-rules.pro, будь ласка, прочитайте це ?
Равіндер Кумар

так, будь ласка, прочитайте мою оновлену відповідь, я розміщую вміст proguard-rules.proвнизу ...
coderInrRain

Ви можете прочитати це , і у відкритому питанні GitHub repo існує проблема, що стосується вашої проблеми. Здається, плагіни google або firebase, здається, суперечать progaurd, інакше це має справно працювати.
Равіндер Кумар

0

Створіть свою програму, використовуючи вказану нижче команду:

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

або

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

Чи вплине цей метод App Sizeпісля встановлення чи App Download Sizeлише?
coderInrRain

Цей спосіб зменшить розмір програми для обох випадків.
Рудреш Нарваль

Через тиждень я можу підтвердити, побачивши playstore Apps Vital, що ваш метод не успішний - розмір додатка все-таки такий же, як і починаючи ...
coderInrRain

0

Щоб створити пакет додатків, запустіть:

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

Докладніше: https://developer.android.com/guide/app-bundle

Щоб розділити APK на ABI, запустіть:

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

Докладніше: https://developer.android.com/studio/build/configure-apk-splits#configure-abi-split


Яка мета використання спліту на ABI?
coderInrRain

розділити 64 та 86 бітовий код
Арун Р. Праджапаті
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.