https://github.com/flutter/flutter/issues/16833
https://flutter.cn/docs/perf/app-size

app 编译后产物分析

App.framework:

dart 动态链接库(代码 插件 package)
assets资源

Release下apk的:AOT

App:dart代码Aot编译产物 动态链接库 (线性递增)
flutter_assets:(图片 字体等)
isolate_snapshot_data
isolate_snapshot_instr
vm_snapshot_data
vm_snapshot_instr

Debug :JIT

flutter_assets:
isolate_snapshot_data
kernel_blob.bin
platform.dill
vm_snapshot_data

Flutter.framework

flutter:flutter 引擎 ,c++动态链接库
icudtl.dat 国际化支持相关

优化

基础优化

删除:无用资源 无用的导入
缩减:压缩图片资源
挪:动态下发。app bundle。
官方建议:

  • Remove unused resources
  • Minimize resource imported from libraries
  • Support a limited number of screen densities
  • Compress PNG and JPEG files

    动态下发

    flutter_assets,icudtl 动态下发
    dart 编译产物的分拆和下发:
    isolate_snapshot_data
    vm_snapshot_data
    其他文件由于ios无法标记内存可读 所以需要保留

方案受益

(空壳 app demo)
包体积缩减6.3M
变化(patch.zip):
App 动态库移除两个data段 9.2M变成3.8M 减少5.4M
flutter_assets:整体移除
icudill 整体移除 减少0.8M

预期:减少50%

内置压缩方案

应对纯flutter应用或者无法动态下发的场景(头条采用)
1 patch.zip 内置 首次启动解压
对比:包体积减少3.8M
2 牺牲首次启动速读

遗留:双架构问题(32/64位)

flutter打包参数优化:

android 和ios都使用os-z