Skip to content

flutter-jit-aot ​

1. 实验目标 ​

分别打 debug(JIT) 与 release(AOT) 包,对比产物与运行时行为(对应 docs/07-performance-testing-debug/13):

  • JIT(debug) :运行时编译 Dart,支持热重载(hot reload)/ 热重启(hot restart),启动慢、运行慢
  • AOT(release) :预编译为机器码(libapp.so),启动快、运行快、体积可控,但无热重载
  • 观察二者产物构成(snapshot vs libapp.so)、启动耗时、热重载差异

本实验给出构建命令与对比维度(见「7. 关键源码」);以构建脚本/命令形式给出,暂不并入 Flutter Host 的 lib 构建。

2. 工程要点 ​

  • debug 用 kernel snapshot + JIT,运行时 Dart VM 编译;release 用 gen_snapshot 提前编译为 libapp.so(AOT)
  • 热重载靠「增量 kernel 注入 + Widget 状态保留」;AOT 无法运行时改码,故 release 无热重载
  • 产物体积:release 的 libapp.so 经 tree-shaking + 压缩;debug 含整个 VM 与未优化代码

3. 运行方式 ​

bash
# debug(JIT)—— 支持热重载
flutter run --debug

# release(AOT)—— 无热重载,启动快
flutter run --release
# 或只构建产物
flutter build apk --release        # android/app/build/app/outputs/flutter-apk/app-release.apk
bash
# 产物对比:release 的 AOT 库
ls -lh build/app/intermediates/merged_native_libs/release/out/lib/arm64-v8a/libapp.so
# debug 的 JIT snapshot
ls -lh build/app/intermediates/flutter/debug/  # app.dill / kernel

4. 预期现象 ​

  • debug 启动明显慢于 release;release 首帧更快、滚动更跟手
  • debug 改代码后 r 热重载 <1s 生效且保留状态;release 改代码必须重新打包
  • release 的 libapp.so 体积远小于 debug 的 VM+snapshot 组合,且 tree-shaking 去掉了未用代码

5. 常见误区 ​

误区实际情况
性能测试用 debug 包debug 的 JIT/断言/Profile 模式不代表真实性能,必须 release 测
AOT 包也能热重载AOT 无法运行时编译,热重载仅限 debug/JIT
release 一定最小需配合 --split-debug-info + 混淆 + ABI 拆分才能控体积(见瘦身专题)

6. 对应知识库文档 ​

7. 关键源码 ​

  • 核心为构建命令对比(见「3. 运行方式」);关键差异总结:
text
模式       编译方式        热重载    启动    体积    适用
debug(JIT) 运行时编译       ✅       慢      大      开发
release(AOT) 预编译 libapp.so ❌      快      小      发布

接入状态 ​

✅ 已接入 Flutter 宿主 App:对应 JitAotDemoPage,从主页 → 「Flutter JIT / AOT 编译模式」进入。点「检测当前编译模式」即读取 kReleaseMode / dart.vm.product 等编译期常量推断模式。

站点构建时间:2026/8/24 23:43:17