Flutter 性能优化问题点
一。编程规范删除无用代码、无用资源优化、压缩资源文件控制 widget build() 方法耗时避免重复且耗时工作避免返回庞大的 widget,尽量分拆成不同 widget,将 setState() 调用转移到 UI 实际需要更新的 widget 子树部分尽量使用 ListView,而不是直接构建大量的子组件列表对列表和网格懒加载,只构建可见部分标准的 ListView 构造函数适用于短列表,会一
一。编程规范
- 删除无用代码、无用资源
- 优化、压缩资源文件
- 控制 widget build() 方法耗时
- 避免重复且耗时工作
- 避免返回庞大的 widget,尽量分拆成不同 widget,将 setState() 调用转移到 UI 实际需要更新的 widget 子树部分
- 尽量使用 ListView,而不是直接构建大量的子组件列表
- 对列表和网格懒加载,只构建可见部分
- 标准的 ListView 构造函数适用于短列表,会一次性构建所有列表项
- 对于长列表,需要用 ListView.builder 构造函数来创建,只在列表项滑入屏幕时去创建列表项
- 避免直接或间接地调用 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 引擎,裁剪特定无用功能,需要基于稳定版本,升级有风险和成本。
更多推荐


所有评论(0)