Flutter - Как уменьшить размер приложения на устройстве

17

Размер загружаемого пакета моего приложения в Google PlayStore составляет около 23 МБ :

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

Но почему после установки размер приложения на диске значительно увеличивается до 83 МБ :

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

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

Любая идея, почему это происходит, потому что:

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

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

3) Собственный ресурс Android / иконка (Res) только около 800 КБ

относительно плагина флаттера я использую ниже:

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: Пожалуйста, сначала исправьте вышеупомянутые предупреждения.

Поток (Задачи limiter_1): уничтожение Запуск задачи Gradle 'bundleRelease' ... 690.7s (!)

************************************************** **********************> ******************* Возможно, сбой Gradle произошел из-за AndroidX> несовместимости в этом приложении Flutter. См. «Https: //goo.gl / CP92wY» для получения дополнительной информации о проблеме и> как ее исправить. ************************************************** **********************> ******************* Пакет задач GradleRelease не удалось с кодом выхода 1

Сборка не удалась: | Не удалось собрать для Android

Кстати, ниже мой 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
источник
Может быть, это как-то связано со снимками дротиков. github.com/dart-lang/sdk/wiki/Snapshots
aligator

Ответы:

6

Мой ответ основан на Официальном документе ,


Помимо этого, вам нужно включить proguard, чтобы уменьшить размер apk, а также это предотвращает обратный инжиниринг приложения. Во флаттере

Чтобы сделать ваше приложение как можно более маленьким, вы должны включить сжатие в своей сборке выпуска для удаления неиспользуемого кода и ресурсов.

По умолчанию 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 store.


Приложение также зависит от нативных библиотек, и большинство нативных библиотек - это библиотеки фреймворков Android, которые также доступны на устройстве, поэтому они не будут включены в apk / aab. Но эти библиотеки будут включены в файлы odex и, следовательно, будут расширены при установке.

Вопрос: Какова возможная профилактика?

Ответ: минимизировать использование ресурсов из библиотек

Если библиотека была разработана для сервера или рабочего стола, она может включать множество объектов и методов, которые не нужны вашему приложению. Чтобы включить только те части библиотеки, которые нужны вашему приложению, вы можете редактировать файлы библиотеки, если лицензия позволяет изменять библиотеку. Вы также можете использовать альтернативную мобильную библиотеку для добавления определенных функций в ваше приложение.

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

Также прочитайте Шаги, упомянутые здесь

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

Равиндер Кумар
источник
если я установлю, minifyEnabled = trueи shrinkResources = trueэто сгенерирует много ошибок
coderInrRain
Я
обновил
Вы создали файл /android/app/proguard-rules.pro, пожалуйста, прочитайте это ?
Равиндер Кумар
да, пожалуйста, прочитайте мой обновленный ответ, я proguard-rules.pro
публикую
Возможно, вы захотите прочитать это , и в флаттер-репозитории GitHub есть открытая проблема, касающаяся вашей проблемы. Похоже, что плагины 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-битный код
Арун Р. Праджапати