Flutter判断区分Debug/Release/Profile模式

  • 发表于
  • flutter

 framework层已经有判断编译模式的代码了,我们直接拿来用就行.

packages/flutter/lib/src/foundation/constants.dart中有:复制成功dart

const bool kReleaseMode = bool.fromEnvironment('dart.vm.product', defaultValue: false);

const bool kProfileMode = bool.fromEnvironment('dart.vm.profile', defaultValue: false);

const bool kDebugMode = !kReleaseMode && !kProfileMode;

const bool kIsWeb = identical(0, 0.0);

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

使用dart.vm.product属性

dart

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

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

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

使用断言

dart

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

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

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

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

/// 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模式.因此得出下面完整的判断方案:

完整的方案

dart

/// 判断是否为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";
}
}