我在使用Java进行Android应用程序开发方面有丰富的经验。最近了解到了Flutter,所以我尝试基于官方教程创建了一个简单的Android应用程序。但是令人惊讶的是,调试应用程序大小为25MB,发布APK文件的大小超过7MB。与本地开发的Android应用程序相比,它确实更大。
是否有优化的方法?
似乎应用程序大小有最小限制,对于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团队在这里确认了这个问题。
这里有一个解释,引用了同样的话 -
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的开销大小是固定的。
使用以下命令来分析哪些内容占用了您的应用程序最多的空间。
对于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。为此,在运行上一个命令后运行:
flutter pub global run devtools --appSizeBase=apk-code-size-analysis_01.json
您将被引导至您的浏览器,届时您会看到类似下图的页面:
首先检查以下内容:
如果您有太多字体,则会严重影响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
当然可以。使用Flutter构建的hello world应用程序生成的apk或ipa文件大小至少为7MB。这是因为Flutter在其构建输出中附带了核心引擎、框架、ICU数据、LICENSE文件等必要组件,这些都是Flutter应用程序运行所必需的。
您可以查看此处的常见问题解答,了解每个组件构建时占用的空间。
希望对您有所帮助!
我使用了这个命令来生成用于生产环境的发布版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 商店上分发。
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。以下是官方安卓文档,使我的应用程序从大约20 MB缩小到约9 MB
尝试Proguard建议
链接:https://developer.android.com/topic/performance/reduce-apk-size
请参考以下步骤,它们可能有助于您减小应用程序的大小(仅适用于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,因此他们只下载运行应用程序所需的代码和资源。
请参阅以下链接以了解更多信息:
react-native
或Ionic
应用程序小得多;-) - Top-Master