【译】Flutter 延迟组件原理与自定义 【包体积优化 _ 动态化】(2)

上一篇文章中,我们从操作层面介绍了延迟组价是什么?已经该如何应用?本篇文章将会和大家一起探索延迟组件的更多技术细节。以及该如何自定义实现延迟加载功能。

简介

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 文件的「生命周期」。 <

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值