一。编程规范

  1. 删除无用代码、无用资源
  2. 优化、压缩资源文件
  3. 控制 widget build() 方法耗时
  4. 避免重复且耗时工作
  5. 避免返回庞大的 widget,尽量分拆成不同 widget,将 setState() 调用转移到 UI 实际需要更新的 widget 子树部分
  6. 尽量使用 ListView,而不是直接构建大量的子组件列表
  7. 对列表和网格懒加载,只构建可见部分
  8. 标准的 ListView 构造函数适用于短列表,会一次性构建所有列表项
  9. 对于长列表,需要用 ListView.builder 构造函数来创建,只在列表项滑入屏幕时去创建列表项
  10. 避免直接或间接地调用 saveLayer,如裁剪、阴影、透明度等,如果必需使用,对单独元素操作而非一组元素

包大小优化

Flutter 编译产物主要包含3个部分:Dart AOT 编译产物,Flutter 引擎编译产物,flutter_assets。
Dart AOT 编译产物

Android Debug 模式包含 vm_snapshot_data、isolate_snapshot_data、kernel_bloc.bin,snapshot 类似 jar 文件;Release 模式包含 libapp.so

iOS 包含 App.Framework 动态库和 app.so,App.Framework 动态库内部对应 Android 的 snapshot。

Dart AOT 编译产物可由 Flutter 的 Tree Shaking 机制优化,Release 阶段会自动裁剪不可达的 Dart 代码,类似 Android 的 Proguard,这块会随着业务代码量的增加而增加。

Flutter 引擎编译产物

即 Flutter 动态编译库,libflutter.so,由 Flutter 底层和 Dart 的 C++ 代码编译,这块取决于基于哪个 Flutter 的分支或版本编译。

资源文件

即 flutter_assets,包括图片、字体等,随着业务量的增加这块也会随之增大。

Flutter 编译产物优化
对于最终的产物,可将非必要产物(flutter_assets)和数据段(vm_snapshot_data,isolate_snapshot_data)移到动态包 patch.zip,通过动态下发,下载完解压后通过设置资源和数据段的各项路径,Flutter 在启动后会通过新路径加载这些产物。移除这些产物后,一般情况下 Flutter 相关的包大小可以减少50%以上。
除了动态下发,也可以将动态包直接内置在安装包内,相当于将这些产物进行压缩,这样包大小减少的效果就达不到动态下发的50%,但也有一定的优化。
该方案在首次使用时需要解压,牺牲首次的启动速度,或者在某个时间点提前解压。
风险点:下载失败,解压失败。
定制化编译 Flutter 引擎,裁剪特定无用功能,需要基于稳定版本,升级有风险和成本。
在这里插入图片描述

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐