Flutter判断区分Debug/Release/Profile模式
- 发表于
- flutter
framework层已经有判断编译模式的代码了,我们直接拿来用就行.
在packages/flutter/lib/src/foundation/constants.dart
中有:复制成功dart
1 2 3 4 5 6 7 |
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
1 2 |
/// 是否为Release模式 const bool isReleaseMode = const bool.fromEnvironment("dart.vm.product"); |
如果dart.vm.product
属性值为true,则为Release模式,否则不是Release模式.
但是这种方式不能用来区分Debug和Profile模式.
使用断言
dart
1 2 3 4 5 6 |
/// 判断是否为Debug模式 bool isDebug() { bool inDebug = false; assert(inDebug = true); return inDebug; } |
Debug模式下,是可以使用断言功能的,但是Profile和Release包下,断言被禁用了,因此可以用来判断是否为Debug模式.
但是不能用于区分Profile模式和Release模式.
既然上面两种方法都没法区分profile模式,因此大概看了下源码:dart
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
/// 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/// 判断是否为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"; } } |
原文连接:Flutter判断区分Debug/Release/Profile模式
所有媒体,可在保留署名、
原文连接
的情况下转载,若非则不得使用我方内容。