BuildConfig.DEBUG是编译时常量吗?

问题描述

我正在尝试创建一个ProductionRelease编译时常量,以便R8可以在最终生产apk中省略我们的调试代码。我遇到了一个障碍,其中BuildConfig.DEBUG无法分配给const val

// MyApplication.kt

companion object {
        const val isDebug = BuildConfig.DEBUG
        const val isProductionRelease = BuildConfig.FLAVOR == "production" && !BuildConfig.DEBUG
}

const val initializer should be a constant value

进一步检查后,我发现BuildConfig.DEBUGBoolean.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...";
  ...
}

这里的问题是:

  1. 为什么不能为const val分配静态的最终布尔值?
  2. 为什么不能直接使用true | false生成BuildConfig.DEBUG,而必须通过parseBoolean函数进行解析?

解决方法

为什么不能为const val分配静态的最终布尔值?

static final变量在编译时未初始化。因此,我们无法将未初始化的值分配给const val

  1. 为什么不能直接使用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'
    }
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...