Flutter run 参数
通过前面会发现,flutter run后面可以跟不同的参数[arguments],具体有哪些参数如下所示:
arguments | 说明 |
–debug | 调试版本,这是默认模式 |
–profile | profile版本 |
–release | 发布版本 |
–target-platform | 指定app运行的目标平台,比如android-arm/android-arm64,iOS平台不可用 |
–target= | 主入口,默认值lib/main.dart |
–observatory-port | 指定observatory端口,默认为0(随机生成可用端口) |
–disable-service-auth-codes | 关闭observatory服务鉴权 |
–trace-startup | 跟踪应用启动/退出,并保存trace到文件 |
–trace-skia | 跟踪skia,用于调试GPU线程 |
–trace-systrace | 转为systrace,适用于Android/Fuchsia |
–dump-skp-on-shader-compilation | 转储触发着色器编译的skp,默认关闭 |
–verbose-system-logs | 包括来自flutter引擎的详细日志记录 |
–enable-software-rendering | 开启软件渲染,默认采用OpenGL或者Vulkan |
–skia-deterministic-rendering | 确定性采用skia渲染 |
–no-hot | 可关闭热重载,默认是开启 |
–start-paused | 应用启动后暂停 |
–local-engine-src-path | 指定本地引擎源码路径,比如xxx/engine/src |
–local-engine | 指定本地引擎类型,比如android_profile |
Flutter run 原理说明
flutter run过程涉及多个flutter相关命令,其包含关系如下所示:
flutter命令的整个过程位于目录flutter/packages/flutter_tools/,对于flutter run命令核心功能包括以下几部分:
- flutter build apk:通过gradle来构建APK,由以下两部分组成:
- flutter build aot,分为如下两个核心过程,该过程详情见下一篇文章
- frontend_server前端编译器生成kernel文件
- gen_snapshot来编译成AOT产物 - flutter build bundle,将相关文件放入flutter_assets目录
- 通过adb install来安装APK
- 通过adb am start来启动应用
Flutter 环境配置
之前做后端开发的时候,不管是什么语言或者框架,都习惯根据不同环境加载不同的开发配置,比如本地开发的时候,加载 local.env 配置,部署开发环境的时候加载 develop.env 配置,通常通过一个环境变量来决定加载相应的配置。最近在开发一款 Flutter App,我也希望 App 在不同的环境中加载不同的配置文件,实现的方式如下,如有不妥还请指出。 首先在lib
建立多个main.dart
,比如main_local.dart
表示本地开发运行时执行的入口文件,main_develop.dart
和main.dart
分别表示开发环境和生产环境:
lib/ ├── api/ ├── main.dart ├── main_develop.dart ├── main_local.dart ├── models/ ├── pages/ ├── utils/ └── widgets/
这样如果我们运行在本地开发,那么执行
flutter run -t lib/main_local.dart
那么如何在执行本地开发环境的时候来调用本地开发的配置呢?其实很简单,我来定义配置文件,比如utils/config.dart
enum Env { PROD, DEV, LOCAL, } class Config { static Env env; static String get apiHost { switch (env) { case Env.PROD: return "http://yuanxuxu.com"; case Env.DEV: return "http://develop.yuanxuxu.com"; case Env.LOCAL: default: return "http://local.yuanxuxu.com"; } } }
其中Env
就是一个环境变量,比如我们要获取 api 请求的地址,那么根据环境变量来获取不同的请求地址,接下来我们只要在运行的入口函数 main 中定义我们当前运行的环境变量,在main_local.dart
中定义:
import 'package:xxx/utils/config.dart'; void main() { Config.env = Env.LOCAL; //设定运行环境的环境变量 runApp(new MaterialApp( ... ));
本地开发环境的话我们就获取到[http://local.yuanxuxu.com](http://local.yuanxuxu.com/)
:
import 'package:xxx/utils/config.dart'; ... static request(String method, path, {Map<String, dynamic> data, header}) async { options.baseUrl = Config.apiHost; //这里获取到http://local.yuanxuxu.com ... return response; }
这样就是实现了不同环境对于获取不同的配置了,如果我们现在要编译打包一个 apk 文件用于分发到手机上用于测试预览使用,那么可以打包一个调用 develop 环境配置的 apk 文件:
flutter build apk -t lib/main_develop.dart
打包生产配置的安装包也是一样的,直接 build main.dart 文件。