问题描述
我正在尝试创建一个ProductionRelease
编译时常量,以便R8可以在最终生产apk中省略我们的调试代码。我遇到了一个障碍,其中BuildConfig.DEBUG
无法分配给const val
。
// MyApplication.kt
companion object {
const val isDebug = BuildConfig.DEBUG
const val isProductionRelease = BuildConfig.FLAVOR == "production" && !BuildConfig.DEBUG
}
进一步检查后,我发现BuildConfig.DEBUG
被Boolean.parseBoolean()
包装纸包裹了。
// BuildConfig.java
/**
* Automatically generated file. DO NOT MODIFY
*/
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "com...";
...
}
这里的问题是:
- 为什么不能为const val分配静态的最终布尔值?
- 为什么不能直接使用true | false生成BuildConfig.DEBUG,而必须通过
parseBoolean
函数进行解析?
解决方法
为什么不能为const val分配静态的最终布尔值?
static final
变量在编译时未初始化。因此,我们无法将未初始化的值分配给const val
。
在
- 为什么不能直接使用true | false生成BuildConfig.DEBUG,而必须通过parseBoolean函数进行解析?
BuildConfig
类中的布尔文字会在代码中使用它们时产生IDE警告(至少在Android Studio中)。 您可以在this link中查看更多详细信息。
您可以使用DEBUG
代替BUILD_TYPE
。
const val isDebug = BuildConfig.BUILD_TYPE == "debug"
const val isProductionRelease = BuildConfig.FLAVOR == "production" && !isDebug
或者您也可以在BuildConfig中添加新的常量作为布尔文字。
buildTypes {
debug {
buildConfigField 'boolean','DEBUG_CONST','true'
}
release {
buildConfigField 'boolean','false'
}
}