上一篇文章中,我们从操作层面介绍了延迟组价是什么?已经该如何应用?本篇文章将会和大家一起探索延迟组件的更多技术细节。以及该如何自定义实现延迟加载功能。
简介
Flutter 支持构建在运行时下载额外 Dart 代码和静态资源的应用程序。这可以减少安装应用程序 apk 的大小,并在用户需要时下载功能和静态资源。
我们将每个独立的可下载的 Dart 库和静态资源称为「延迟组件」。此功能目前仅在 Android 可用,延迟组件中的代码不会影响其他平台,其他平台在初始安装时会正常构建包含所有延迟组件和资源的应用。
延迟加载仅在应用程序编译为 Release 或 Profile 模式 时可用。在 Debug 模式下,所有延迟组件都被视为常规导入,它们在启动时立即加载。因此,Debug 模式下仍然可以热重载。
Gallery 案例
Flutter Gallery 在 fully deferred Flutter gallery branch 分支,将其中所有的 demo 改为了延迟加载组件,对比未使用延迟加载的情况下,安装 Apk 文件的大小数据如下:
使用延迟组件:
- base-arm64_v8a.apk - 12,325,372 bytes
- base-master.apk - 37,889,309 bytes
- 安装包大小: 50,214,681 bytes
未使用延迟组件:
- base-arm64_v8a.apk - 12,521,900 bytes
- base-master.apk - 80,605,796 bytes
- 安装包大小: 93,127,696 bytes
我们可以看到编译后的代码大小(base-arm64_v8a.apk) 减少了约 200kB,初始包体积(base-master.apk)减少了约 43MB。总体而言,初始安装尺寸减少了46%。dart代码、资源文件等会被移动到单独的组件中,只有在需要时才会在运行时下载。安装了所有组件后应用的体积只比非延迟安装的应用仅多几 KB。
延迟组件的应用结构
延期的 Dart 库通过 gen_snapshot
(Dart编译器)生成「加载单元」,当以 profile 或者 release 模式构建的时候,每个加载单元输出为一个拆分的 AOT 共享库(.so
文件)。加载单元是代码中用 deferred 关键字引入库的最小的集合,可以从基础库中分离出来。
下图展示了使用延迟组件的应用程序结构,和延迟 dart 库被编译成加载单元并打包成 .aab
文件的「生命周期」。 <