颤动的应用程序太大了

时间:2018-03-02 08:03:23

标签: java android dart flutter

我在使用java的Android应用程序开发方面有很好的经验。最近我开始了解扑扑。因此,我尝试使用基于官方tutorial的flutter创建一个简单的Android应用程序。但令人惊讶的是,调试应用程序大小为25MB,发布apk的成本超过7MB。与原生开发的Android应用程序相比,它真的更大。

有没有办法优化它?

16 个答案:

答案 0 :(得分:16)

Flutter团队承认here

对此here有一个解释,引用相同的 -

  

2018年8月,我们测量了一个最小的Flutter应用程序的大小(没有   Material Components,只是一个中心窗口小部件,使用颤振构建   构建apk),捆绑和压缩作为发布APK,是   大约4.7MB。

     

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

     

当然,YMMV,我们建议您测量自己的应用程序   运行flutter build apk并查看   建立/应用/输出/ APK /释放/ APP-release.apk。

此外,对于较大的应用,apk大小的相对差异可能会更小。 Flutter的开销大小是固定的

答案 1 :(得分:9)

首先检查以下内容:

  • 正如提到的其他答案一样,删除所有不必要的资产(图像,字体 和文件)。

如果您有太多会严重影响apk大小的字体,而flutter也为此创建了一个解决方案,方法是为您创建一个可从Google字体库中获取字体的软件包(该软件包可让您访问这么多的字体和灵活性在任何地方使用)。获取the package hereRead more here

  • 删除不需要的不需要的软件包/插件(影响不大) 虽然)。

  • 删除未使用的资源

  • 最小化从库导入的资源

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

  • 压缩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

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

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标志会导致包含以下内容的胖APK: 您为所有目标ABI编译的代码。这样的APK在 大小超过拆分后的对应内容,导致用户下载 不适用于其设备架构的本机二进制文件

read more here

我还在某处听说,在最新的flutter更新中,它们使flutter应用程序的尺寸变得更小。还有一个附加的问题:https://github.com/flutter/flutter/issues/16833

答案 2 :(得分:8)

是的,对于一个hello world app,用flutter构建的apk或ipa的大小最小为〜7mb。这是因为,flutter发布了一个核心引擎,框架,ICU数据,LICENSE文件等及其构建输出,这对于一个颤动的应用程序来说是必须的。

您可以查看常见问题解答here,详细了解构建时需要多大的内容。

希望有所帮助!

答案 3 :(得分:5)

减少应用大小的一种方法是使用;

flutter clean

在运行构建命令之前;

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

当我运行不带clean命令的build命令时,我的内存约为32mb,但是如果我先运行clean命令,则我的内存约为18mb

答案 4 :(得分:1)

所有这种跨平台应用程序从一开始就比较大 我确实使用react-native和hello-world app大约6 MB左右 所有你能做的就是制作一个两个版本的apk,一个用于arm cpu,一个用于x86 cpu,这样你可以降低大小约4 MB但是永远不会像android一样小

根据谷歌

  

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


点击此处查看更多信息https://developer.android.com/studio/build/configure-apk-splits.html

更新:如果我现在没有完全支持它,将来肯定会,在这个方法的每个阶段都会有效,但测试版本不会太多,但这种方法可以更好地发布更多版本的颤动

答案 5 :(得分:1)

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

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

对于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代码的程序包级细分。

答案 6 :(得分:0)

由于颤动这是正常现象,因为需要额外的文件,在我的android go设备中,颤动新项目中的默认应用仅占用了60mbs,从这个意义上讲,我认为在Android Go设备上花费更多。

答案 7 :(得分:0)

调试时,我也遇到了这种非常APK的情况,而在7-8 mb左右的版本中。但是,这可以在更大的应用程序中看到,就本机而言,我们需要导入许多库,而使用Flutter可以优化工作。因此,如果我们假设一个应用程序在本机上应与Flutter重约30mb,那么它应该是相似的。最基本的应用程序会让您感到恐惧。但是重要的是优化图像

答案 8 :(得分:0)

这是使我的应用程序正常运行的Android官方文档 从〜20mb 到〜9mb

尝试 Proguard 建议

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

Before and After using ProGuard and more enter image description here

答案 9 :(得分:0)

您可以在android studio中使用apk分析器来查看导致应用程序大小如此之大的原因。

  • 在拥有大量图像资源的情况下,您可能希望使用SVG而不是PNG。
  • 在必须使用PNG或JPG的地方,应将其压缩。
  • 您可能还想使用 cached_network_image 并从某些外部服务(如Firebase)中调用该图像。这将在首次启动时从互联网加载图像,并将其缓存到您的应用中。您可以在pub.dev上检出 cached_network_image
  • 对于字体,您应该使用 google字体,而不是将字体文件绑定到您的应用。您可以在pub.dev上签出 google字体
  • 您还应该缩减资源,并在您的服务器中将minifyEnable设置为true 在/ android / app中build.gradle。
  • 要上传到Playstore,您应该生成并上传一个应用 而是捆绑。

您可以按照以下阅读内容来减小Flutter应用程序的大小。一些建议也适用于本机android开发。 Reducing flutter app size

答案 10 :(得分:0)

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

    使用
  1. 分析,使用Analyze APK的构建工具中的Android studio或通过解压缩zip手动获取apk。

  2. 在我看来,最大的文件夹是 lib ,其中包含4个名为arm64-v8aarmeabi-v7ax86x86_64的不同文件夹

  3. 因此这四个文件夹基本上都是移动设备的处理器体系结构。因此,为了弄清楚您的设备属于哪个类别,下面是一些示例-

    ARM:这首先是一种移动处理器架构,现在大多数手机都在运行。高通的骁龙,三星的Exynos和联发科的移动芯片都是ARM处理器的例子。大多数现代芯片都是64位或ARM64。

    x86:这是英特尔芯片的体系结构规范。与英特尔在计算机市场上的主导地位一样,这些芯片在Android手机中的普及程度要低得多。 x86_64是指64位Intel芯片。*

  4. 找到所需/所需的apk后,您现在可以使用以下命令根据这些处理器体系结构拆分apk flutter构建apk --debug --split-per-abi

  5. 最后检查 build / app / outputs / apk / debug / app-arm64-v8a-debug.apk (在此处替换为您选择的)文件夹,以获取所需的内容并减少内容apk。

答案 11 :(得分:0)

添加包含以下代码的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

答案 12 :(得分:0)

要记录在寻求较小的APK / IPA尺寸方面的最新成就:

  • flutter/engine#5784 flutter / engine#5784在发布模式下从已编译的Dart代码中删除了Dart的VM服务:

    将Android上的dart代码快照(包含框架+应用程序代码)减少了1.5MB(未压缩)

    将整体发布APK的大小减少了475KB(压缩)

  • flutter/engine#5922将Flutter切换到新的最小ICU数据配置:

    与APKs / IPA捆绑在一起的ICU数据大小减少了5.1MB(未压缩)

    将发行版APK的整体大小减少了1.6MB(压缩)

通过这些改进,整体发布的APK现在缩小了2MB。这将minimal Flutter app的发行版APK大小减小到4.7MB(以前是6.7MB)。

在IPA的iOS上也可以看到类似的尺寸减小,但是由于Apple的加密和上传到App Store的IPA的App Thinning流程,很难记录准确的数字。

9月28日更新:App Store Connect针对iPhone X的报告称,这些更改使发行IPA下载大小减少了3.8MB,iOS上最小的Flutter应用现在已降至12.6MB。

有关更多信息,请参见https://github.com/flutter/flutter/issues/16833

答案 13 :(得分:0)

有很多可能性:

首先,在发布模式下使用:

构建您的应用程序

在您的终端中: flutter build --release

或者只是指定目标:
Android Apkflutter build apk --release
对于 Android App Bundleflutter build appbundle --release
IOSflutter build ios --release

<块引用>

默认情况下,flutter run 编译为调试模式。这解释了 应用程序的大尺寸。 调试模式(热重载、Dart Devtools 等)与发布模式(简单应用程序)

<块引用>

默认情况下 flutter build发布模式 构建。所以你可以只做 flutter build

使用 --split-debug-info 标志可以显着减少代码大小。有关使用此标志的示例,请参阅 Obfuscating Dart code

您可以采取的其他一些措施使您的应用更小:

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

您可以了解有关 Flutter 应用大小的更多信息 here

答案 14 :(得分:0)

我已使用此命令为生产阶段生成已发布的 apk:

flutter build apk --split-per-abi

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

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

在我的情况下,apk 的大小减少到 5.3 MB(在执行上述命令之后)。 大尺寸的原因(几乎 > 50 MB),因为它们包含您在热重启或重启期间可能需要的一切,这会在您对代码进行少量更改时阻止再次构建整个系统。 >

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

答案 15 :(得分:-1)

我通过 flutter 构建的 apka 大小为 47mb, 应用程序包 -60mb.. 在 Play 商店上传捆绑包后,大小为 11 到 20 mbenter image description here