android - 如何测试和部署资产超过 150 MB 的 Flutter 应用?
问题描述
我的 Flutter 应用程序中的资产总共约为 300 MB(大量媒体文件,这是应用程序的精髓,不能明智地削减)。
据我了解,有两种方法可以将应用程序上传到 Play 商店:
- 包含适用于所有平台的二进制文件的 APK 文件(旧版)。看起来APK 限制为 100 MB。
- 一个 App Bundle(新),它可以让 Play Store 找出哪些位在哪里部署。App Bundle对用户实际下载的内容有 150 MB 的限制。
对于 APK,解决此限制的方法是APK 扩展文件(通常是“obb”文件),最大可达 2 GB。我可以尝试让它与 Flutter 一起使用,但 APK 交付方法有些过时,并且还有其他缺点,例如使用未使用的二进制文件使安装大小膨胀。所以我宁愿不使用这种方法。
对于 App Bundle,类似的机制以动态资产交付的形式存在。根据用户下载资产包的时间,共有三个选项:安装期间、安装后或按需下载。该install-time
选项听起来最透明和最简单,并且限制为 1 GB,因此非常适合我的用例。
遗憾的是,Flutter还不支持动态资产交付。幸运的是,在使用install-time
交付时,这些资产似乎可以通过AssetManager
系统提供的常规类获得。起初我以为 Flutter 可以在不编写任何 Java/Kotlin 代码的情况下选择它们,但不,它使用自己的资产机制,而且除了访问AssetManager
. 所以我必须自己做一些跑腿工作才能与 Java 世界交互,但这听起来是可行的。
为了首先创建捆绑包,我遵循了这些步骤。现在如何运行应用程序?
flutter run
不会产生任何错误,但似乎没有安装资产包,因此在测试期间我的所有资产都丢失了。我怀疑它直接构建了一个 APK,而不是构建一个应用程序包然后从中创建一个 APK。而且因为 IntelliJ IDEA 似乎也调用flutter run
或类似的东西,我的调试器和其他 IDE 集成现在没用了。
flutter build appbundle
似乎工作并吐出一个.aab
文件。为了测试,大概我可以使用bundletool从中创建一个 APK 并安装它,但与 Flutter 通常的亚秒级热重载相比,这将是一个糟糕的开发体验。
这是一个死胡同吗?还有其他方法可以通过 Play 商店交付具有大量资产的应用程序吗?请注意,除非它提供免费和(几乎)无限流量,否则我对外部托管不感兴趣,因为这是一个非商业项目。
(在 iOS 的 App Store 上,限制似乎是 4 GB,没有问任何问题。谁?)
解决方案
对于部署,现在使用延迟组件(在 2021 年 3 月左右引入)支持这一点。 Flutter wiki 中的技术细节
使用延迟组件,您可以通过播放功能交付(尚无播放资产交付)分发大型资产。
在我看来,文档有点缺乏(尤其是对于仅使用功能来交付资产),但在深入研究源代码 + 反复试验后,我可以通过 Play 商店(给测试人员)分发具有 150MB+ 资产作为动态功能的应用程序。
对于测试,除了您提到的 bundletool 之外,我找不到其他方法。对我来说更糟糕的是,一些延迟组件 API 在 bundletool 构建的 apk 和 Play Store 构建的 apk 上的工作方式似乎不同,因此测试可能比看起来更加耗时和痛苦。
推荐阅读
- node.js - 将图标添加到项目材料表错误
- ssas - 多个度量的 MDX 计算
- amazon-web-services - AWS - 摆脱 Elastic Load Balancing
- python - TkDnD 错误:无法加载 tkdnd 库(_tkinter.TclError:找不到包 tkdnd)
- java - GRPC 连接状态何时发生变化?
- android - 'boolean java.io.File.exists()' 中的 java.lang.NullPointerException
- node.js - 在 Strapi 中更改 Google 提供商的重定向网址
- curl - 从管道向 gitlab-ci 合并请求发送消息
- python - Python:如何获取知道文件夹名称的文件夹的路径?
- android - 是否可以将初始文本添加到通知 RemoteInput(Android)?