Appearance
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 用
kernelsnapshot + 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.apkbash
# 产物对比: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 / kernel4. 预期现象
- 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 等编译期常量推断模式。