Flutter-区分Debug,Release,Profile模式


Flutter中如果需要在Debug模式下输出一些信息,或者做一些特殊的逻辑,但是Release模式下又不需要的话,就需要可以判断当前的APK或者ipa是否为debug模式.这里有两种方式可以用来判断:

使用dart.vm.product属性

/// 是否为Release模式
const bool isReleaseMode = const bool.fromEnvironment("dart.vm.product");

如果dart.vm.product属性值为true,则为Release模式,否则不是Release模式.

但是这种方式不能用来区分Debug和Profile模式.

使用断言

/// 判断是否为Debug模式
bool isDebug() {
  bool inDebug = false;
  assert(inDebug = true);
  return inDebug;
}

Debug模式下,是可以使用断言功能的,但是Profile和Release包下,断言被禁用了,因此可以用来判断是否为Debug模式.

但是不能用于区分Profile模式和Release模式.

既然上面两种方法都没法区分profile模式,因此大概看了下源码:

/// List the preconfigured build options for a given build mode.
List<String> buildModeOptions(BuildMode mode) {
  switch (mode) {
    case BuildMode.debug:
      return <String>[
        '-Ddart.vm.profile=false',
        '-Ddart.vm.product=false',
        '--bytecode-options=source-positions,local-var-info,debugger-stops,instance-field-initializers,keep-unreachable-code,avoid-closure-call-instructions',
        '--enable-asserts',
      ];
    case BuildMode.profile:
      return <String>[
        '-Ddart.vm.profile=true',
        '-Ddart.vm.product=false',
        '--bytecode-options=source-positions',
      ];
    case BuildMode.release:
      return <String>[
        '-Ddart.vm.profile=false',
        '-Ddart.vm.product=true',
        '--bytecode-options=source-positions',
      ];
  }
  throw Exception('Unknown BuildMode: $mode');
}

从上面的代码可以看出来,我们可以使用dart.vm.profile来判断是否为profile模式.因此得出下面完整的判断方案:

完整的方案

/// 判断是否为Debug模式
bool isDebug() {
  bool inDebug = false;
  assert(inDebug = true);
  return inDebug;
}

/// 判断编译模式
String getCompileMode() {
  const bool isProfile = const bool.fromEnvironment("dart.vm.profile");
  const bool isReleaseMode = const bool.fromEnvironment("dart.vm.product");
  if (isDebug()) {
    return "debug";
  } else if (isProfile) {
    return "profile";
  } else if (isReleaseMode) {
    return "release";
  } else {
    return "Unknown type";
  }
}

文章作者: 姜康
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 姜康 !
评论
  目录