Flutter 启动及环境配置

5,404 阅读3分钟

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命令核心功能包括以下几部分:

  1. flutter build apk:通过gradle来构建APK,由以下两部分组成:
  • flutter build aot,分为如下两个核心过程,该过程详情见下一篇文章
  • frontend_server前端编译器生成kernel文件
  • gen_snapshot来编译成AOT产物 - flutter build bundle,将相关文件放入flutter_assets目录
  1. 通过adb install来安装APK
  2. 通过adb am start来启动应用

Flutter 环境配置

之前做后端开发的时候,不管是什么语言或者框架,都习惯根据不同环境加载不同的开发配置,比如本地开发的时候,加载 local.env 配置,部署开发环境的时候加载 develop.env 配置,通常通过一个环境变量来决定加载相应的配置。最近在开发一款 Flutter App,我也希望 App 在不同的环境中加载不同的配置文件,实现的方式如下,如有不妥还请指出。 首先在lib建立多个main.dart,比如main_local.dart表示本地开发运行时执行的入口文件,main_develop.dartmain.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 文件。