Flutter开发中`flutter run`与`flutter build`命令的区别是什么
flutter run 与 flutter build 的核心差异 这两个命令看起来都是把Flutter代码构建成可运行的应用,本质上是面向完全不同的开发阶段设计的,核心区别可以从定位、行为、默认配置三个维度拆解:
核心定位
flutter run是开发调试专用命令:设计目标从来不是产出可分发的安装包,而是打通本地开发环境和设备上的应用进程,搭建支持快速迭代的调试工作流。flutter build是生产分发专用命令:设计目标是按照目标平台的上架、分发规范,编译生成可以直接给终端用户安装使用的正式包,产出物不绑定本地开发环境,不附带调试联动能力。
关键行为差异
- 编译模式完全不同
- 执行
flutter run时,默认采用JIT即时编译模式优化:编译速度极快,改完代码保存就能触发热重载,无需全量重编就能看到修改效果;同时会完整保留调试能力——比如断点调试、运行时性能面板、内存检测、详细的debug日志输出,甚至会自动开启开发场景需要的宽松权限(比如安卓默认允许明文网络流量,方便调试本地接口)。 - 执行
flutter build时,默认采用AOT提前编译模式优化:直接把Dart代码编译成目标平台的原生机器码,移除JIT运行时的额外开销,应用启动速度、运行流畅度、包体积都会比调试版本优化30%-50%;同时会默认关闭所有调试能力——不支持断点调试、自动过滤debug级别日志、收紧权限规则,完全适配终端用户的使用场景。
- 执行
- 产出物的流转逻辑不同
flutter run不会把编译生成的安装包单独留存到发布目录,编译完成的产物会直接被安装到当前连接的设备/模拟器上,和本地开发环境保持长连接:你触发的热重载指令、调试日志请求、性能数据采集,都会通过这个长连接直接同步到设备上的应用进程。flutter build不会主动向任何连接的设备安装应用,命令执行完成后只会把符合发布规范的安装包输出到项目的build/目录下,你需要手动取出包文件,用于测试分发、应用商店上架、用户推送。
- 默认校验逻辑不同
flutter run为了降低开发调试的门槛,会跳过绝大多数发布前的校验:比如默认用系统内置的debug签名给安卓包签名、iOS端默认允许用个人开发证书调试、不会自动裁剪冗余代码、不会做代码混淆。flutter build为了保证发布包的合规性和精简度,会做全量的发布前检查:比如校验安卓签名证书是否配置正确(没配正式签名会直接报错终止)、自动开启Tree Shaking移除未使用的代码、支持配置代码混淆逻辑、移除所有和调试相关的冗余依赖。
新手容易踩的误区
不要把
flutter run安装到设备上的调试包直接分发给用户用:这个包附带了完整的JIT编译器、调试埋点等冗余内容,体积通常比正式包大2-3倍,运行性能也更差,完全不适合生产场景。
也不要在日常调试的时候图省事用flutter build打个包手动安装:这种方式下你拿不到热重载能力,改一行代码就要等数分钟全量编译、手动安装,开发效率会极低。
内容的提问来源于stack exchange,提问作者Keisuke Nagakawa 永川 圭介
相关产品推荐
相关产品推荐

