Flutter应用程序体积过大

135

我在使用Java进行Android应用程序开发方面有丰富的经验。最近了解到了Flutter,所以我尝试基于官方教程创建了一个简单的Android应用程序。但是令人惊讶的是,调试应用程序大小为25MB,发布APK文件的大小超过7MB。与本地开发的Android应用程序相比,它确实更大。

是否有优化的方法?


1
首先,我会查看APK文件并分析哪些部分导致了大小 https://dev59.com/C3A65IYBdhLWcg3w2iip (请发布一些获得的信息)。您应该知道Flutter应用程序包含整个运行时,因此没有特定Android SDK版本的依赖关系(除了插件),因此更大的大小是不可避免的。Flutter甚至还没有1.0版。Flutter团队已经意识到这个问题,并提到他们稍后会解决这个问题。 - Günter Zöchbauer
这在Flutter中很正常,因为需要额外的必要文件。在我的Android Go设备上,仅针对Flutter新项目中的默认应用程序就占用了60MB的空间,因此我认为在Android Go设备上它甚至需要更多的空间。 - James Christian Kaguo
你很幸运!对于React Native + Expo,我必须分发一个30MB的APK文件,而IPA下载则为110MB(但在应用商店中会被压缩)。此外,有一个答案指出该大小是固定的。 - Arlen Beiler
1
我很乐意用几兆字节的APK大小来换取Flutter提供的所有功能。 - alireza easazade
19
它仍然比react-nativeIonic应用程序小得多;-) - Top-Master
18个回答

211

似乎应用程序大小有最小限制,对于Android大约为4 MiB,请参见其他答案了解详细信息,而iOS也有相应的限制,但要进行优化请继续阅读:

我用来减少应用程序大小的一种方法是运行:

flutter clean

注意在运行构建命令之前,请先运行上述命令,该命令用于生成 Android 的 App-bundle:

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

至于安卓的APK:

flutter build apk --target-platform android-arm,android-arm64,android-x64

当我执行构建命令而没有使用clean命令时,下载大小约为32 MiB,但如果我先运行clean命令,则下载大小约为18 MiB
此外,Flutter暂时不支持x86架构,详情请见:deployment/android

25
这是唯一一个回答该如何优化的问题。 - Phani Rithvij
2
谢谢您...如果有类似问题的用户,您可以为这个答案点赞。 - Canaan Etai
4
我发布了这个应用,它正常运行。现在我收到了来自用户的好评。感谢@CanaanEtai,在减小应用安装大小方面提供了很多帮助。 - Jithin Jude
3
这不是优化。这是生成 appbundle 的方法。 - Eslam Sameh Ahmed
2
有人可以解释一下它是如何工作的吗? - rehman_00001
显示剩余12条评论

81

Flutter团队在这里确认了这个问题。

这里有一个解释,引用了同样的话 -

2018年8月,我们测量了一个最小的Flutter应用程序(没有Material Components,只是一个使用flutter build apk构建的单个Center widget),打包并压缩为发布APK,大小约为4.7MB。

对于这个简单的应用程序,核心引擎大约为3.2MB(压缩后),框架+应用程序代码大约为840KB(压缩后),许可证文件为55KB(压缩后),必要的Java代码(classes.dex)为57KB(压缩后),还有约533KB的(压缩后)ICU数据。

当然,你的情况可能不同,我们建议你通过运行flutter build apk并查看build / app / outputs / apk / release / app-release.apk来测量自己的应用程序。

另外,apk大小的相对差异可能会随着应用程序变得更大而变得较小。Flutter的开销大小是固定的


13
顶楼层的评论点赞。补充一下最新线索,可以在 https://github.com/flutter/flutter/issues/16833 查看。基本应用程序现在在安卓系统上约为4MB,在iOS上约为10MB。 - Ricardo Gonçalves
1
@Ricardo BRGWeb 在iOS上10MB,是在App Store Connect中构建的吗?显然不是,它更像是30MB,但Android确实和你说的一样小。 - Hasen
我在Playstore上有一个使用Flutter构建的应用程序,大小为1.5MB。https://play.google.com/store/apps/details?id=site.appsfactory - Mustafa
对于简单的React Native应用程序,我认为大约10MB。 - msmaromi
@Vaibhav,你确定“Flutter的开销大小是固定的”吗?我找不到任何相关参考资料。我知道这很有道理,文档提供了一个链接,在FAQ中测量引擎大小为(3-4MB),但总体开销可能是其他自定义代码,而不仅仅是纯优化的引擎大小。所以我想知道是否有关于整体开销的基准,它可能有多大。 - MSaudi

42

使用以下命令来分析哪些内容占用了您的应用程序最多的空间。

对于Android的AppBundle:

flutter build appbundle --target-platform android-arm --analyze-size
flutter build appbundle --target-platform android-arm64 --analyze-size
flutter build appbundle --target-platform android-x64 --analyze-size

对于安卓APK:

flutter build apk --target-platform android-arm --analyze-size
flutter build apk --target-platform android-arm64 --analyze-size
flutter build apk --target-platform android-x64 --analyze-size

对于iOS系统:

flutter build ios --analyze-size

Linux操作系统:

flutter build linux --analyze-size

适用于 macOS

flutter build macos --analyze-size

适用于Windows操作系统

flutter build windows --analyze-size

这包括本机代码、资源甚至是已编译 Dart 代码的包级别分解。


DevTools

如果您想查看其可视化表示,请使用 DevTools。为此,在运行上一个命令后运行:

flutter pub global run devtools --appSizeBase=apk-code-size-analysis_01.json

您将被引导至您的浏览器,届时您会看到类似下图的页面:

enter image description here


1
我们可以为网站构建做些什么? - Anand

28

首先检查以下内容:

  • 如其他答案所述,删除所有不必要的资源(图像、字体和文件等)。

如果您有太多字体,则会严重影响apk大小。Flutter也为此提供了解决方案,即创建一个包,以便您从Google Fonts库中获取字体(这是一个非常棒的包,使您可以访问众多字体并在任何地方使用)。在此处获取该包,并在此处阅读更多信息

  • 删除未使用的软件包/插件(虽然影响不大)。

  • 删除未使用的资源

  • 最小化从库导入的资源

  • 支持有限数量的屏幕密度

  • 压缩PNG和JPEG文件

还请阅读:测量应用程序大小

还请注意以下内容:

如果您使用flutter build apk构建apk,则其中将包含arm-32和arm-64 apk(Flutter在构建apk时会在控制台中显示)。如果您正在构建应用程序包,则这不是问题,其大小要小得多。

为了避免包含arm-32和arm-64的单个平坦apk,您可以使用以下两个命令分别构建它们:

flutter build apk --target-platform=android-arm

以上操作将生成arm-32位apk。前往项目 -> 构建 -> 应用 -> 发布,并将apk重命名为:app-armeabi-v7a-release.apk

接着,在pubspec.yaml中增加版本号,运行flutter pub get,然后执行以下步骤:

flutter build apk --target-platform=android-arm64

以上步骤将生成 arm-64 位的 APK。前往 项目 -> 构建 -> 应用程序 -> 发布 并将 APK 重命名为:app-arm64-v8a-release.apk

然后,您可以分别提交两个 APK(较低的 APK 版本先提交)。

由于需要逐步增加版本代码运行两个命令,Flutter 可以通过此命令(flutter > 1.5.4 I think)使其更容易:flutter build apk --split-per-abi。该命令将为第二个 APK 增加 APK 版本代码,并为您提供两个已重命名的 APK(请注意,此命令将生成具有更高版本代码的 APK(例如:3222))。

来自文档:

  

从命令行中:

Enter cd <app dir>
(Replace <app dir> with your application’s directory.)
Run `flutter build apk --split-per-abi`
(The flutter build command defaults to `--release`.)

这个命令会生成两个APK文件:

<app dir>/build/app/outputs/apk/release/app-armeabi-v7a-release.apk
<app dir>/build/app/outputs/apk/release/app-arm64-v8a-release.apk
<app dir>/build/app/outputs/apk/release/app-x86_64-release.apk

移除--split-per-abi标志将导致包含为所有目标ABI编译的代码的fat APK。这样的APK比它们的分割版本更大,会导致用户下载对其设备架构不适用的本地二进制文件。

点击此处了解更多信息

我还听说在最新的Flutter更新中,他们已经使Flutter应用程序大小变得更小。但是,也存在一个附加问题:https://github.com/flutter/flutter/issues/16833


@Blasanka 通过拥有多个apk,我们如何将这些多个apk发布到Playstore? - ikhsanudinhakim
@ikhsanudinhakim 您可以将多个apk添加到一个发布中,但每个apk的版本应递增更新。 - Blasanka

16

当然可以。使用Flutter构建的hello world应用程序生成的apk或ipa文件大小至少为7MB。这是因为Flutter在其构建输出中附带了核心引擎、框架、ICU数据、LICENSE文件等必要组件,这些都是Flutter应用程序运行所必需的。

您可以查看此处的常见问题解答,了解每个组件构建时占用的空间。

希望对您有所帮助!


6
7MB没问题。但是Flutter现在生成的IPA文件大小为61MB,对于基本应用来说太大了。 - Hari Prasad
2
希望你正在构建调试版本。尝试构建发布版本。上面的大小是在Flutter中进行“Hello World”应用程序开发的大小。该大小可能会因本地依赖项和其他插件而异。 - Hemanth Raj
1
这是一个发布版本。经过一些调试,我发现Swift核心库占IPA总大小的一半,如果我们使用Swift,这就是我的情况。 带有Swift库的最终通用IPA大小约为21MB,而精简后的IPA大小约为9MB。 - Hari Prasad

8

我使用了这个命令来生成用于生产环境的发布版apk:

flutter build apk --split-per-abi

输出的 APK 位于项目文件夹中:

[项目]/build/app/outputs/apk/release/app-armeabi-v7a-release.apk

在我的案例中,APK 的大小缩小到5.3 MB(执行以上命令后)。 因为它们包含了你可能需要在热重启或重新启动时使用的一切内容,这样当你只对代码进行了微小的更改时,就可以避免再次构建整个系统而浪费时间(大小几乎超过了50 MB)。

发布版本是你所有代码的真实结果,它们是无容器的真实压缩应用程序,可以在 Google 商店上分发。


7
TL;DR: 使用命令 flutter build apk --split-per-abi 在运行flutter build apk --release后,我的APK大小为16.2 MB。这个APK被称为FAT APK,它是一个包含多个ABI二进制文件的单个APK,并支持多种架构。使用flutter build apk --split-per-abi,dart代码会被混淆,从而生成3个APK文件,我的应用程序APK的大小缩小到了5.6 MB。
以下是官方文档对此的解释:https://docs.flutter.dev/deployment/android

1
到目前为止最好的,谢谢老板。 - Arinzehills

5

4
所有这种跨平台应用程序从一开始就比较大。我曾经使用过React-Native,一个Hello-World应用程序就有约6MB大小。你可以做的就是创建两个发行版APK,一个用于ARM CPU,一个用于x86 CPU,这样可以将大小降低约4MB,但永远不会像Android那样小。

根据Google的说法,减少APK大小的一种方法是创建多个APK,其中包含特定屏幕密度或ABIs的文件。欲知更多信息,请访问https://developer.android.com/studio/build/configure-apk-splits.html

更新:如果我的Flutter现在没有完全支持它,未来肯定会有,Flutter开发的每个阶段都会有这种方法,但在Beta版本中不太有效,但通过发布更多版本的Flutter,这种方法会变得更好。

2

请参考以下步骤,它们可能有助于您减小应用程序的大小(仅适用于Android),我已将我的48MB构建缩小到14MB。

步骤1: android/gradle.properties android.enableR8=true

步骤2: android/app/build.gradle

在 -> buildTypes -> release 中

minifyEnabled true
shrinkResources true
useProguard true

第三步:

运行

flutter build apk --target-platform=android-arm

或者

flutter build apk --split-per-abi

其他优化提示:

1. 图像资源

将图像上传到永久存储路径,如 AWS 或您的网站服务器,并在代码中使用该图像的链接。

2. 图标

建议使用 Material Icons 或 Cupertino Icons 类中的图标。可以在 flutter build 命令中添加 --tree-shake-icons 选项,以从捆绑包中删除所有未使用的图标。这可能会节省您的应用程序大小。(使用 svg 格式图标)

3. 字体

如果我们使用类似于图像的本地资源中的更多字体,则这些字体也会增加应用程序大小。最好的解决方案是使用 google_fonts 插件。此插件将在使用字体时动态下载字体。

4. 动态应用交付

如果我们将应用程序上传到 playstore,则可以构建应用程序包;或者我们可以将 apk 拆分为 x64 和 x86 位代码。通过使用 appbundle Google Play 的新应用程序服务模型,称为 Dynamic Delivery,使用您的应用程序包生成和提供每个用户设备配置的优化 APK,因此他们只下载运行应用程序所需的代码和资源。

请参阅以下链接以了解更多信息:

  1. https://developer.android.com/studio/build/shrink-code
  2. https://developer.android.com/guide/app-bundle
  3. https://www.youtube.com/watch?v=9D63S4ZRBls

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接