【问题标题】:Flutter - How to reduce App Size on DeviceFlutter - 如何减少设备上的应用程序大小
【发布时间】:2020-03-31 03:56:18
【问题描述】:

我在 Google PlayStore 中的 App Bundle 下载大小约为 23 MB

但为什么安装后,磁盘上的应用程序大小显着增加到 83 MB

知道为什么会发生这种情况,因为:

1) Flutter 在项目中的资产文件(图像、声音和字体)仅在 11 MB

左右

2) 仅磁盘上的 Flutter 源代码 (.dart) 大小1.4 MB

3) Android 原生资源/图标 (Res) 仅在 800 KB

左右

关于我在下面使用的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

任何想法如何减少 App On Size

提前谢谢你...

更新

如果我在build.gradle 中设置minifyEnabled = trueshrinkResources = true按照 Ravinder Kumar 的建议),那么它会产生一个很长的错误,这是日志:

== 为 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 失败可能是因为这个 Flutter 应用程序中的 AndroidX > 不兼容。 请参阅“https://goo.gl / CP92wY”以获取有关该问题的更多信息以及>如何解决它。 ****************************************************** ************************>************************ Gradle 任务 bundleRelease 失败,退出代码为 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 { *; }

【问题讨论】:

标签: android gradle flutter dart apk


【解决方案1】:

我的回答是基于Official document


除此之外,您还需要启用 proguard 以减小 apk 的大小并防止应用逆向工程。 在 Flutter 中,

To make your app as small as possible, you should enable shrinking in your release build to remove unused code and resources.

默认情况下,Flutter 不会混淆或缩小 Android 主机。如果您打算使用第三方 Java、Kotlin 或 Android 库,您可能希望减小 APK 的大小或保护该代码免遭逆向工程。

关注 this link 在您的应用中启用 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'

        }
    }

注意:仅在生产 apk 中使用 Proguard。

另外,阅读 Why does my app size on device differ than the APK or Play store size


应用也依赖于原生库,并且大多数原生库都是设备上可用的 Android 框架库,因此它们不会捆绑在 apk/aab 中。但这些库将包含在 odex 文件中,因此在安装时会扩大其大小。

问题:有什么可能的预防措施?

回答: Minimize resource use from libraries

如果库是为服务器或桌面设计的,它可以包含许多您的应用不需要的对象和方法。要仅包含您的应用程序需要的库部分,如果许可证允许您修改库,您可以编辑库的文件。您还可以使用适合移动设备的替代库向您的应用添加特定功能。

注意:代码收缩可以清理库的一些不必要的代码,但它可能无法删除一些大的内部依赖项。

另请阅读此处提到的步骤

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

【讨论】:

  • 如果我设置minifyEnabled = trueshrinkResources = true会产生很多错误
  • 您是否创建了文件 /android/app/proguard-rules.pro 请阅读this
  • 是的,请阅读我的更新答案,我在底部发布proguard-rules.pro的内容...
  • 您可能想阅读this,关于您的问题,有一个open issue in flutter GitHub repo。似乎 google 或 firebase 插件似乎与 progaurd 冲突,否则,它应该可以正常工作。
  • @Racinder by see github issue,那么现在可以减少应用程序大小了吗?我认为他们不会很快有解决方案...
【解决方案2】:

要生成应用程序包,请运行:

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

了解更多信息:https://developer.android.com/guide/app-bundle

要按 ABI 拆分 APK,请运行:

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

了解更多信息:https://developer.android.com/studio/build/configure-apk-splits#configure-abi-split

【讨论】:

  • 使用 split per ABI 的目的是什么?
  • 已经尝试了两次,没有解决我的问题和应用程序大小。还有其他建议吗?
【解决方案3】:

使用以下命令

flutter build apk --split-per-abi

【讨论】:

  • 已经尝试了两次,没有解决我的问题和应用程序大小。还有其他建议吗?
猜你喜欢
  • 2021-07-03
  • 2016-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-13
  • 2023-03-26
相关资源
最近更新 更多