Flutter apps are too big in size

I have good experience in android app development using java. Recently I came to know about flutter. So, I have tried to create a simple android app with flutter based on official tutorial. But surprisingly the debug app size is 25MB and release apk costs more than 7MB. It is really larger when compare with native developed android app.

Is there any way to optimize it?

143163 次浏览

当然,用 flutter 构建的 apk 或 ipa 的大小对于 hello world 应用程序来说至少是7mb。这是因为,flutter 提供了一个核心引擎、框架、 ICU 数据、 LICENSE 文件等,其构建输出对于 flutter 应用程序的运行是强制性的。

您可以查看 FAQ 给你了解更多关于构建时需要多大尺寸的信息。

希望能帮上忙!

所有这些跨平台的应用程序从一开始就变得更大了
我做的工作与反应本地和 hello-world 应用程序是大约6 MB
你所能做的就是做一个两个版本的 apk,一个用于 arm cpu,一个用于 x86 cpu,这样你可以把大小降低到4MB 左右,但永远不会像 android 那么小

根据谷歌搜索

减小 APK 大小的一种方法是创建多个包含特定屏幕密度或 ABI 文件的 APK。


点击这里查看更多信息 < a href = “ https://developer.android.com/Studio/build/configure-apk-splits.html”rel = “ nofollow norefrer”> https://developer.android.com/studio/build/configure-apk-splits.html

更新: 如果我现在不完全支持它,将来肯定会,在颤振发展的每一个阶段,它将是这个方法的工作,但不是太多的 beta 版本,但这个方法将工作更好地释放更多的颤振版本

Flutter team acknowledges it 给你.

对于这个 给你有一个解释,引用同样的-

在2018年8月,我们测量了一个最小的 Flutter 应用程序(No 材质组件,只是一个单一的中心部件,建立与颤振 构建 APK) ,捆绑和压缩为一个发布 APK,以便 大约4.7 MB。

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

当然,YMMV,我们建议您通过以下方式来衡量您自己的应用程序 running flutter build apk and looking at Build/app/output/apk/release/app-release. apk.

Also, the relative differences in apk size would likely be smaller with larger apps. Flutter's 开销大小是固定的.

在调试时,我也遇到了这种非常 apk 的情况,而在发布时大约为7-8mb。然而,我们可以在更大的应用程序中看到这一点,从本质上讲,我们需要导入许多库,而 Flutter 的工作是优化的。因此,如果我们假设一个应用程序,本地应该重量约30毫巴与扑动它应该是类似的。让你感到害怕的是那些非常基本的应用程序。然而,重要的是优化图像

Here is Official Android documentation that made my apps go From ~20mb 到9mb

Try the 前卫 recommendation

链接: https://developer.android.com/topic/performance/reduce-apk-size

使用 ProGuard 之前和之后等等 enter image description here

一个方法,我用来减少我的应用程序大小是使用;

flutter clean

在运行 build 命令之前;

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

当我在没有 clean 命令的情况下运行 build 命令时,我得到大约32mb,但是如果我首先运行 clean 命令,我得到大约18mb

First check these:

  • As other answer mentioned remove all unnecessary assets(images, fonts and files).

如果你有太多的字体,会严重影响 apk 的大小和颤动也作出了一个解决方案,通过创建一个软件包,让你得到的字体从谷歌字体库(令人敬畏的软件包,让你访问这么多的字体和灵活性,使用任何地方)。接通 包裹在这里你可在此浏览更多资料

  • 删除不必要的包/插件不使用(没有太大影响 尽管如此

  • 删除未使用的资源

  • Minimize resource imported from libraries

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

  • 压缩 PNG 和 JPEG 文件

也读一下这个: Measuring your app's size

请注意以下几点:

如果您使用 flutter build apk构建您的 apk,它将包含 arm-32和 arm-64 apk (当您构建 apk 时,控制台将显示颤振)。如果你正在构建应用程序包,这不是一个问题,它的大小要小得多。

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

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

以上将生成 arm-32位 apk。转到 project -> build -> app -> release并将 apk 重命名为: app-armeabi-v7a-release.apk

然后增加 pubspec.yaml 中的版本代码,下一个 flutter pub get并执行以下操作:

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

以上将生成 arm-64位 apk。转到 project -> build -> app -> release并将 apk 重命名为: app-arm64-v8a-release.apk

然后您可以提交两个 apk 分开(较低的 apk 版本第一)。

因为,您必须通过增加版本代码来运行两个命令,flutter 通过这个命令(我认为 flutter > 1.5.4)使其变得更容易: flutter build apk --split-per-abi。该命令将增加第二个 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 编译的代码 大小比它们的对应分割,导致用户下载 不适用于其设备架构的本机二进制文件

点击这里阅读更多。

我还听说在最新的 flutter 更新中,他们把 flutter 应用的尺寸变得更小了。这里还有一个额外的问题: https://github.com/flutter/flutter/issues/16833

您可以使用 android 工作室中的 apk 分析器来查看是什么原因导致应用程序的大小如此之大。

  • 在拥有大型和多个映像资产的情况下,您可能希望使用 SVG 而不是 PNG。
  • Where you have to use PNGs or JPGs, you should compress them.
  • 您可能还希望使用 Cached _ network _ image并从一些外部服务(如 Firebase)调用映像。这将载入图像从互联网上第一次启动,并缓存到您的应用程序。您可以在 pub.dev 上查看 Cached _ network _ image
  • 对于你的字体,你应该使用 谷歌字体而不是绑定到你的应用程序的字体文件。您可以在 pub.dev 上查看 谷歌字体
  • 您还应该缩小资源并将 minifyEnable 设置为 true 在/android/app 中的 build.gradle。
  • 要上传到 playstore,你应该生成并上传一个应用程序 bundle instead.

您可以按照这个阅读,减少您的颤动应用程序的大小。其中一些建议也适用于本地 android 开发。减小颤振应用程序大小

对于 调试 apk以下是优化步骤-

  1. 使用 Android studio的构建工具中的 Analyze APK或者通过解压缩手动分析 对 apk 进行分析。

  2. 在我的例子中,最大的文件夹是 Lib,它包含4个不同的文件夹,分别命名为 arm64-v8aarmeabi-v7ax86x86_64

  3. 所以这四个文件夹基本上是不同的 处理器架构移动设备

    ARM: 这首先是一个移动处理器架构,也是现在大多数手机运行的架构。高通(Qualcomm)的 Snapdragon、三星(Samsung)的 Exynos 和联发科(MediaTek)的移动芯片都是 ARM 处理器的例子。大多数现代芯片都是64位或 ARM64。

    X86: 这是 Intel 芯片的体系结构规范。尽管英特尔在计算机市场占据主导地位,但这些芯片在 Android 手机中却远不常见。X86 _ 64指的是64位 Intel 芯片。*

  4. 在找到所需的 apk 之后,现在可以使用以下命令基于这些处理器体系结构分割 apk flutter build apk --debug --split-per-abi

  5. 最后检查 Build/app/output/apk/debug/app-arm64-v8a-debug. apk(在这里用您的选择替换)文件夹,以获得您想要的和减少 apk。

添加包含以下代码的 Proguard文件

-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.**  { *; }

注意: 如果 Proguard文件不存在,那么需要在该位置创建

/android/app/proguard-rules.pro

使用以下命令来分析哪一个占用了应用程序的大部分空间。

对于 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

对于 Android 的 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

For iOS:

flutter build ios --analyze-size

对于 Linux:

flutter build linux --analyze-size

For macOS

flutter build macos --analyze-size

适用于视窗

flutter build windows --analyze-size

This includes native code, assets, and even a package-level breakdown of compiled Dart code.


DevTools

如果你想看到它的可视化表示,使用 DevTools:

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

然后你会被引导到你的浏览器,在那里你会看到这样的东西:

enter image description here

There are many possibilities:

首先 ,使用以下命令在 release mode中构建应用程序:

在你的终端里: flutter build --release

or just specify the target :
对于 Android Apk : flutter build apk --release
对于 Android 应用程序包 : flutter build appbundle --release
对于 IOS : flutter build ios --release

默认情况下,flutter run编译为 调试模式 大型的应用程序。 调试模式(热重载,Dart Devtools 等)与 释放模式(简单应用程序)

默认为 释放模式构建 flutter build。所以你可以只做 flutter build

使用 --split-debug-info标志可以显著减少代码大小。

你还可以做一些其他的事情来使你的应用程序变得更小:

  • 删除未使用的资源
  • 尽量减少从库导入的资源
  • 压缩 PNG 和 JPEG 文件

您可以了解更多关于颤振应用程序大小 here

我由 flutter 设计的 apka 是47mb, Application app bundle -60mb.. After uploading bundle on play store size is11 to 20 mbenter image description here

我使用这个命令为生产阶段生成了发布的 apk:

flutter build apk --split-per-abi

输出 apk 位于项目文件夹中:

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

在我的例子中,apk 的大小减少到 5.3 MB(在执行上面的命令之后)。 之所以大(几乎 > 50MB) ,是因为它们包含了在热重启或重启期间可能需要的所有内容,这样就不会在代码稍有变化时再次构建整个系统。

发布版本是你所有代码的真正结果,他们是真正的小型应用程序没有任何容器,然后你可以在谷歌商店分发。

一个基本的 flutter“ Hello World”应用程序在 iOS 中大约是10mb,在 Android 中大约是4mb。由于运行时和 LICENSE 等等的原因,这不能再小了。

要使你的应用程序 apk 大小小(对于 android) :

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

可以混淆代码并从二进制文件中删除调试符号。

flutter build apk --obfuscate --split-debug-info=/<project-name>/<directory>

Replace "apk" with "ipa" for iOS, and "appbundle" for Android before releasing the application.

举例来说。

flutter build appbundle --obfuscate --split-debug-info=symbols/

这将防止你的代码逆向工程,并删除调试符号,这将有助于减少应用程序的大小。

我看到我的应用程序大小减少了10% 左右,但这将取决于您的应用程序。

资料来源: https://flutter.dev/docs/deployment/obfuscate#obfuscating-your-app

Check this below steps it may help you to reduce app size (only Android), i have reduced my 48mb build to 14mb

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

第二步: android/app/build.gradle

Inside-> buildTypes-> release

minifyEnabled true
shrinkResources true
useProguard true

第三步:

快跑

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

或者

flutter build apk --split-per-abi

还有一些其他的优化技巧,

1. 形象资产

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

2. 图标

它推荐从材质图标或库比蒂诺图标类使用。您可以添加—— tree-晃动图标选项到 flutter build 命令中,以便从捆绑包中删除所有未使用的图标。这将潜在地保存您的应用程序的大小。(使用 svg 格式的图标)

3. 字体

如果我们使用更多的字体从本地资产类似的图像这些字体也将增加应用程序的大小。最好的解决方案是使用 google _ fonts 插件。这个插件会在使用时动态下载字体。

4. 动态应用程序发布

我们可以建立一个应用程序包,如果我们上传到 Playstore 或者我们可以分割的 apk 每 abi 分割的 apk 到 x64和 x86位代码。通过使用 Appbundle Google Play 的新应用服务模型,即动态交付,使用您的应用包为每个用户的设备配置生成和服务优化的 APK,所以他们只下载运行您的应用所需的代码和资源。

Refer below links for more understanding,

  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

DR: 使用命令 flutter build apk --split-per-abi

在运行 flutter build apk --release之后,我的 APK 大小是16.2 MB。这个 APK 称为 FAT APK,它是一个单一的 APK,包含嵌入在其中的多个 ABI 的二进制文件,并支持多种体系结构。 使用 flutter build apk --split-per-abi,省道代码会导致3个 APK 文件,我的 app.APK 的大小减少到5.6 MB。

Here are the official docs explaining the same: https://docs.flutter.dev/deployment/android